mirror of
https://github.com/actions/runner.git
synced 2025-12-11 12:57:05 +00:00
Updated the Node.js version fetching and fallback logic to ensure valid versions are used and added error handling for missing versions.
113 lines
6.3 KiB
YAML
113 lines
6.3 KiB
YAML
name: Auto Update Node Version
|
|
|
|
on:
|
|
schedule:
|
|
- cron: "0 6 * * 1" # Weekly, every Monday
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
update-node:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Get latest Node versions
|
|
id: node-versions
|
|
run: |
|
|
set -e
|
|
echo "Fetching latest Node.js releases..."
|
|
# Get latest v20.x release
|
|
LATEST_NODE20=$(curl -s https://api.github.com/repos/nodejs/node/releases | \
|
|
jq -r '.[] | select(.tag_name | startswith("v20.")) | .tag_name' | \
|
|
head -1 | sed 's/^v//')
|
|
# Get latest v24.x release
|
|
LATEST_NODE24=$(curl -s https://api.github.com/repos/nodejs/node/releases | \
|
|
jq -r '.[] | select(.tag_name | startswith("v24.")) | .tag_name' | \
|
|
head -1 | sed 's/^v//')
|
|
echo "Found Node.js releases: 20=$LATEST_NODE20, 24=$LATEST_NODE24"
|
|
# Verify these versions are available in alpine_nodejs releases
|
|
echo "Verifying availability in alpine_nodejs..."
|
|
ALPINE_RELEASES=$(curl -s https://api.github.com/repos/actions/alpine_nodejs/releases | jq -r '.[].tag_name')
|
|
if ! echo "$ALPINE_RELEASES" | grep -q "^node20-$LATEST_NODE20$"; then
|
|
echo "::warning title=Node 20 Fallback::Node 20 version $LATEST_NODE20 not found in alpine_nodejs releases, using fallback"
|
|
LATEST_NODE20=$(echo "$ALPINE_RELEASES" | grep "^node20-" | head -1 | sed 's/^node20-//')
|
|
echo "Using latest available alpine_nodejs Node 20: $LATEST_NODE20"
|
|
fi
|
|
if ! echo "$ALPINE_RELEASES" | grep -q "^node24-$LATEST_NODE24$"; then
|
|
echo "::warning title=Node 24 Fallback::Node 24 version $LATEST_NODE24 not found in alpine_nodejs releases, using fallback"
|
|
LATEST_NODE24=$(echo "$ALPINE_RELEASES" | grep "^node24-" | head -1 | sed 's/^node24-//')
|
|
echo "Using latest available alpine_nodejs Node 24: $LATEST_NODE24"
|
|
fi
|
|
# Abort if no valid Node versions are found
|
|
if [ -z "$LATEST_NODE20" ] && [ -z "$LATEST_NODE24" ]; then
|
|
echo "::error title=Node Version Update::Could not find valid Node 20 or Node 24 version in alpine_nodejs releases. Aborting."
|
|
exit 1
|
|
fi
|
|
# Check current versions in externals.sh
|
|
CURRENT_NODE20=$(grep "NODE20_VERSION=" src/Misc/externals.sh | cut -d'"' -f2)
|
|
CURRENT_NODE24=$(grep "NODE24_VERSION=" src/Misc/externals.sh | cut -d'"' -f2)
|
|
echo "current_node20=$CURRENT_NODE20" >> $GITHUB_OUTPUT
|
|
echo "current_node24=$CURRENT_NODE24" >> $GITHUB_OUTPUT
|
|
# Determine if updates are needed
|
|
NEEDS_UPDATE20="false"
|
|
NEEDS_UPDATE24="false"
|
|
if [ -n "$LATEST_NODE20" ] && [ "$CURRENT_NODE20" != "$LATEST_NODE20" ]; then
|
|
NEEDS_UPDATE20="true"
|
|
echo "::notice title=Node 20 Update Available::Current: $CURRENT_NODE20 → Latest: $LATEST_NODE20"
|
|
fi
|
|
if [ -n "$LATEST_NODE24" ] && [ "$CURRENT_NODE24" != "$LATEST_NODE24" ]; then
|
|
NEEDS_UPDATE24="true"
|
|
echo "::notice title=Node 24 Update Available::Current: $CURRENT_NODE24 → Latest: $LATEST_NODE24"
|
|
fi
|
|
if [ "$NEEDS_UPDATE20" == "false" ] && [ "$NEEDS_UPDATE24" == "false" ]; then
|
|
echo "::notice title=No Updates Needed::All Node.js versions are up to date"
|
|
fi
|
|
echo "latest_node20=$LATEST_NODE20" >> $GITHUB_OUTPUT
|
|
echo "latest_node24=$LATEST_NODE24" >> $GITHUB_OUTPUT
|
|
echo "needs_update20=$NEEDS_UPDATE20" >> $GITHUB_OUTPUT
|
|
echo "needs_update24=$NEEDS_UPDATE24" >> $GITHUB_OUTPUT
|
|
- name: Update externals.sh and create PR
|
|
if: steps.node-versions.outputs.needs_update20 == 'true' || steps.node-versions.outputs.needs_update24 == 'true'
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
set -e
|
|
# Only update if a valid version is found
|
|
if [ "${{ steps.node-versions.outputs.needs_update20 }}" == "true" ] && [ -n "${{ steps.node-versions.outputs.latest_node20 }}" ]; then
|
|
sed -i 's/NODE20_VERSION="[^"]*"/NODE20_VERSION="${{ steps.node-versions.outputs.latest_node20 }}"/' src/Misc/externals.sh
|
|
fi
|
|
if [ "${{ steps.node-versions.outputs.needs_update24 }}" == "true" ] && [ -n "${{ steps.node-versions.outputs.latest_node24 }}" ]; then
|
|
sed -i 's/NODE24_VERSION="[^"]*"/NODE24_VERSION="${{ steps.node-versions.outputs.latest_node24 }}"/' src/Misc/externals.sh
|
|
fi
|
|
# Configure git
|
|
git config --global user.name "github-actions[bot]"
|
|
git config --global user.email "<41898282+github-actions[bot]@users.noreply.github.com>"
|
|
# Create branch and commit changes
|
|
branch_name="chore/update-node"
|
|
git checkout -b "$branch_name"
|
|
git commit -a -m "chore: update Node versions (20: ${{ steps.node-versions.outputs.latest_node20 }}, 24: ${{ steps.node-versions.outputs.latest_node24 }})"
|
|
git push --force origin "$branch_name"
|
|
# Create PR body using here-doc for proper formatting
|
|
cat > pr_body.txt << EOF
|
|
Automated Node.js version update:
|
|
|
|
- Node 20: ${{ steps.node-versions.outputs.current_node20 }} → ${{ steps.node-versions.outputs.latest_node20 }}
|
|
- Node 24: ${{ steps.node-versions.outputs.current_node24 }} → ${{ steps.node-versions.outputs.latest_node24 }}
|
|
|
|
This update ensures we're using the latest stable Node.js versions for security and performance improvements.
|
|
|
|
**Note**: When updating Node versions, remember to also create a new release of alpine_nodejs at the updated version following the instructions at: https://github.com/actions/alpine_nodejs
|
|
|
|
---
|
|
Autogenerated by [Node Version Upgrade Workflow](https://github.com/actions/runner/blob/main/.github/workflows/node-upgrade.yml)
|
|
EOF
|
|
# Create PR
|
|
gh pr create -B main -H "$branch_name" \
|
|
--title "chore: update Node versions" \
|
|
--label "dependencies" \
|
|
--label "dependencies-weekly-check" \
|
|
--label "dependencies-not-dependabot" \
|
|
--label "node" \
|
|
--label "javascript" \
|
|
--body-file pr_body.txt
|
|
echo "::notice title=PR Created::Successfully created Node.js version update PR on branch $branch_name"
|