Files
oxc-project__oxc/.github/workflows/update_submodules.yml
camc314 6f22859717 chore(deps): update setup-node to v1.4.1 (#26296)
## Summary

- update `oxc-project/setup-node` from v1.4.0 to v1.4.1 across all workflows
- pick up `pnpm/action-setup` v6.0.10, whose newer bootstrap fixes broken `@pnpm/exe` shims during package-manager self-updates

The setup action fix was released after oxc-project/setup-node#34.
2026-09-04 10:20:51 +00:00

301 lines
14 KiB
YAML

name: Update Submodules
permissions: {}
on:
# Triggered by https://github.com/oxc-project/estree-conformance/actions/workflows/trigger-oxc-update.yml
workflow_dispatch:
inputs:
test262_sha:
description: "Test262 commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
typescript_sha:
description: "TypeScript commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
estree_conformance_sha:
description: "estree-conformance commit SHA (includes test262, TypeScript, and acorn-jsx fixtures - optional - will fetch latest if not provided)"
required: false
type: string
workflow_call:
inputs:
test262_sha:
description: "Test262 commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
typescript_sha:
description: "TypeScript commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
estree_conformance_sha:
description: "estree-conformance commit SHA (includes test262, TypeScript, and acorn-jsx fixtures - optional - will fetch latest if not provided)"
required: false
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}
cancel-in-progress: true
jobs:
update:
name: Update submodule SHAs
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2
- uses: oxc-project/setup-node@f46a72f95efdc55273fcd042d61c84e723b2892c # v1.4.1
- uses: oxc-project/setup-rust@3d6fb132fbe7cdcb66bf8ec193911c2945369d12 # v1.0.17
with:
cache-key: conformance
tools: just
components: rustfmt
- name: Get latest SHAs for all submodules
id: get-shas
env:
INPUT_TEST262_SHA: ${{ inputs.test262_sha }}
INPUT_TYPESCRIPT_SHA: ${{ inputs.typescript_sha }}
INPUT_ESTREE_CONFORMANCE_SHA: ${{ inputs.estree_conformance_sha }}
run: |
# Function to fetch latest SHA for a repo
fetch_sha() {
local name=$1
local repo=$2
local branch=${3:-HEAD}
echo "Fetching latest SHA for $repo (branch: $branch)..."
# Use GitHub API to get latest commit SHA (much faster than cloning)
# Use GITHUB_TOKEN to avoid rate limiting
response=$(curl -s -H "Authorization: token ${{ github.token }}" "https://api.github.com/repos/$repo/commits/$branch")
sha=$(echo "$response" | jq -r .sha)
# Validate SHA is not null or empty
if [ "$sha" = "null" ] || [ -z "$sha" ]; then
echo "Error: Failed to fetch SHA for $repo (got: '$sha')"
echo "API Response: $response"
echo "This may be due to GitHub API rate limiting, repository access issues, or branch not found"
# Check for specific error messages
error_message=$(echo "$response" | jq -r .message 2>/dev/null)
if [ "$error_message" != "null" ] && [ -n "$error_message" ]; then
echo "GitHub API Error: $error_message"
fi
exit 1
fi
# Output the SHA
echo "${name}_LATEST=$sha" >> $GITHUB_OUTPUT
echo "$name latest SHA: $sha"
}
# Use provided SHAs from workflow_call inputs if available, otherwise fetch from GitHub
if [ -n "$INPUT_TEST262_SHA" ]; then
echo "TEST262_LATEST=$INPUT_TEST262_SHA" >> $GITHUB_OUTPUT
echo "TEST262 SHA (from input): $INPUT_TEST262_SHA"
else
fetch_sha "TEST262" "tc39/test262"
fi
if [ -n "$INPUT_TYPESCRIPT_SHA" ]; then
echo "TYPESCRIPT_LATEST=$INPUT_TYPESCRIPT_SHA" >> $GITHUB_OUTPUT
echo "TYPESCRIPT SHA (from input): $INPUT_TYPESCRIPT_SHA"
else
fetch_sha "TYPESCRIPT" "microsoft/TypeScript"
fi
if [ -n "$INPUT_ESTREE_CONFORMANCE_SHA" ]; then
echo "ESTREE_CONFORMANCE_LATEST=$INPUT_ESTREE_CONFORMANCE_SHA" >> $GITHUB_OUTPUT
echo "ESTREE_CONFORMANCE SHA (from input): $INPUT_ESTREE_CONFORMANCE_SHA"
else
fetch_sha "ESTREE_CONFORMANCE" "oxc-project/estree-conformance"
fi
# Always fetch BABEL and NODE_COMPAT_TABLE (not provided via inputs)
fetch_sha "BABEL" "babel/babel"
fetch_sha "NODE_COMPAT_TABLE" "compat-table/node-compat-table" "gh-pages"
- name: Get current SHAs from clone-parallel.mjs
id: current-shas
run: |
# Extract current SHAs from the script
TEST262_CURRENT=$(grep 'const TEST262_SHA' .github/scripts/clone-parallel.mjs | cut -d'"' -f2)
BABEL_CURRENT=$(grep 'const BABEL_SHA' .github/scripts/clone-parallel.mjs | cut -d'"' -f2)
TYPESCRIPT_CURRENT=$(grep 'const TYPESCRIPT_SHA' .github/scripts/clone-parallel.mjs | cut -d'"' -f2)
ESTREE_CONFORMANCE_CURRENT=$(grep 'const ESTREE_CONFORMANCE_SHA' .github/scripts/clone-parallel.mjs | cut -d'"' -f2)
NODE_COMPAT_TABLE_CURRENT=$(grep 'const NODE_COMPAT_TABLE_SHA' .github/scripts/clone-parallel.mjs | cut -d'"' -f2)
echo "TEST262_CURRENT=$TEST262_CURRENT" >> $GITHUB_OUTPUT
echo "BABEL_CURRENT=$BABEL_CURRENT" >> $GITHUB_OUTPUT
echo "TYPESCRIPT_CURRENT=$TYPESCRIPT_CURRENT" >> $GITHUB_OUTPUT
echo "ESTREE_CONFORMANCE_CURRENT=$ESTREE_CONFORMANCE_CURRENT" >> $GITHUB_OUTPUT
echo "NODE_COMPAT_TABLE_CURRENT=$NODE_COMPAT_TABLE_CURRENT" >> $GITHUB_OUTPUT
echo "Current SHAs:"
echo " TEST262: $TEST262_CURRENT"
echo " BABEL: $BABEL_CURRENT"
echo " TYPESCRIPT: $TYPESCRIPT_CURRENT"
echo " ESTREE_CONFORMANCE: $ESTREE_CONFORMANCE_CURRENT"
echo " NODE_COMPAT_TABLE: $NODE_COMPAT_TABLE_CURRENT"
- name: Check if updates are needed
id: check-updates
env:
TEST262_LATEST: ${{ steps.get-shas.outputs.TEST262_LATEST }}
TEST262_CURRENT: ${{ steps.current-shas.outputs.TEST262_CURRENT }}
BABEL_LATEST: ${{ steps.get-shas.outputs.BABEL_LATEST }}
BABEL_CURRENT: ${{ steps.current-shas.outputs.BABEL_CURRENT }}
TYPESCRIPT_LATEST: ${{ steps.get-shas.outputs.TYPESCRIPT_LATEST }}
TYPESCRIPT_CURRENT: ${{ steps.current-shas.outputs.TYPESCRIPT_CURRENT }}
ESTREE_CONFORMANCE_LATEST: ${{ steps.get-shas.outputs.ESTREE_CONFORMANCE_LATEST }}
ESTREE_CONFORMANCE_CURRENT: ${{ steps.current-shas.outputs.ESTREE_CONFORMANCE_CURRENT }}
NODE_COMPAT_TABLE_LATEST: ${{ steps.get-shas.outputs.NODE_COMPAT_TABLE_LATEST }}
NODE_COMPAT_TABLE_CURRENT: ${{ steps.current-shas.outputs.NODE_COMPAT_TABLE_CURRENT }}
run: |
updates_needed=false
update_summary=""
# Check each submodule
if [ "$TEST262_LATEST" != "$TEST262_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- test262: \`${TEST262_CURRENT:0:7}\` → \`${TEST262_LATEST:0:7}\`\n"
echo "TEST262 needs update: $TEST262_CURRENT -> $TEST262_LATEST"
fi
if [ "$BABEL_LATEST" != "$BABEL_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- babel: \`${BABEL_CURRENT:0:7}\` → \`${BABEL_LATEST:0:7}\`\n"
echo "BABEL needs update: $BABEL_CURRENT -> $BABEL_LATEST"
fi
if [ "$TYPESCRIPT_LATEST" != "$TYPESCRIPT_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- TypeScript: \`${TYPESCRIPT_CURRENT:0:7}\` → \`${TYPESCRIPT_LATEST:0:7}\`\n"
echo "TYPESCRIPT needs update: $TYPESCRIPT_CURRENT -> $TYPESCRIPT_LATEST"
fi
if [ "$ESTREE_CONFORMANCE_LATEST" != "$ESTREE_CONFORMANCE_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- estree-conformance: \`${ESTREE_CONFORMANCE_CURRENT:0:7}\` → \`${ESTREE_CONFORMANCE_LATEST:0:7}\`\n"
echo "ESTREE_CONFORMANCE needs update: $ESTREE_CONFORMANCE_CURRENT -> $ESTREE_CONFORMANCE_LATEST"
fi
if [ "$NODE_COMPAT_TABLE_LATEST" != "$NODE_COMPAT_TABLE_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- node-compat-table: \`${NODE_COMPAT_TABLE_CURRENT:0:7}\` → \`${NODE_COMPAT_TABLE_LATEST:0:7}\`\n"
echo "NODE_COMPAT_TABLE needs update: $NODE_COMPAT_TABLE_CURRENT -> $NODE_COMPAT_TABLE_LATEST"
fi
if [ "$updates_needed" = true ]; then
echo "updates_needed=true" >> $GITHUB_OUTPUT
echo "update_summary<<EOF" >> $GITHUB_OUTPUT
echo -e "$update_summary" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "Updates needed!"
else
echo "updates_needed=false" >> $GITHUB_OUTPUT
echo "No updates needed, all SHAs are current"
fi
- name: Update clone-parallel.mjs with new SHAs
if: steps.check-updates.outputs.updates_needed == 'true'
env:
TEST262_LATEST: ${{ steps.get-shas.outputs.TEST262_LATEST }}
BABEL_LATEST: ${{ steps.get-shas.outputs.BABEL_LATEST }}
TYPESCRIPT_LATEST: ${{ steps.get-shas.outputs.TYPESCRIPT_LATEST }}
ESTREE_CONFORMANCE_LATEST: ${{ steps.get-shas.outputs.ESTREE_CONFORMANCE_LATEST }}
NODE_COMPAT_TABLE_LATEST: ${{ steps.get-shas.outputs.NODE_COMPAT_TABLE_LATEST }}
TEST262_CURRENT: ${{ steps.current-shas.outputs.TEST262_CURRENT }}
BABEL_CURRENT: ${{ steps.current-shas.outputs.BABEL_CURRENT }}
TYPESCRIPT_CURRENT: ${{ steps.current-shas.outputs.TYPESCRIPT_CURRENT }}
ESTREE_CONFORMANCE_CURRENT: ${{ steps.current-shas.outputs.ESTREE_CONFORMANCE_CURRENT }}
NODE_COMPAT_TABLE_CURRENT: ${{ steps.current-shas.outputs.NODE_COMPAT_TABLE_CURRENT }}
run: |
js_script=".github/scripts/clone-parallel.mjs"
# Update each SHA if it changed
if [ "$TEST262_LATEST" != "$TEST262_CURRENT" ]; then
sed -i "s/const TEST262_SHA = \"$TEST262_CURRENT\";/const TEST262_SHA = \"$TEST262_LATEST\";/g" "$js_script"
echo "Updated TEST262_SHA"
fi
if [ "$BABEL_LATEST" != "$BABEL_CURRENT" ]; then
sed -i "s/const BABEL_SHA = \"$BABEL_CURRENT\";/const BABEL_SHA = \"$BABEL_LATEST\";/g" "$js_script"
echo "Updated BABEL_SHA"
fi
if [ "$TYPESCRIPT_LATEST" != "$TYPESCRIPT_CURRENT" ]; then
sed -i "s/const TYPESCRIPT_SHA = \"$TYPESCRIPT_CURRENT\";/const TYPESCRIPT_SHA = \"$TYPESCRIPT_LATEST\";/g" "$js_script"
echo "Updated TYPESCRIPT_SHA"
fi
if [ "$ESTREE_CONFORMANCE_LATEST" != "$ESTREE_CONFORMANCE_CURRENT" ]; then
sed -i "s/const ESTREE_CONFORMANCE_SHA = \"$ESTREE_CONFORMANCE_CURRENT\";/const ESTREE_CONFORMANCE_SHA = \"$ESTREE_CONFORMANCE_LATEST\";/g" "$js_script"
echo "Updated ESTREE_CONFORMANCE_SHA"
fi
if [ "$NODE_COMPAT_TABLE_LATEST" != "$NODE_COMPAT_TABLE_CURRENT" ]; then
sed -i "s/const NODE_COMPAT_TABLE_SHA = \"$NODE_COMPAT_TABLE_CURRENT\";/const NODE_COMPAT_TABLE_SHA = \"$NODE_COMPAT_TABLE_LATEST\";/g" "$js_script"
echo "Updated NODE_COMPAT_TABLE_SHA"
fi
echo "Updated clone-parallel.mjs with new SHAs"
- name: Run format
if: steps.check-updates.outputs.updates_needed == 'true'
run: |
cargo fmt
node --run fmt
- name: Clone submodules and update fixtures
if: steps.check-updates.outputs.updates_needed == 'true'
run: just submodules
- name: Run coverage tests
if: steps.check-updates.outputs.updates_needed == 'true'
env:
UPDATE_SNAPSHOT: 1
run: just coverage
# `just coverage` runs the default task, which skips the runtime suite
# (it needs Node). Run it explicitly so `runtime.snap` is regenerated
# against the new test262 pin; a stale sha header aborts monitor-oxc's
# Test262 job on every run.
- name: Update runtime snapshot
if: steps.check-updates.outputs.updates_needed == 'true'
env:
UPDATE_SNAPSHOT: 1
run: cargo coverage runtime
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
id: app-token
if: steps.check-updates.outputs.updates_needed == 'true'
with:
client-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Create Pull Request
if: steps.check-updates.outputs.updates_needed == 'true'
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: "chore(submodules): update submodule SHAs to latest commits"
branch: update-submodules
branch-suffix: timestamp
base: main
title: "chore(submodules): update submodule SHAs to latest commits"
assignees: Boshen
body: |
Updates submodule dependencies to their latest commits.
## Changes
${{ steps.check-updates.outputs.update_summary }}
This PR is automatically generated by the [update_submodules workflow](https://github.com/oxc-project/oxc/blob/main/.github/workflows/update_submodules.yml).