jetify-com / devbox

Instant, easy, and predictable development environments
https://www.jetify.com/devbox/
Apache License 2.0
7.94k stars 191 forks source link

Devbox does not install nix #2008

Closed dudicoco closed 2 months ago

dudicoco commented 2 months ago

What happened?

According to the docs devbox should install nix if it is not detected by the system, however it does not.

Looking at the script there is no part which installs nix.

I could not find the source code for the script in this repository to check some commit has removed this functionality and the readme is just not up to date.

Steps to reproduce

.

Command

No response

devbox.json

No response

Devbox version

0.10.5

Nix version

No response

What system does this bug occur on?

macOS (Intel)

Debug logs

installation script:

#!/bin/bash
#
# Install script
#
# Downloads and installs a binary from the given url.

set -euo pipefail

# ========================
# Customize install script
# ========================

# This script is published at get.jetify.com/devbox so users can install via:
# curl -fsSL https://get.jetify.com/devbox | bash

readonly INSTALL_DIR="/usr/local/bin"
readonly BIN="devbox"
readonly DOWNLOAD_URL="https://releases.jetify.com/devbox"

readonly TITLE="Devbox 📦 by Jetify"
readonly DESCRIPTION=$(
    cat <<EOF
  Instant, easy and predictable development environments.

  This script downloads and installs the latest devbox binary.
EOF
)
readonly DOCS_URL="https://github.com/jetify-com/devbox"
readonly COMMUNITY_URL="https://discord.gg/jetify"

# ====================
# flags.sh
# ====================
FORCE="${FORCE:-0}"

parse_flags() {
    while [ "$#" -gt 0 ]; do
        case "$1" in
        -f | --force)
            FORCE=1
            shift 1
            ;;
        *)
            error "Unknown option: $1"
            exit 1
            ;;
        esac
    done
}

# ====================
# format.sh
# ====================

readonly BOLD="$(tput bold 2>/dev/null || echo '')"
readonly GREY="$(tput setaf 8 2>/dev/null || echo '')"
readonly UNDERLINE="$(tput smul 2>/dev/null || echo '')"
readonly RED="$(tput setaf 1 2>/dev/null || echo '')"
readonly GREEN="$(tput setaf 2 2>/dev/null || echo '')"
readonly YELLOW="$(tput setaf 3 2>/dev/null || echo '')"
readonly BLUE="$(tput setaf 4 2>/dev/null || echo '')"
readonly MAGENTA="$(tput setaf 5 2>/dev/null || echo '')"
readonly CYAN="$(tput setaf 6 2>/dev/null || echo '')"
readonly NO_COLOR="$(tput sgr0 2>/dev/null || echo '')"
readonly CLEAR_LAST_MSG="\033[1F\033[0K"

title() {
    local -r text="$*"
    printf "%s\n" "${BOLD}${MAGENTA}${text}${NO_COLOR}"
}

header() {
    local -r text="$*"
    printf "%s\n" "${BOLD}${text}${NO_COLOR}"
}

plain() {
    local -r text="$*"
    printf "%s\n" "${text}"
}

info() {
    local -r text="$*"
    printf "%s\n" "${BOLD}${GREY}→${NO_COLOR} ${text}"
}

warn() {
    local -r text="$*"
    printf "%s\n" "${YELLOW}! $*${NO_COLOR}"
}

error() {
    local -r text="$*"
    printf "%s\n" "${RED}✘ ${text}${NO_COLOR}" >&2
}

success() {
    local -r text="$*"
    printf "%s\n" "${GREEN}✓${NO_COLOR} ${text}"
}

start_task() {
    local -r text="$*"
    printf "%s\n" "${BOLD}${GREY}→${NO_COLOR} ${text}..."
}

end_task() {
    local -r text="$*"
    printf "${CLEAR_LAST_MSG}%s\n" "${GREEN}✓${NO_COLOR} ${text}... [DONE]"
}

fail_task() {
    local -r text="$*"
    printf "${CLEAR_LAST_MSG}%s\n" "${RED}✘ ${text}... [FAILED]${NO_COLOR}" >&2
}

