Repository navigation
ci: move GitHub Actions to Node 24 runtimes - #667
Merged
Merged
Conversation
GitHub removed the Node 20 Actions runtime on 2026-09-23; node20 actions now run forced on Node 24 with a deprecation warning. Move every action this repo pins to a release whose action.yml declares `runs.using: node24`: - actions/checkout v4 -> v7, actions/setup-node v4 -> v7, actions/cache v4 -> v6, actions/upload-artifact v4.6.2 -> v7.0.2 - maierj/fastlane-action v3.1.0 -> v3.2.0 - cycjimmy/semantic-release-action v4.2.0 -> v6.0.0 (semantic_version stays 25.0.9). v7/v8 shipped 10 releases in two weeks around an ESM rewrite; v6 already runs on node24 and matches customerio-ios. - slackapi/slack-github-action v1.26.0 -> v4.0.0, with the webhook URL and type moved from env to the `webhook`/`webhook-type` inputs v2+ require. v2+ no longer fails the step on a Slack error: the two failure alerts opt back in with `errors: true`; the success notices keep the default so a Slack outage cannot skip deploy-npm or report a published release as failed. - ataylorme/eslint-annotate-action v3 -> 4.0.0, passing the token through `github-token` (the old `repo-token` input never existed) - levibostian/action-conventional-pr-linter (no node24 release) -> amannn/action-semantic-pull-request v6.1.1 - kenji-miyake/setup-sd (no node24 release) -> local composite .github/actions/setup-sd that installs a checksum-verified sd 1.1.0 Refs MBL-2397 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Match the shared-CI choice for every mobile repo: the old linter commented on invalid titles, so add marocchino/sticky-pull-request-comment v3.0.5 (node24) to post fixed help text when amannn reports a title error, and to delete it once the title passes. Both steps are best effort (`continue-on-error`): fork and Dependabot runs get a read-only token. Refs MBL-2397 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sydneycollins-cio
approved these changes
Oct 23, 2026
added 2 commits
October 23, 2026 11:48
# Conflicts: # .github/workflows/react-native-scene-e2e.yml
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs MBL-2397
GitHub removed the Node 20 Actions runtime on 2026-09-23. Every node20 action now runs forced on Node 24 with a deprecation warning. This PR moves every action this repo pins to a release whose
action.ymldeclaresruns.using: node24. It replaces Dependabot's stale #598, which this PR doesn't touch.Changes
actions/checkoutv4,v4.2.2(SHA)v7,v7.0.1(SHA)actions/setup-nodev4,v4.4.0(SHA)v7,v7.1.0(SHA)packageManagerfield, so v5+ auto-caching stays offactions/cachev4v6actions/upload-artifactv4.6.2v7.0.2maierj/fastlane-actionv3.1.0v3.2.0cycjimmy/semantic-release-actionv4.2.0v6.0.0semantic_versionstays25.0.9. v6 already runs on node24; v7/v8 shipped 10 releases in two weeks around an ESM rewrite. Matches customerio-ios.slackapi/slack-github-actionv1.26.0v4.0.0SLACK_WEBHOOK_URL/SLACK_WEBHOOK_TYPEenv to thewebhook+webhook-type: incoming-webhookinputs v2+ requireataylorme/eslint-annotate-actionv34.0.0repo-token→github-token;repo-tokenwas never an input of v3 eitherlevibostian/action-conventional-pr-linterv4.0.1amannn/action-semantic-pull-requestv6.1.1+marocchino/sticky-pull-request-commentv3.0.5failure() && error_message != '', deleted once the title passes, both comment stepscontinue-on-error(read-only tokens on fork and Dependabot runs). Job idlint-pr-titleis unchanged, so the required check name stays the same.kenji-miyake/setup-sdv2.0.0.github/actions/setup-sdchmln/sd1.1.0 (musl, x64/arm64) and checks it against the SHA-256 from the release asset metadata. 1.1.0 is the version setup-sd'slatestinstalled.actions/create-github-app-token,ruby/setup-rubyand thepeter-evans/*actions already run on node24 and are unchanged.Slack error handling (behaviour change, deliberate)
v1 failed the step when Slack rejected a message. v2+ only logs a warning unless
errors: trueis set.errors: true. The job is already failing, so this just makes a broken webhook visible.false. Indeploy-git-tag, a failed success notice would fail the job and skipdeploy-npm(needsrequires success), so a Slack outage could block publishing a tag that already exists. Indeploy-npm, npm already has the release by then.Verification
gh api repos/<action>/contents/action.yml?ref=<ref>→using: node24).actionlintwith no new findings. The only output is the same 41 shellcheck info/style notes thatmainproduces.${{ }}expressions are substituted. v4 tries YAML first, then JSON.--strip-components=1member path.deploy-sdk.yml(semantic-release v6, Slack v4, setup-sd on the release path) runs only on push tomain, so it can't run from this PR. The Android sample-app build in Publish Test Sample Apps exercisessetup-sdon Linux on this PR.Expected CI notes
react-native-scene-e2e.ymlchanged. It will fail exactly as the nightly has since 2026-09-18 (no available 'iPhone 17 Pro' simulator on iOS 27). The fix is in a separate PR (simulator selection).Still on node20 outside this repo (not changed here)
customerio/customerio-android/.github/actions/setup-android@main: setup-java v4, android-actions/setup-android v3.2.2, gradle/actions v4.3.1. The customerio-android session owns it.customerio/mobile-ci-tools/github-actions/ios/setup-ios/v1@main: setup-xcode v1.6.0.customerio/mobile-ci-tools/github-actions/slack-notify-sample-app/v1@main: slack-github-action v2.0.0.These still run, forced onto Node 24 with a warning. They need updating in their own repos.
Codex review
Codex (gpt-6.1-sol, high) did an adversarial review of this diff:
errors: trueis on the two failure alerts. The success notices keep the default on purpose, for the reason above. Codex's other suggestion,errors: trueon all four, would recreate the v1 behaviour where a Slack outage skipsdeploy-npm.feature:titles (P3): rebutted, kept the default type list. The shared-CI session reached the same conclusion for all mobile repos by replaying 1,847 historical PR titles through both parsers..releaserc.jsonsets noreleaseRules, and@semantic-release/commit-analyzer's defaults release onfeatbut notfeature. Afeature:title used to pass lint and then merge without cutting a release. Nofeature:commit exists in this repo's history.Codex also found these fine: checkout v6+ credential persistence with the App token for semantic-release pushes, npm OIDC on setup-node v7, Slack payload/webhook contract,
!breaking marker and fork PRs on the new linter, local action resolution from nested reusable workflows and theworking-directory: exampledefault, GNU tar member stripping, and sd 1.1 regex compatibility with the existing single-line patterns.Re-review after the sticky-comment steps, semantic-release v6 and the Slack
errorssplit: no actionable findings.if:conditions (a skipped or cancelled lint is neithersuccessnorfailure()), fork/Dependabot handling, the absence of any interpolated PR-controlled text, and the Slack placement.error_messageis set bysetOutput('error_message', …)indist/index.jsat48f25628, checked viagh api.CI on this PR
Everything passes except full-scene-e2e (
no available 'iPhone 17 Pro'), which #668 fixes. The Android sample-app build exercised the newsetup-sdcomposite, and both iOS sample-app builds passed.🤖 Generated with Claude Code