Other Node Versions #298
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Other Node Versions | |
on: | |
workflow_dispatch: | |
schedule: | |
# Every day at 7:30am UTC | |
- cron: "30 7 * * *" | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.number || github.ref }} | |
cancel-in-progress: true | |
env: | |
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} | |
NX_VERBOSE_LOGGING: false | |
COREPACK_ENABLE_AUTO_PIN: "0" | |
COREPACK_ENABLE_STRICT: "0" | |
jobs: | |
set-node-versions: | |
name: Set Node Versions | |
runs-on: ubuntu-latest | |
outputs: | |
node-versions: ${{ steps.node-matrix.outputs.node-versions }} | |
steps: | |
- name: Set node matrix | |
id: node-matrix | |
# These versions intentionally do not contain our primary major version because that has already been tested by ci.yml | |
run: | | |
NODE_VERSIONS_JSON_ARRAY=$(node -e "console.log(JSON.stringify(['18']));") | |
echo $NODE_VERSIONS_JSON_ARRAY | |
echo "node-versions=$NODE_VERSIONS_JSON_ARRAY" >> $GITHUB_OUTPUT | |
main: | |
name: Nx Cloud - Main Job - node-${{ matrix.node }} | |
needs: set-node-versions | |
runs-on: ubuntu-latest | |
env: | |
NX_CI_EXECUTION_ENV: linux-node-${{ matrix.node }} | |
strategy: | |
# Do not kill all versions of node just because one version failed | |
fail-fast: false | |
matrix: | |
node: ${{ fromJson(needs.set-node-versions.outputs.node-versions) }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install node v${{ matrix.node }} and dependencies | |
uses: ./.github/actions/install-node-and-dependencies | |
with: | |
node-version: ${{ matrix.node }} | |
- name: Remove the volta key from package.json to ensure the explicitly installed version is respected | |
run: | | |
jq 'del(.volta)' package.json > package.json.tmp | |
mv package.json.tmp package.json | |
- name: Enable corepack | |
run: corepack enable | |
shell: bash | |
- name: Install pnpm v8 | |
run: corepack install -g pnpm@8 | |
shell: bash | |
- name: Print installed node, npm, yarn and pnpm versions | |
run: | | |
node --version | |
npm --version | |
yarn --version | |
pnpm --version | |
shell: bash | |
- name: Configure git metadata | |
run: | | |
git config --global user.email test@example.com | |
git config --global user.name "Tester McPerson" | |
- name: Generate and configure GPG for signing commits and tags in E2E tests | |
run: | | |
# Generate a GPG key for test@example.com and store the output from stderr | |
GPG_OUTPUT=$(echo "Key-Type: default | |
Key-Length: 2048 | |
Subkey-Type: default | |
Subkey-Length: 2048 | |
Name-Real: Tester McPerson | |
Name-Email: test@example.com | |
Expire-Date: 0 | |
%no-protection" | gpg --pinentry-mode loopback --batch --generate-key 2>&1) | |
# Find and extract the revocation file path from sdterr | |
REVOCATION_FILE=$(echo "$GPG_OUTPUT" | grep '.rev' | tr '\n' ' ' | awk -F "'" '{print $4}') | |
# Get the GPG key ID and the full fingerprint | |
export GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | cut -d'/' -f2) | |
export GPG_FULL_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep "$GPG_KEY_ID" | grep -v "sec" | awk '{print $1}' | cut -d'/' -f2) | |
# Export fingerprint and the path to the revocation file to GITHUB_ENV | |
# This allows the last step in this job to revoke and delete the key | |
echo "GPG_FULL_KEY_ID=$GPG_FULL_KEY_ID" >> $GITHUB_ENV | |
echo "REVOCATION_FILE=$REVOCATION_FILE" >> $GITHUB_ENV | |
# Setup git signing for commits and tags | |
git config commit.gpgsign true | |
git config tag.gpgsign true | |
git config --global user.signingkey $GPG_KEY_ID | |
- name: Run parallel distributed builds and tests on each node version | |
uses: jameshenry/parallel-bash-commands@v1 | |
with: | |
cmd1: npx nx run-many -t build --parallel=3 | |
cmd2: npx nx run-many -t test --parallel=3 --ci --maxWorkers=2 | |
cmd3: npx nx run integration:integration --ci --maxWorkers=2 | |
# e2e tests for everything except the primary task runner | |
- run: PUBLISHED_VERSION=999.9.9-e2e.0 npx nx run-many --t e2e --parallel=1 | |
- name: Run e2e tests for task-runner | |
run: | | |
# We do not want the automatic Github Actions grouping to be applied to the e2e tests, or the snapshots won't match local | |
unset GITHUB_ACTIONS | |
npx nx prepare-for-e2e e2e-run-task-runner && e2e/run/task-runner/src/run-tests.sh | |
shell: bash | |
env: | |
# Silently disable nx cloud for task runner e2e (using NX_NO_CLOUD produces a warning log) | |
NX_CLOUD_ACCESS_TOKEN: "" | |
NX_CLOUD_DISTRIBUTED_EXECUTION: false | |
- name: Stop all running agents | |
# It's important that we always run this step, otherwise in the case of any failures in preceding non-Nx steps, the agents will keep running and waste billable minutes | |
if: ${{ always() }} | |
run: npx nx-cloud stop-all-agents | |
- name: Revoke and delete GPG key | |
# It's important that we always run this step, otherwise the key will remain active if any of the steps above fail | |
if: ${{ always() }} | |
run: | | |
# As instructed in the text of revocation file, there is a colon that needs to be removed manually | |
sed -i "s/:-----BEGIN PGP PUBLIC KEY BLOCK-----/-----BEGIN PGP PUBLIC KEY BLOCK-----/" $REVOCATION_FILE | |
# Revoke the key and delete it | |
gpg --yes --import $REVOCATION_FILE | |
gpg --batch --yes --delete-secret-and-public-key $GPG_FULL_KEY_ID | |
agents: | |
name: Nx Cloud - Agent - node-${{ matrix.node }}-agent-${{ matrix.agent }} | |
needs: set-node-versions | |
runs-on: ubuntu-latest | |
env: | |
NX_CI_EXECUTION_ENV: linux-node-${{ matrix.node }} | |
strategy: | |
# Do not kill all versions of node just because one version failed | |
fail-fast: false | |
matrix: | |
node: ${{ fromJson(needs.set-node-versions.outputs.node-versions) }} | |
# Create 4 agents per node version | |
agent: [1, 2, 3, 4] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Configure git metadata | |
run: | | |
git config --global user.email test@example.com | |
git config --global user.name "Tester McPerson" | |
- name: Generate and configure GPG for signing commits and tags in E2E tests | |
run: | | |
# Generate a GPG key for test@example.com and store the output from stderr | |
GPG_OUTPUT=$(echo "Key-Type: default | |
Key-Length: 2048 | |
Subkey-Type: default | |
Subkey-Length: 2048 | |
Name-Real: Tester McPerson | |
Name-Email: test@example.com | |
Expire-Date: 0 | |
%no-protection" | gpg --pinentry-mode loopback --batch --generate-key 2>&1) | |
# Find and extract the revocation file path from sdterr | |
REVOCATION_FILE=$(echo "$GPG_OUTPUT" | grep '.rev' | tr '\n' ' ' | awk -F "'" '{print $4}') | |
# Get the GPG key ID and the full fingerprint | |
export GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | cut -d'/' -f2) | |
export GPG_FULL_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep "$GPG_KEY_ID" | grep -v "sec" | awk '{print $1}' | cut -d'/' -f2) | |
# Export fingerprint and the path to the revocation file to GITHUB_ENV | |
# This allows the last step in this job to revoke and delete the key | |
echo "GPG_FULL_KEY_ID=$GPG_FULL_KEY_ID" >> $GITHUB_ENV | |
echo "REVOCATION_FILE=$REVOCATION_FILE" >> $GITHUB_ENV | |
# Setup git signing for commits and tags | |
git config commit.gpgsign true | |
git config tag.gpgsign true | |
git config --global user.signingkey $GPG_KEY_ID | |
- name: Install node v${{ matrix.node }} and dependencies | |
uses: ./.github/actions/install-node-and-dependencies | |
with: | |
node-version: ${{ matrix.node }} | |
- name: Remove the volta key from package.json to ensure the explicitly installed version is respected | |
run: | | |
jq 'del(.volta)' package.json > package.json.tmp | |
mv package.json.tmp package.json | |
- name: Start Nx Agent node-${{ matrix.node }}-agent-${{ matrix.agent }} | |
run: npx nx-cloud start-agent | |
env: | |
NX_AGENT_NAME: node-${{ matrix.node }}-agent-${{ matrix.agent }} | |
- name: Revoke and delete GPG key | |
# It's important that we always run this step, otherwise the key will remain active if any of the steps above fail | |
if: ${{ always() }} | |
run: | | |
# As instructed in the text of revocation file, there is a colon that needs to be removed manually | |
sed -i "s/:-----BEGIN PGP PUBLIC KEY BLOCK-----/-----BEGIN PGP PUBLIC KEY BLOCK-----/" $REVOCATION_FILE | |
# Revoke the key and delete it | |
gpg --yes --import $REVOCATION_FILE | |
gpg --batch --yes --delete-secret-and-public-key $GPG_FULL_KEY_ID |