mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-09-12 00:01:44 +08:00
The Ubuntu entries were pinned but `Debian` and `Alpine` were floating aliases, so what those jobs tested drifted whenever the action updated. Every line now carries a pin and the newest release setup-wsl offers for it: Debian 12 and 13, Ubuntu 18.04, 20.04 and 24.04, Alpine 3.17 and 3.23. `Alpine-3.17` is the image the unofficial jobs already ran, named explicitly. Debian's pin is 12 rather than 11 because `Debian` and `Debian-11` share a floating `aka.ms/wsl-debian-gnulinux` redirect and so cannot be held still at all, where `Debian-12` is an immutable salsa.debian.org artifact. The Debian-only steps key off `startsWith`, so both Debian entries take the same path and moving a pin will not strand them. There is no floating "newest" name to use instead: `kali-linux` is the only unversioned distribution left, and setup-wsl's own CI disables `additional-packages` on it. The newest only moves when the action's major does, so the `uses:` ref is the thing to keep current. Which is the other half of this: move that ref from v6 to v7. v6 is a dead major, five months stale at v6.1.0 with no v6.2.0 and v7.0.0 tagged the next day, so new distributions will only ever appear on v7 and later. v7's only removals are the deprecated bare `Debian` and `Alpine`, which pinning has already stopped using, and every name here is valid on both. It also drops the Node.js 20 deprecation warning each WSL job currently emits, and it tightens two pins that v6 left floating: Ubuntu 20.04 moves from `aka.ms/wslubuntu2004` to a 20.04.6 image on releases.ubuntu.com, and 24.04 to a 24.04.4 one. Six of the seven platforms are now immutable artifacts; Ubuntu 18.04 predates the format and still redirects through aka.ms. Choosing a supported Debian also settles the 404s that had been failing every Debian job: bullseye left LTS on 2026-08-31 and its security suite is between homes, with `security.debian.org` still publishing an index whose pool is being pruned and `archive.debian.org` carrying no `debian-security` for bullseye yet. bookworm is on live mirrors, so `ca-certificates` is current again, which matters for a job whose whole purpose is to fetch nvm and node over TLS. To keep a pin working once its release ages out in turn, derive sources.list from the image's own codename and list every layout a release passes through: main and security move to the archive on separate schedules, and the security suite is renamed to `<codename>/updates` on the way. `apt-get update` discards whichever entries 404, and where an index outlives its pool we fall back once to main alone. Debian 13 moved to deb822, so clear both formats first and leave what we write as the only thing apt reads. Drop the blanket `apt-get upgrade` with it: it fetched 77 packages the test never uses, and `apt-get install` already takes the newest version any working mirror offers.
282 lines
9.9 KiB
YAML
282 lines
9.9 KiB
YAML
name: 'Tests on Windows: `nvm install`'
|
|
|
|
on: [pull_request, push]
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
NVM_INSTALL_GITHUB_REPO: ${{ github.repository }}
|
|
NVM_INSTALL_VERSION: ${{ github.sha }}
|
|
|
|
jobs:
|
|
msys_fail_install:
|
|
# Default installation does not work due to npm_config_prefix set to C:\npm\prefix
|
|
permissions:
|
|
contents: none
|
|
name: 'MSYS fail prefix nvm install'
|
|
runs-on: windows-latest
|
|
steps:
|
|
- name: Retrieve nvm
|
|
shell: bash
|
|
run: |
|
|
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | METHOD=script bash
|
|
. "$HOME/.nvm/nvm.sh"
|
|
! nvm install --lts
|
|
|
|
msys_matrix:
|
|
permissions:
|
|
contents: none
|
|
name: 'MSYS nvm install'
|
|
runs-on: windows-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
npm-node-version:
|
|
- '--lts'
|
|
- '--default 12'
|
|
- '--no-progress 10'
|
|
steps:
|
|
- name: Retrieve nvm
|
|
shell: bash
|
|
run: |
|
|
unset npm_config_prefix
|
|
if [ "${{ matrix.npm-node-version }}" = "--lts" ]; 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=script bash
|
|
fi
|
|
. "$HOME/.nvm/nvm.sh"
|
|
nvm install ${{ matrix.npm-node-version }}
|
|
|
|
cygwin_matrix:
|
|
continue-on-error: true
|
|
permissions:
|
|
contents: none
|
|
name: 'Cygwin nvm install'
|
|
runs-on: windows-latest
|
|
steps:
|
|
- name: Install Cygwin
|
|
shell: bash
|
|
run: |
|
|
export SITE='https://mirror.clarkson.edu/cygwin/' # see https://archlinux.org/mirrors/clarkson.edu/1603/ for uptime status
|
|
export SITE='https://mirrors.kernel.org/sourceware/cygwin/'
|
|
export LOCALDIR="$(pwd)"
|
|
export ROOTDIR="$USERPROFILE\\cygwin"
|
|
export PACKAGES='bash,git,curl'
|
|
|
|
curl -fsSLo setup-x86_64.exe 'https://cygwin.com/setup-x86_64.exe'
|
|
./setup-x86_64.exe --disable-buggy-antivirus -q -s "$SITE" -l "$LOCALDIR" -R "$ROOTDIR" -P "$PACKAGES"
|
|
|
|
cat >~/setup.sh <<EOM
|
|
unset npm_config_prefix
|
|
export NVM_INSTALL_GITHUB_REPO="$NVM_INSTALL_GITHUB_REPO"
|
|
export NVM_INSTALL_VERSION="$NVM_INSTALL_VERSION"
|
|
export HOME="$(cygpath -u "$USERPROFILE")"
|
|
|
|
echo "HOME is $HOME"
|
|
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash
|
|
ls -l $HOME/.nvm
|
|
. "$HOME/.nvm/nvm.sh"
|
|
nvm install --lts
|
|
|
|
nvm deactivate
|
|
rm -rf "$HOME/.nvm/nvm.sh"
|
|
|
|
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | METHOD=script bash
|
|
. "$HOME/.nvm/nvm.sh"
|
|
nvm install 9
|
|
EOM
|
|
- name: Retrieve nvm
|
|
shell: cmd
|
|
run: |
|
|
cd %USERPROFILE%\cygwin\bin
|
|
bash.exe "%USERPROFILE%\setup.sh"
|
|
|
|
wsl_matrix:
|
|
permissions:
|
|
contents: none
|
|
continue-on-error: true
|
|
name: 'WSL nvm install'
|
|
defaults:
|
|
run:
|
|
shell: wsl-bash {0}
|
|
runs-on: windows-latest
|
|
env:
|
|
WSLENV: NVM_INSTALL_GITHUB_REPO:NVM_INSTALL_VERSION:/p
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# each line gets a pin, plus the newest setup-wsl offers for it; the
|
|
# newest only moves when the action's major does, so bumping the `uses:`
|
|
# ref below is what keeps this current
|
|
wsl-distrib:
|
|
- Debian-12
|
|
- Debian-13
|
|
# - Alpine-3.17 # fails
|
|
- Ubuntu-20.04
|
|
- Ubuntu-24.04
|
|
- Ubuntu-18.04
|
|
npm-node-version:
|
|
- '--lts'
|
|
- '21'
|
|
- '18'
|
|
- '16'
|
|
- '14'
|
|
- '12'
|
|
- '10'
|
|
exclude:
|
|
- wsl-distrib: Ubuntu-18.04
|
|
npm-node-version: '--lts'
|
|
- wsl-distrib: Ubuntu-18.04
|
|
npm-node-version: '21'
|
|
- wsl-distrib: Ubuntu-18.04
|
|
npm-node-version: '18'
|
|
# node v24+ doesn't work on WSL1 (exec format error)
|
|
- wsl-distrib: Debian-12
|
|
npm-node-version: '--lts'
|
|
- wsl-distrib: Debian-13
|
|
npm-node-version: '--lts'
|
|
- wsl-distrib: Ubuntu-20.04
|
|
npm-node-version: '--lts'
|
|
- wsl-distrib: Ubuntu-24.04
|
|
npm-node-version: '--lts'
|
|
method:
|
|
- ''
|
|
- 'script'
|
|
steps:
|
|
# For Ubuntu: install with packages directly
|
|
- if: ${{ !startsWith(matrix.wsl-distrib, 'Debian') }}
|
|
uses: Vampire/setup-wsl@v7
|
|
with:
|
|
distribution: ${{ matrix.wsl-distrib }}
|
|
additional-packages: bash git curl ca-certificates wget
|
|
|
|
# For Debian, install without packages: `additional-packages` would run
|
|
# `apt-get update` before we get to fix up sources.list
|
|
# see https://github.com/Vampire/setup-wsl/issues/76
|
|
- if: ${{ startsWith(matrix.wsl-distrib, 'Debian') }}
|
|
uses: Vampire/setup-wsl@v7
|
|
with:
|
|
distribution: ${{ matrix.wsl-distrib }}
|
|
# Debian's mirror layout shifts as a release ages out of LTS: main moves to
|
|
# archive.debian.org, and the security suite is both renamed and moved, on
|
|
# its own schedule. Offer every layout and let `apt-get update` discard the
|
|
# ones that 404, so this needs no edits as the image's release ages.
|
|
- if: ${{ startsWith(matrix.wsl-distrib, 'Debian') }}
|
|
name: 'Point apt at whichever mirrors still carry this release'
|
|
shell: 'wsl-bash {0}'
|
|
run: |
|
|
codename="$(. /etc/os-release && printf '%s' "${VERSION_CODENAME-}")"
|
|
if [ -z "${codename}" ]; then
|
|
echo 'no VERSION_CODENAME in /etc/os-release' >&2
|
|
exit 1
|
|
fi
|
|
# Debian 13 moved to deb822; drop both formats so what we write is the
|
|
# only thing apt reads, whichever release is pinned
|
|
rm -f /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d/*.sources
|
|
{
|
|
echo "deb http://deb.debian.org/debian ${codename} main"
|
|
echo "deb http://archive.debian.org/debian ${codename} main"
|
|
echo "deb http://security.debian.org/debian-security ${codename}-security main"
|
|
echo "deb http://archive.debian.org/debian-security ${codename}-security main"
|
|
echo "deb http://archive.debian.org/debian-security ${codename}/updates main"
|
|
} >/etc/apt/sources.list
|
|
cat /etc/apt/sources.list
|
|
- if: ${{ startsWith(matrix.wsl-distrib, 'Debian') }}
|
|
name: 'Install packages with retries'
|
|
shell: 'wsl-bash {0}'
|
|
run: |
|
|
retry() {
|
|
local n=0
|
|
local max=3
|
|
local delay=5
|
|
while true; do
|
|
"$@" && break || {
|
|
n=$((n+1))
|
|
if [ $n -lt $max ]; then
|
|
echo "Command failed. Attempt $n/$max. Retrying in $delay seconds..."
|
|
sleep $delay
|
|
else
|
|
echo "Command failed after $max attempts."
|
|
return 1
|
|
fi
|
|
}
|
|
done
|
|
}
|
|
packages=(bash git curl ca-certificates wget)
|
|
retry apt-get update || true
|
|
if ! retry apt-get install --yes "${packages[@]}"; then
|
|
# a security index can outlive the pool objects it advertises, which
|
|
# no retry resolves; main is complete once a release is archived
|
|
sed -i '/debian-security/d' /etc/apt/sources.list
|
|
retry apt-get update || true
|
|
retry apt-get install --yes "${packages[@]}"
|
|
fi
|
|
|
|
- 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 install ${{ matrix.npm-node-version }}
|
|
node -v
|
|
|
|
wsl_matrix_unofficial:
|
|
permissions:
|
|
contents: none
|
|
continue-on-error: true
|
|
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-3.17
|
|
- Alpine-3.23
|
|
npm-node-version:
|
|
- '--lts'
|
|
- '21'
|
|
- '18'
|
|
- '16'
|
|
- '14'
|
|
- '12'
|
|
- '11'
|
|
- '10'
|
|
method:
|
|
- ''
|
|
- 'script'
|
|
steps:
|
|
- uses: Vampire/setup-wsl@v7
|
|
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:
|
|
contents: none
|
|
needs: [wsl_matrix, wsl_matrix_unofficial, cygwin_matrix, msys_matrix, msys_fail_install]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- run: true
|