Skip to content

Update GitHub Actions to Node.js 24 releases; remove dead custom-runner workflow - #1946

Merged
AustinBenoit merged 3 commits into
mainfrom
update-actions-node24
Oct 26, 2026
Merged

AustinBenoit merged 3 commits into
mainfrom
update-actions-node24

Conversation

@AustinBenoit

Copy link
Copy Markdown
Contributor

Why

GitHub is forcing actions that declare Node.js 20 to run on Node.js 24, producing warnings like:

Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/download-artifact@d3f86a1…, actions/upload-artifact@ea165f8…

See https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/. An audit of every uses: in this repo showed almost all pins were on node16/node20 releases, not just the two in the warning.

What

1. Bump every pinned action to its latest release (all runs.using: node24). Full-SHA pins with # ratchet: version comments are kept, matching the existing convention. Each new SHA's action.yml was verified to declare node24.

Action Before → After
actions/checkout v3 → v7
actions/upload-artifact v4 → v7
actions/download-artifact v4 → v8
actions/setup-python v4 → v7
actions/setup-java v3 / v4 → v6
actions/setup-node v3 → v7
actions/cache v3 → v6
actions/create-github-app-token v3.2 → v3.3
nick-invision/retry v2 → nick-fields/retry v4 (repo was renamed)
microsoft/setup-msbuild v1.1 → v3
geekyeggo/delete-artifact v2 → v6
styfle/cancel-workflow-action 0.8.0 → 0.13.1
FirebaseExtended/github-actions/firebase-test-lab v1.4 → v1.5 (its nested auth/setup-gcloud are now node24 and SHA-pinned)

2. Replace unmaintained node12 actions that have no Node.js 24 release with equivalent gh CLI steps (same tokens and permissions, no third-party code to pin):

Removed action Replacement
scherermichael-oss/action-has-permission (checks_secure.yml) gh api repos/…/collaborators/$ACTOR/permission → sets has-permission output
lannonbr/repo-permission-check-action (integration_tests.yml) same API call, fails unless admin
andymckay/cancel-action gh run cancel $GITHUB_RUN_ID
actions-ecosystem/action-add-labels gh api POST repos/…/issues/$PR/labels
buildsville/add-remove-label gh pr edit --remove-label
KhannaAbhinav/random-selector-action + itsOliverBott/assign-pr-reviewers jq … | shuf -n 1 + gh api POST repos/…/pulls/$PR/requested_reviewers

3. Remove update-custom-runner.yml. It targeted self-hosted macOS runners (fplmac1, fplmac2) that are no longer registered (the repo has zero self-hosted runners), was workflow_dispatch-only with no run history, and was never functional: its if: reads github.event.input (singular — not a real context) so the job was always skipped, and its steps only echo their commands.

Breaking-change review

Release notes for each major bump were checked against actual usage:

  • download-artifact v5 path change only affects artifact-ids downloads — not used here (all downloads are by name, incl. the cross-run run-id ones).
  • download-artifact v8 now errors on digest mismatch by default (previously a warning).
  • checkout v6 stores credentials in $RUNNER_TEMP instead of .git/config; nothing in the repo reads extraheader from git config. v7 refuses fork-PR checkout under pull_request_target, but checks_secure.yml checks out the default (base) ref, so it is unaffected.
  • setup-python v7 removed pip-install, setup-java v6 renamed jdkFile, setup-node v6 limited auto-caching to npm — none used.
  • nick-fields/retry v4 has the same inputs as v2.

Validation

  • All workflow YAML parses; every remaining non-local uses: resolves to a node24 (or composite/docker) action.
  • zizmor findings dropped from 66 to 13 on main → this branch; the remaining 13 are pre-existing ref-version-mismatch on lukka/get-cmake@latest (already node24, left as-is).
  • Node 24 actions require Actions Runner ≥ 2.327.1; all jobs run on GitHub-hosted runners, which already satisfy this.

GitHub is forcing actions that target Node.js 20 to run on Node.js 24
(https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/).
Bump every pinned action to its latest release (all `runs.using: node24`),
keeping full-SHA pins with ratchet version comments:

- actions/checkout v3 -> v7
- actions/upload-artifact v4 -> v7
- actions/download-artifact v4 -> v8
- actions/setup-python v4 -> v7
- actions/setup-java v3/v4 -> v6
- actions/setup-node v3 -> v7
- actions/cache v3 -> v6
- actions/create-github-app-token v3.2 -> v3.3
- nick-invision/retry v2 -> nick-fields/retry v4 (repo was renamed)
- microsoft/setup-msbuild v1.1 -> v3
- geekyeggo/delete-artifact v2 -> v6
- styfle/cancel-workflow-action 0.8.0 -> 0.13.1
- FirebaseExtended/github-actions/firebase-test-lab v1.4 -> v1.5