confirm() {
    if [ ${FORCE-} -ne 1 ]; then
        printf "%s " "${MAGENTA}?${NO_COLOR} $* ${BOLD}[Y/n]${NO_COLOR}"
        set +e
        read -r yn </dev/tty
        rc=$?
        set -e
        if [ $rc -ne 0 ]; then
            error "Error reading from prompt (re-run with '-f' flag to auto select Yes if running in a script)"
            exit 1
        fi
        if [ "$yn" != "y" ] && [ "$yn" != "Y" ] && [ "$yn" != "yes" ] && [ "$yn" != "" ]; then
            error 'Aborting (please answer "yes" to continue)'
            exit 1
        fi
    fi
}

delay() {
    sleep 0.3
}

# =========
# util.sh
# =========
has() {
    command -v "$1" 1>/dev/null 2>&1
}

download() {
    local -r url="$1"
    local -r file="$2"
    local cmd=""

    if has curl; then
        cmd="curl --fail --silent --location --output $file $url"
    elif has wget; then
        cmd="wget --quiet --output-document=$file $url"
    elif has fetch; then
        cmd="fetch --quiet --output=$file $url"
    else
        error "No program to download files found. Please install one of: curl, wget, fetch"
        error "Exiting..."
        return 1
    fi

    if [[ ${3:-} == "--fail" ]]; then
        $cmd && return 0 || rc=$?
        error "Command failed (exit code $rc): ${BLUE}${cmd}${NO_COLOR}"
        exit $rc
    fi

    $cmd && return 0 || rc=$?
    return $rc
}

# ==============
# Implementation
# ==============
intro_msg() {
    title "${TITLE}"
    plain "${DESCRIPTION}"
    printf "\n"
    header "Confirm Installation Details"
    plain "  Location:     ${GREEN}${INSTALL_DIR}/${BIN}${NO_COLOR}"
    plain "  Download URL: ${UNDERLINE}${BLUE}${DOWNLOAD_URL}${NO_COLOR}"
    printf "\n"
}

install_flow() {
    confirm "Install ${GREEN}${BIN}${NO_COLOR} to ${GREEN}${INSTALL_DIR}${NO_COLOR} (requires sudo)?"
    printf "\n"
    header "Downloading and Installing"

    start_task "Downloading ${BIN} binary"
    local -r tmp_file=$(mktemp)
    download "${DOWNLOAD_URL}" "${tmp_file}" --fail
    delay
    end_task "Downloading ${BIN} binary"

    start_task "Installing in ${INSTALL_DIR}/${BIN} (requires sudo)"
    chmod +x "${tmp_file}"
    $(command -v sudo || true) bash -c "mkdir -p ${INSTALL_DIR} && mv ${tmp_file} ${INSTALL_DIR}/${BIN}"
    delay
    end_task "Installing in ${INSTALL_DIR}/${BIN}"
    delay

    success "${BOLD}Successfully installed ${GREEN}${BIN}${NO_COLOR}${BOLD}${NO_COLOR} 🚀"
    delay
    printf "\n"
}

next_steps_msg() {
    header "Next Steps"
    plain "  1. ${BOLD}Learn how to use ${BIN}${NO_COLOR}"
    plain "     ${GREY}Run ${CYAN}${BIN} help${GREY} or read the docs at ${UNDERLINE}${BLUE}${DOCS_URL}${NO_COLOR}"
    plain "  2. ${BOLD}Get help and give feedback${NO_COLOR}"
    plain "     ${GREY}Join our community at ${UNDERLINE}${BLUE}${COMMUNITY_URL}${NO_COLOR}"
}

main() {
    parse_flags "$@"
    intro_msg
    install_flow
    next_steps_msg
}

main "$@"
savil commented 2 months ago

That's odd. Here's the code where we'd check if nix is installed? https://github.com/jetify-com/devbox/blob/main/internal/boxcli/shell.go#L34

Was nix previously installed on your system? If so, is it possible that /nix is present or the nix binary was still accessible in your CLI environment?

dudicoco commented 2 months ago

Thanks for the reply @savil.

I was under the impression that the devbox installer takes care of the nix installation, thanks for clarifying that the devbox binary actually does that.