Skip to content

Commit 6033581

Browse files
salmanmkcfmartinez255
authored andcommitted
feat: add automated Node.js version management workflow (actions#4026)
1 parent 83f160a commit 6033581

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

.github/workflows/node-upgrade.yml

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
name: Auto Update Node Version
2+
3+
on:
4+
schedule:
5+
- cron: "0 6 * * 1" # Weekly, every Monday
6+
workflow_dispatch:
7+
8+
jobs:
9+
update-node:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v5
13+
- name: Get latest Node versions
14+
id: node-versions
15+
run: |
16+
# Get latest Node.js releases from official GitHub releases
17+
echo "Fetching latest Node.js releases..."
18+
19+
# Get latest v20.x release
20+
LATEST_NODE20=$(curl -s https://api.github.com/repos/nodejs/node/releases | \
21+
jq -r '.[] | select(.tag_name | startswith("v20.")) | .tag_name' | \
22+
head -1 | sed 's/^v//')
23+
24+
# Get latest v24.x release
25+
LATEST_NODE24=$(curl -s https://api.github.com/repos/nodejs/node/releases | \
26+
jq -r '.[] | select(.tag_name | startswith("v24.")) | .tag_name' | \
27+
head -1 | sed 's/^v//')
28+
29+
echo "Found Node.js releases: 20=$LATEST_NODE20, 24=$LATEST_NODE24"
30+
31+
# Verify these versions are available in alpine_nodejs releases
32+
echo "Verifying availability in alpine_nodejs..."
33+
ALPINE_RELEASES=$(curl -s https://api.github.com/repos/actions/alpine_nodejs/releases | jq -r '.[].tag_name')
34+
35+
if ! echo "$ALPINE_RELEASES" | grep -q "^node20-$LATEST_NODE20$"; then
36+
echo "::warning title=Node 20 Fallback::Node 20 version $LATEST_NODE20 not found in alpine_nodejs releases, using fallback"
37+
# Fall back to latest available alpine_nodejs v20 release
38+
LATEST_NODE20=$(echo "$ALPINE_RELEASES" | grep "^node20-" | head -1 | sed 's/^node20-//')
39+
echo "Using latest available alpine_nodejs Node 20: $LATEST_NODE20"
40+
fi
41+
42+
if ! echo "$ALPINE_RELEASES" | grep -q "^node24-$LATEST_NODE24$"; then
43+
echo "::warning title=Node 24 Fallback::Node 24 version $LATEST_NODE24 not found in alpine_nodejs releases, using fallback"
44+
# Fall back to latest available alpine_nodejs v24 release
45+
LATEST_NODE24=$(echo "$ALPINE_RELEASES" | grep "^node24-" | head -1 | sed 's/^node24-//')
46+
echo "Using latest available alpine_nodejs Node 24: $LATEST_NODE24"
47+
fi
48+
49+
echo "latest_node20=$LATEST_NODE20" >> $GITHUB_OUTPUT
50+
echo "latest_node24=$LATEST_NODE24" >> $GITHUB_OUTPUT
51+
52+
# Check current versions in externals.sh
53+
CURRENT_NODE20=$(grep "NODE20_VERSION=" src/Misc/externals.sh | cut -d'"' -f2)
54+
CURRENT_NODE24=$(grep "NODE24_VERSION=" src/Misc/externals.sh | cut -d'"' -f2)
55+
56+
echo "current_node20=$CURRENT_NODE20" >> $GITHUB_OUTPUT
57+
echo "current_node24=$CURRENT_NODE24" >> $GITHUB_OUTPUT
58+
59+
# Determine if updates are needed
60+
NEEDS_UPDATE20="false"
61+
NEEDS_UPDATE24="false"
62+
63+
if [ "$CURRENT_NODE20" != "$LATEST_NODE20" ]; then
64+
NEEDS_UPDATE20="true"
65+
echo "::notice title=Node 20 Update Available::Current: $CURRENT_NODE20 → Latest: $LATEST_NODE20"
66+
fi
67+
68+
if [ "$CURRENT_NODE24" != "$LATEST_NODE24" ]; then
69+
NEEDS_UPDATE24="true"
70+
echo "::notice title=Node 24 Update Available::Current: $CURRENT_NODE24 → Latest: $LATEST_NODE24"
71+
fi
72+
73+
if [ "$NEEDS_UPDATE20" == "false" ] && [ "$NEEDS_UPDATE24" == "false" ]; then
74+
echo "::notice title=No Updates Needed::All Node.js versions are up to date"
75+
fi
76+
77+
echo "needs_update20=$NEEDS_UPDATE20" >> $GITHUB_OUTPUT
78+
echo "needs_update24=$NEEDS_UPDATE24" >> $GITHUB_OUTPUT
79+
80+
- name: Update externals.sh and create PR
81+
if: steps.node-versions.outputs.needs_update20 == 'true' || steps.node-versions.outputs.needs_update24 == 'true'
82+
env:
83+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
84+
run: |
85+
# Update the files
86+
if [ "${{ steps.node-versions.outputs.needs_update20 }}" == "true" ]; then
87+
sed -i 's/NODE20_VERSION="[^"]*"/NODE20_VERSION="${{ steps.node-versions.outputs.latest_node20 }}"/' src/Misc/externals.sh
88+
fi
89+
90+
if [ "${{ steps.node-versions.outputs.needs_update24 }}" == "true" ]; then
91+
sed -i 's/NODE24_VERSION="[^"]*"/NODE24_VERSION="${{ steps.node-versions.outputs.latest_node24 }}"/' src/Misc/externals.sh
92+
fi
93+
94+
# Configure git
95+
git config --global user.name "github-actions[bot]"
96+
git config --global user.email "<41898282+github-actions[bot]@users.noreply.github.com>"
97+
98+
# Create branch and commit changes
99+
branch_name="chore/update-node"
100+
git checkout -b "$branch_name"
101+
git commit -a -m "chore: update Node versions (20: ${{ steps.node-versions.outputs.latest_node20 }}, 24: ${{ steps.node-versions.outputs.latest_node24 }})"
102+
git push --force origin "$branch_name"
103+
104+
# Create PR body using here-doc for proper formatting
105+
cat > pr_body.txt << 'EOF'
106+
Automated Node.js version update:
107+
108+
- Node 20: ${{ steps.node-versions.outputs.current_node20 }} → ${{ steps.node-versions.outputs.latest_node20 }}
109+
- Node 24: ${{ steps.node-versions.outputs.current_node24 }} → ${{ steps.node-versions.outputs.latest_node24 }}
110+
111+
This update ensures we're using the latest stable Node.js versions for security and performance improvements.
112+
113+
**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
114+
115+
---
116+
117+
Autogenerated by [Node Version Upgrade Workflow](https://github.com/actions/runner/blob/main/.github/workflows/node-upgrade.yml)
118+
EOF
119+
120+
# Create PR
121+
gh pr create -B main -H "$branch_name" \
122+
--title "chore: update Node versions" \
123+
--label "dependency" \
124+
--body-file pr_body.txt
125+
126+
echo "::notice title=PR Created::Successfully created Node.js version update PR on branch $branch_name"

0 commit comments

Comments
 (0)