Replace unmaintained node12 actions that have no Node.js 24 release with
equivalent `gh` CLI steps:

- scherermichael-oss/action-has-permission, lannonbr/repo-permission-check-action
  -> `gh api .../collaborators/<actor>/permission`
- andymckay/cancel-action -> `gh run cancel`
- actions-ecosystem/action-add-labels -> `gh api POST .../issues/<n>/labels`
- buildsville/add-remove-label -> `gh pr edit --remove-label`
- KhannaAbhinav/random-selector-action + itsOliverBott/assign-pr-reviewers
  -> `shuf` + `gh api POST .../pulls/<n>/requested_reviewers`
This workflow_dispatch-only workflow targeted two self-hosted macOS
runners (fplmac1, fplmac2) that are no longer registered to the repo
(the repo has zero self-hosted runners). It was also never functional:
its job condition reads `github.event.input` (singular), which is not a
valid context and always evaluates empty, so the job was always skipped,
and its steps only echo the commands they describe.
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Note

Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported.

@AustinBenoit AustinBenoit added skip-release-notes Skip release notes check reviewer-roulette Assign a random reviewer tests-requested: quick Trigger a quick set of integration tests. labels Oct 23, 2026
@github-actions github-actions Bot removed the reviewer-roulette Assign a random reviewer label Oct 23, 2026
@github-actions
github-actions Bot requested a review from a-maurice October 23, 2026 18:07
@github-actions github-actions Bot added tests: in-progress This PR's integration tests are in progress. and removed tests-requested: quick Trigger a quick set of integration tests. labels Oct 23, 2026
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

❌  Integration test FAILED

Requested by @AustinBenoit on commit 0688e04
Last updated: Mon Oct 26 15:32 PDT 2026
View integration test log & download artifacts

Failures Configs
app_check [TEST] [FAILURE] [tvOS] [macos] [tvos_simulator]
(1 failed tests)  FirebaseAppCheckTest.TestGetTokenForcingRefresh
remote_config [TEST] [FLAKINESS] [Android] [1/3 os: macos] [1/2 android_device: emulator_ftl_target]
(1 failed tests)  FirebaseRemoteConfigTest.TestAddOnConfigUpdateListener
[TEST] [FLAKINESS] [Android] [1/3 os: ubuntu] [1/2 android_device: android_target]
(2 failed tests)  FirebaseRemoteConfigTest.TestFetchInterval
  FirebaseRemoteConfigTest.TestFetchSecondsParameter

Add flaky tests to go/fpl-cpp-flake-tracker

@AustinBenoit

AustinBenoit commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor Author

Workflow verification on this branch ✅ complete

Every workflow touched by this PR was exercised on update-actions-node24 (PR triggers, labels, and manual workflow_dispatch). Node 24 deprecation warnings are gone from all of these runs.

