name: 'Tests: fast' on: [push, pull_request] permissions: contents: read jobs: fast-linux: permissions: contents: read name: 'fast (${{ matrix.shell }}, ${{ matrix.awk }})' runs-on: ubuntu-latest defaults: run: shell: 'script -q -e -c "${{ matrix.shell }} {0}"' strategy: fail-fast: false matrix: shell: - sh - bash - dash - zsh # - ksh awk: - gawk - mawk steps: - name: Harden Runner uses: step-security/harden-runner@v2 with: allowed-endpoints: github.com:443 registry.npmjs.org:443 raw.githubusercontent.com:443 nodejs.org:443 iojs.org:443 unofficial-builds.nodejs.org:443 azure.archive.ubuntu.com:80 packages.microsoft.com:443 registry-1.docker.io:443 auth.docker.io:443 production.cloudflare.docker.com:443 production.cloudfront.docker.com:443 - uses: actions/checkout@v6 id: checkout continue-on-error: true with: submodules: true - name: 'nvmrc submodule fallback (forks without their own nvmrc)' if: steps.checkout.outcome == 'failure' shell: bash run: | git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git git submodule sync --recursive git submodule update --init --recursive - name: Install zsh, additional shells, and awk variant run: | sudo apt-get update sudo apt-get install -y zsh ${{ matrix.awk }} if [ "${{ matrix.shell }}" != "sh" ] && [ "${{ matrix.shell }}" != "bash" ] && [ "${{ matrix.shell }}" != "zsh" ]; then sudo apt-get install -y ${{ matrix.shell }} fi # Set the selected awk as the default sudo update-alternatives --set awk /usr/bin/${{ matrix.awk }} shell: bash - run: sudo ${{ matrix.shell }} --version 2> /dev/null || dpkg -s ${{ matrix.shell }} 2> /dev/null || which ${{ matrix.shell }} - run: awk --version 2>&1 | head -1 || awk -W version 2>&1 | head -1 - run: curl --version - run: wget --version - uses: ljharb/actions/node/install@main name: 'npm install && version checks' with: node-version: 'lts/*' skip-ls-check: true - run: npm ls urchin - run: npx which urchin - run: env - name: Hide system node run: | if [ -f /usr/local/bin/node ]; then sudo mv /usr/local/bin/node /usr/local/bin/node.bak; fi if [ -f /usr/local/bin/npm ]; then sudo mv /usr/local/bin/npm /usr/local/bin/npm.bak; fi if [ -f /usr/local/bin/npx ]; then sudo mv /usr/local/bin/npx /usr/local/bin/npx.bak; fi shell: bash - name: Run fast tests run: | URCHIN_PATH="$(npx which urchin)" unset NVM_CD_FLAGS NVM_BIN NVM_INC export NVM_DIR="${{ github.workspace }}" export PATH="$(echo "$PATH" | tr ':' '\n' | grep -v '\.nvm' | grep -v 'toolcache' | tr '\n' ':')" make TERM=xterm-256color TEST_SUITE="fast" SHELL="${{ matrix.shell }}" URCHIN="$URCHIN_PATH" test-${{ matrix.shell }} - name: Restore system node if: always() run: | if [ -f /usr/local/bin/node.bak ]; then sudo mv /usr/local/bin/node.bak /usr/local/bin/node; fi if [ -f /usr/local/bin/npm.bak ]; then sudo mv /usr/local/bin/npm.bak /usr/local/bin/npm; fi if [ -f /usr/local/bin/npx.bak ]; then sudo mv /usr/local/bin/npx.bak /usr/local/bin/npx; fi shell: bash fast-macos: permissions: contents: read # APFS is case-insensitive, and /bin/sh and /bin/bash are bash 3.2 name: 'fast (macOS, ${{ matrix.shell }})' runs-on: macos-latest strategy: fail-fast: false matrix: shell: - sh - bash - dash - zsh steps: - uses: actions/checkout@v6 id: checkout continue-on-error: true with: submodules: true - name: 'nvmrc submodule fallback (forks without their own nvmrc)' if: steps.checkout.outcome == 'failure' shell: bash run: | git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git git submodule sync --recursive git submodule update --init --recursive - run: sw_vers; uname -m; which ${{ matrix.shell }} - name: Ensure wget is installed run: command -v wget || brew install wget - run: wget --version - uses: ljharb/actions/node/install@main name: 'npm install && version checks' with: node-version: 'lts/*' skip-ls-check: true - run: npm ls urchin - name: Hide system node shell: bash run: | export PATH="$(echo "$PATH" | tr ':' '\n' | grep -v '\.nvm' | grep -v 'toolcache' | tr '\n' ':')" for bin in node npm npx; do while found="$(command -v "${bin}")"; do sudo mv "${found}" "${found}.bak" || break echo "${found}" >> "${RUNNER_TEMP}/hidden-node" hash -r done done - name: Run fast tests shell: bash run: | unset NVM_CD_FLAGS NVM_BIN NVM_INC export NVM_DIR="${{ github.workspace }}" export PATH="$(echo "$PATH" | tr ':' '\n' | grep -v '\.nvm' | grep -v 'toolcache' | tr '\n' ':')" script -q /dev/null make TERM=xterm-256color TEST_SUITE="fast" SHELL="${{ matrix.shell }}" URCHIN="${{ github.workspace }}/node_modules/.bin/urchin" test-${{ matrix.shell }} < /dev/null - name: Restore system node if: always() shell: bash run: | if [ -f "${RUNNER_TEMP}/hidden-node" ]; then while IFS= read -r found; do sudo mv "${found}.bak" "${found}"; done < "${RUNNER_TEMP}/hidden-node" fi fast-windows: permissions: contents: read # GitHub's Windows runners provide WSL1 name: 'fast (WSL ${{ matrix.wsl-distrib }}, ${{ matrix.shell }})' runs-on: windows-latest defaults: run: shell: wsl-bash {0} strategy: fail-fast: false matrix: wsl-distrib: - Ubuntu-24.04 shell: - sh - bash - dash - zsh steps: - uses: actions/checkout@v6 - uses: Vampire/setup-wsl@v7 with: distribution: ${{ matrix.wsl-distrib }} additional-packages: git make zsh dash sudo curl wget ca-certificates nodejs npm - name: 'Clone into the WSL filesystem as a non-root user' # the Windows checkout shows every file as executable, which urchin would run as tests run: | set -ex useradd -m tester echo 'tester ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/tester chmod 0440 /etc/sudoers.d/tester su tester -c ' set -ex git config --global --add safe.directory "*" git clone "$(wslpath "${{ github.workspace }}")" ~/nvm cd ~/nvm git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git git submodule update --init --recursive npm install npm ls urchin ' - name: Hide system node run: | for bin in node npm npx; do if [ -e "/usr/bin/${bin}" ]; then mv "/usr/bin/${bin}" "/usr/bin/${bin}.bak"; fi done - name: Run fast tests run: | su tester -c ' cd ~/nvm unset NVM_CD_FLAGS NVM_BIN NVM_INC export NVM_DIR="${HOME}/nvm" GITHUB_ACTIONS=true TERM=xterm-256color script -q -e -c "make TEST_SUITE=fast SHELL=${{ matrix.shell }} URCHIN=${HOME}/nvm/node_modules/.bin/urchin test-${{ matrix.shell }}" /dev/null ' all: permissions: contents: none name: 'all fast tests' needs: [fast-linux, fast-macos, fast-windows] runs-on: ubuntu-latest steps: - run: true