From ef7fc2f2c06ad75fe7fbabf28d427561ae7b007d Mon Sep 17 00:00:00 2001 From: Andrius Solopovas Date: Sat, 30 Sep 2023 23:54:11 +0100 Subject: [PATCH] [Fix] `nvm_get_arch`: proper value for alpine linux --- .github/workflows/windows-npm.yml | 44 ++++++++- nvm.sh | 4 + test/fast/Unit tests/nvm_get_arch_unofficial | 94 ++++++++++++++++++++ 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100755 test/fast/Unit tests/nvm_get_arch_unofficial diff --git a/.github/workflows/windows-npm.yml b/.github/workflows/windows-npm.yml index 4ab3d58..08bdac4 100644 --- a/.github/workflows/windows-npm.yml +++ b/.github/workflows/windows-npm.yml @@ -126,9 +126,6 @@ jobs: distribution: ${{ matrix.wsl-distrib }} additional-packages: bash git curl ca-certificates wget - name: Retrieve nvm on WSL - env: - C: /usr/bin/gcc-8 - CXX: /usr/bin/g++-8 run: | if [ -z "${{ matrix.method }}" ]; then curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash @@ -139,6 +136,47 @@ jobs: nvm install ${{ matrix.npm-node-version }} node -v + wsl_matrix_unofficial: + name: 'WSL nvm install' + defaults: + run: + shell: wsl-bash {0} + runs-on: windows-latest + env: + WSLENV: NVM_INSTALL_GITHUB_REPO:NVM_INSTALL_VERSION:/p + NVM_NODEJS_ORG_MIRROR: https://unofficial-builds.nodejs.org/download/release + strategy: + fail-fast: false + matrix: + wsl-distrib: + - Alpine + npm-node-version: + - '--lts' + - '21' + - '18' + - '16' + - '14' + - '12' + - '11' + - '10' + method: + - '' + - 'script' + steps: + - uses: Vampire/setup-wsl@v2 + with: + distribution: ${{ matrix.wsl-distrib }} + additional-packages: bash git curl ca-certificates wget + - name: Retrieve nvm on WSL + run: | + if [ -z "${{ matrix.method }}" ]; then + curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash + else + curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | METHOD="${{matrix.method}}" bash + fi + . "$HOME/.nvm/nvm.sh" + NVM_NODEJS_ORG_MIRROR=${{ env.NVM_NODEJS_ORG_MIRROR }} nvm install ${{ matrix.npm-node-version }} + nvm_windows: name: 'tests, on windows' permissions: diff --git a/nvm.sh b/nvm.sh index faee829..9319521 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1965,6 +1965,10 @@ nvm_get_arch() { HOST_ARCH=armv7l fi + if [ -f "/etc/alpine-release" ]; then + NVM_ARCH=x64-musl + fi + nvm_echo "${NVM_ARCH}" } diff --git a/test/fast/Unit tests/nvm_get_arch_unofficial b/test/fast/Unit tests/nvm_get_arch_unofficial new file mode 100755 index 0000000..12c5da0 --- /dev/null +++ b/test/fast/Unit tests/nvm_get_arch_unofficial @@ -0,0 +1,94 @@ +#!/bin/sh + +# Save the PATH as it was when the test started to restore it when it finishes +ORIG_PATH="${PATH}" + +cleanup() { + # Restore the PATH as it was when the test started + export PATH="${ORIG_PATH}" + rm -rf "${TMP_DIR}" +} + +die() { + cleanup + echo "$@" + exit 1 +} + +. ../../../nvm.sh + +# Sets the PATH for these tests to include the symlinks to the mocked binaries +export PATH=".:${PATH}" + +TMP_DIR=$(mktemp -d) +CHROOT_WITH_ALPINE="$TMP_DIR/with_alpine" +CHROOT_WITHOUT_ALPINE="$TMP_DIR/without_alpine" + +setup_chroot() { + chroot_dir=$1 + + # Directories + mkdir -p "${chroot_dir}/etc" + mkdir -p "${chroot_dir}/bin" + mkdir -p "${chroot_dir}/usr/bin" + mkdir -p "${chroot_dir}/lib64" + mkdir -p "${chroot_dir}/dev" + + # Files and binaries + cp ../../../nvm.sh "${chroot_dir}/" + cp /bin/sh /usr/bin/dirname "${chroot_dir}/bin/" + [ "${chroot_dir}" = "${CHROOT_WITH_ALPINE}" ] && touch "${chroot_dir}/etc/alpine-release" + + # Libraries + for binary in /bin/sh /usr/bin/dirname; do + for lib in $(ldd $binary | awk '{print $3}' | grep "^/"); do + dir=$(dirname "${lib}") + mkdir -p "${chroot_dir}${dir}" + cp "${lib}" "${chroot_dir}${dir}/" + done + done + + # Dynamic linker + cp /lib64/ld-linux-x86-64.so.2 "${chroot_dir}/lib64/" + + # /dev/null + sudo mknod "${chroot_dir}/dev/null" c 1 3 +} + +setup_chroot "${CHROOT_WITH_ALPINE}" +setup_chroot "${CHROOT_WITHOUT_ALPINE}" + +# Run tests in chroot environments +ARCH_WITH_ALPINE=$(sudo chroot "${CHROOT_WITH_ALPINE}" /bin/sh -c ". ./nvm.sh && nvm_get_arch") +[ "${ARCH_WITH_ALPINE}" = "x64-musl" ] || die "Expected x64-musl for alpine environment but got ${ARCH_WITH_ALPINE}" + +ARCH_WITHOUT_ALPINE=$(sudo chroot "${CHROOT_WITHOUT_ALPINE}" /bin/sh -c ". ./nvm.sh && nvm_get_arch") +[ "${ARCH_WITHOUT_ALPINE}" != "x64-musl" ] || die "Did not expect x64-musl for non-alpine environment" + +# Run tests for nvm ls-remote +test_default_ls_remote() { + mock_response='N/A' + result=$(NVM_NODEJS_ORG_MIRROR='http://nonexistent-url' nvm ls-remote 18) + if [ "${result}" = "${mock_response}" ]; then + die "Test failed: Expected '${mock_response}' for but got '${result}'" + else + echo "Test passed" + fi +} + +test_unofficial_mirror_ls_remote() { + mock_response='v18.18.0 (LTS: Hydrogen)' + result=$(NVM_NODEJS_ORG_MIRROR='https://unofficial-builds.nodejs.org/download/release' nvm ls-remote 18.18.0 | sed -e 's/^[[:space:]]*//') + result=$(echo "${result}" | sed 's/\x1b\[[0-9;]*m//g') + + if [ "${result}" = "${mock_response}" ]; then + echo "Test passed" + else + die "Test failed: Expected '${mock_response}' but got '${result}'" + fi +} + +test_default_ls_remote +test_unofficial_mirror_ls_remote + +cleanup