Workflow How triggered Run Status
Android Builds pull_request 39969435870 ✅ pass
iOS Builds pull_request 39969435810 ✅ pass
Lint pull_request 39969436242 ✅ pass
Checks pull_request / labeled 39969533899 ✅ pass
CodeQL (Analyze ×4) pull_request 39969433900 ✅ pass (see note 1)
GitHub Actions Scan (zizmor) pull_request_target 39969436250 ✅ pass
Reviewer Roulette reviewer-roulette label 40000769625 ✅ pass — new gh steps removed the label and requested a reviewer
Integration tests (self-cancel path) non-test label 39969533939 ✅ behaved as designed — gh run cancel replacement cancelled the run, same as the old action
Integration tests (quick) tests-requested: quick label 40000774395 19 of 20 jobs ✅ — check_and_prepare passed (new admin-permission check ✅; styfle/cancel-workflow-action@0.13.1 cancelled the superseded run 40000769713 ✅). Only test-ios-macos-26-simulator_target-gameloop fails, on the known-flaky FirebaseAppCheckTest.TestGetTokenForcingRefresh (note 3)
Desktop Builds pull_request 39969435816 ✅ all 10 jobs pass (Linux x86 jobs needed re-runs for the apt-mirror flake, note 2)
CPP binary SDK packaging workflow_dispatch 40000740534 ✅ pass — all 31 jobs incl. create-windows-only-package (the job from the original warning), cleanup-packaging-artifacts (geekyeggo/delete-artifact@v6) and trigger_integration_tests (create-github-app-token@v3 → dispatched the run below)
Integration tests — chained, dispatched by firebase-workflow-trigger[bot] against the packaged SDK via packaging above 40034553992 20 of 22 jobs ✅ — check_and_prepare ✅ with the permission check correctly skipped for the bot actor (note 4); summarize-results ✅ (create-github-app-token@v3 with pull-requests:write). The 2 failures are single App Check SDK tests (note 5)
Update Android and iOS dependencies workflow_dispatch 40000761523 ✅ pass — create-github-app-token@v3 + checkout/push path OK; no dependency changes detected so no PR was created (label step correctly skipped)
Generate Test Report Table workflow_dispatch 40000745628 ✅ pass
Retry Test Failures workflow_dispatch (run_id=39969435816) 40000750666, 40017130124 ✅ pass — second run (run_id=40000774395) performed a real retry: it re-ran the two failed test jobs as attempt 2, and test-tvos-macos-26-tvos_simulator passed on retry
Update Feature Branches workflow_dispatch 40000756176 ✅ pass (no feature_branch/* branches exist, merge job correctly skipped)
Checks (secure) pull_request_target: synchronize — ⏭️ not testable pre-merge: pull_request_target always runs the workflow file from main, so the new permission step only takes effect after merge

Notes

  1. The "CodeQL — 1 high" status on this PR is alert #2633 (actions/cache-poisoning/direct-cache in integration_tests.yml), which is already open on main. It is flagged here only because the actions/cache line moved; nothing about the cache usage changed.

  2. The Linux x86 desktop jobs hit the pre-existing apt-mirror flake (Release passed on the 2nd run, Debug on the 3rd): Install Desktop SDK prerequisites normally takes ~1 min but intermittently exceeds the 15-min nick-fields/retry timeout, at which point the retry action crashes with kill EPERM trying to kill the root-owned sudo apt process (same code path in v2 and v4). The same failure hit #39825804202 on the ab-14_1_0-update PR yesterday. Not related to this change; a follow-up could raise timeout_minutes for that step.

  3. FirebaseAppCheckTest.TestGetTokenForcingRefresh on the iOS/tvOS simulators is a known flaky SDK test, unrelated to CI actions: it is listed in today's nightly report ([C++] Nightly Integration Testing Report #1859, failed 5× on iOS from main), and test-ios-…-simulator_target-gameloop has failed on ~1 in 3 integration runs on main over the past week (e.g. 39928695935, 39881514960, 39852599368). It passed on tvOS on retry; the iOS failure is left as-is rather than re-running again.

  4. Permission check tightened in dc44663. Exercising the same change in firebase-unity-sdk (Update GitHub Actions to Node.js 24 releases firebase-unity-sdk#1552) showed the bot-dispatched integration run (packaging → integration_tests.yml) fails the new gh api …/collaborators/$ACTOR/permission step, because firebase-workflow-trigger[bot] is not a collaborator. The old lannonbr/repo-permission-check-action turned out to be a silent no-op (it reads its input as permision, a typo, so the required level was never set; 404s for non-collaborators were unhandled and never failed the step). The check is now skipped for bot actors (they already need actions:write to dispatch) and scheduled runs, and accepts write or admin so write-level team members can still trigger tests. Verified on the chained run 40034553992: actor firebase-workflow-trigger[bot], step skipped, run proceeds.

  5. Chained-run failures are one SDK test each, not CI: test-tvos-macos-26-tvos_simulator → FirebaseAppCheckTest.TestGetTokenForcingRefresh (the known flake from note 3), and test-desktop-windows-2022-x64-boringssl → FirebaseAppCheckTest.TestDatabaseCreateWorkingPath (same App Check family; that job passed 7/7 on main this past week and passed in this PR's from-source run 40000774395, and the packaged SDK downloaded, built and ran the rest of the suite fine). Not re-running.

@github-actions github-actions Bot added the tests: failed This PR's integration tests failed. label Oct 23, 2026
@firebase-workflow-trigger firebase-workflow-trigger Bot removed the tests: in-progress This PR's integration tests are in progress. label Oct 23, 2026
…rite

The replaced lannonbr/repo-permission-check-action was effectively a no-op:
it read its input as `permision` (typo), so the required level was never
set and every actor passed, and a 404 for non-collaborator actors (bots,
departed users) was an unhandled rejection that did not fail the step.

Enforcing it for real broke the chained run dispatched by
firebase-workflow-trigger[bot] from the packaging workflow, since bots are
not collaborators. Skip the check for bot actors (they already need
actions:write to dispatch) and for scheduled runs (whose actor is whoever
last committed the workflow file), and accept write as well as admin so
existing write-level team members can still trigger tests.
@AustinBenoit
AustinBenoit merged commit 0688e04 into main Oct 26, 2026
57 of 62 checks passed
@github-actions github-actions Bot added tests: in-progress This PR's integration tests are in progress. tests: failed This PR's integration tests failed. and removed tests: failed This PR's integration tests failed. labels Oct 26, 2026
@firebase-workflow-trigger firebase-workflow-trigger Bot removed the tests: in-progress This PR's integration tests are in progress. label Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-release-notes Skip release notes check tests: failed This PR's integration tests failed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants