build #8017
This file contains 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
name: build | |
on: | |
push: | |
branches: | |
- trunk | |
pull_request: | |
merge_group: | |
schedule: | |
# Nightly builds against react-native@nightly at 4:00, Monday through Friday | |
- cron: 0 4 * * 1-5 | |
env: | |
HOMEBREW_NO_INSTALL_CLEANUP: 1 | |
VisualStudioVersion: "17.0" | |
concurrency: | |
# Ensure single build of a pull request. `trunk` should not be affected. | |
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
jobs: | |
lint-commit: | |
name: "lint commit message" | |
runs-on: ubuntu-24.04 | |
if: ${{ github.event_name == 'pull_request' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
- name: Lint commit message | |
run: | | |
npm run lint:commit | |
review: | |
permissions: | |
issues: write # comment on PRs (suggestion-bot) | |
pull-requests: write # create code reviews (suggestion-bot) | |
strategy: | |
matrix: | |
runner: [macos-14, windows-2022] | |
runs-on: ${{ matrix.runner }} | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: node | |
- name: Deduplicate packages | |
run: | | |
yarn dedupe --check | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
- name: Validate generated files | |
if: ${{ github.event_name == 'pull_request' }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
yarn generate:code | |
yarn generate:schema | |
if [[ -n "$GITHUB_TOKEN" ]]; then | |
git diff | yarn suggestion-bot | |
fi | |
git diff --exit-code | |
shell: bash | |
- name: ClangFormat | |
if: ${{ github.event_name == 'pull_request' && runner.os == 'macOS' }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
# TODO: GITHUB_TOKEN is not set if a PR comes from a forked repo. | |
# Ignore errors until we can create a GitHub PAT from a system | |
# account. | |
scripts/build/clang-format-diff.sh || true | |
- name: CocoaPods | |
if: ${{ runner.os == 'macOS' }} | |
run: | | |
echo "::add-matcher::.github/rubocop.json" | |
yarn lint:rb | |
echo "::remove-matcher owner=rubocop::" | |
echo "::add-matcher::.github/minitest.json" | |
yarn test:rb | |
echo "::remove-matcher owner=minitest::" | |
- name: Validate Gradle wrapper | |
uses: gradle/actions/wrapper-validation@v4 | |
- name: Populate Gradle cache | |
uses: ./.github/actions/gradle | |
with: | |
arguments: clean | |
project-root: example | |
- name: JavaScript | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
# TODO: GITHUB_TOKEN is not set if a PR comes from a forked repo. | |
# Ignore errors until we can create a GitHub PAT from a system | |
# account. | |
if [[ ${{ runner.os }} == macOS ]]; then | |
yarn format:js | |
if [[ -n "$GITHUB_TOKEN" ]]; then | |
git diff | yarn suggestion-bot | |
else | |
git diff | |
fi | |
git diff --exit-code | |
echo "::add-matcher::.github/eslint-stylish.json" | |
yarn lint:js | |
echo "::remove-matcher owner=eslint-stylish::" | |
fi | |
yarn tsc | |
yarn test:js | |
shell: bash | |
- name: ktlint | |
if: ${{ github.event_name == 'pull_request' && runner.os == 'macOS' }} | |
run: | | |
brew install ktlint | |
echo "::add-matcher::.github/ktlint.json" | |
yarn lint:kt | |
echo "::remove-matcher owner=ktlint::" | |
- name: SwiftFormat | |
if: ${{ github.event_name == 'pull_request' && runner.os == 'macOS' }} | |
run: | | |
echo "::add-matcher::.github/swiftformat.json" | |
yarn format:swift --lint | |
echo "::remove-matcher owner=swiftformat::" | |
- name: SwiftLint | |
if: ${{ runner.os == 'macOS' }} | |
run: | | |
brew install swiftlint | |
echo "::add-matcher::.github/swiftlint.json" | |
swiftlint | |
echo "::remove-matcher owner=swiftlint::" | |
- name: Smoke test `npx --package react-native-test-app@latest init` | |
run: | | |
node ./react-native-test-app/scripts/init.mjs --destination app --name App -p android -p ios -p macos -p windows | |
working-directory: .. | |
- name: Smoke test `setup-react-native` action | |
uses: ./.github/actions/setup-react-native | |
with: | |
version: nightly | |
timeout-minutes: 60 | |
ios: | |
name: "iOS" | |
runs-on: macos-14 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: ios | |
project-root: example | |
cache-key-prefix: example | |
- name: Set up react-native@nightly | |
if: ${{ github.event_name == 'schedule' }} | |
uses: ./.github/actions/setup-react-native | |
with: | |
version: nightly | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
with: | |
immutable: ${{ github.event_name != 'schedule' }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:ios || yarn build:ios | |
working-directory: example | |
- name: Determine whether the iOS app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.ios != '' }} | |
uses: ./.github/actions/cocoapods | |
with: | |
project-directory: ios | |
working-directory: example | |
- name: Build | |
if: ${{ steps.affected.outputs.ios != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh ios/Example.xcworkspace build-for-testing | |
working-directory: example | |
- name: Test `react-native config` | |
if: ${{ steps.affected.outputs.ios != '' }} | |
run: | | |
node --test test/config.test.mjs | |
working-directory: example | |
- name: Test | |
if: ${{ steps.affected.outputs.ios != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh ios/Example.xcworkspace test-without-building | |
working-directory: example | |
timeout-minutes: 60 | |
ios-template: | |
name: "iOS [template]" | |
strategy: | |
matrix: | |
template: [all, ios] | |
runs-on: macos-14 | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: ios | |
project-root: example | |
cache-key-prefix: template-${{ matrix.template }} | |
- name: Initialize test app | |
uses: ./.github/actions/init-test-app | |
with: | |
platform: ${{ matrix.template }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:ios || yarn build:ios | |
working-directory: template-example | |
- name: Determine whether the iOS app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.ios != '' }} | |
run: | | |
pod install --project-directory=ios | |
working-directory: template-example | |
- name: Build | |
if: ${{ steps.affected.outputs.ios != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh ios/TemplateExample.xcworkspace build | |
working-directory: template-example | |
- name: react-native run-ios | |
if: ${{ steps.affected.outputs.ios != '' }} | |
run: | | |
../scripts/testing/react-native.mjs run-ios | |
working-directory: template-example | |
timeout-minutes: 60 | |
android: | |
name: "Android" | |
strategy: | |
matrix: | |
runner: [ubuntu-24.04, windows-2022] | |
runs-on: ${{ matrix.runner }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: android | |
- name: Set up react-native@nightly | |
if: ${{ github.event_name == 'schedule' }} | |
uses: ./.github/actions/setup-react-native | |
with: | |
version: nightly | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
with: | |
immutable: ${{ github.event_name != 'schedule' }} | |
- name: Test `react-native config` | |
run: | | |
node --test test/config.test.mjs | |
working-directory: example | |
- name: Bundle JavaScript | |
# Metro on nightlies currently fails with "SHA-1 for file index.js is | |
# not computed" so we'll skip this step for now. | |
if: ${{ github.event_name != 'schedule' || runner.os != 'Windows' }} | |
run: | | |
yarn build:android || yarn build:android | |
shell: bash | |
working-directory: example | |
- name: Determine whether the Android app needs to be built | |
id: affected | |
# Nightlies currently fail on Windows because of wrong path separators. | |
if: ${{ github.event_name != 'schedule' || runner.os != 'Windows' }} | |
uses: ./.github/actions/affected | |
- name: Build | |
if: ${{ steps.affected.outputs.android != '' }} | |
uses: ./.github/actions/gradle | |
with: | |
project-root: example | |
timeout-minutes: 60 | |
android-template: | |
name: "Android [template]" | |
strategy: | |
matrix: | |
template: [all, android] | |
runner: [ubuntu-24.04, windows-2022] | |
runs-on: ${{ matrix.runner }} | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: android | |
- name: Initialize test app | |
uses: ./.github/actions/init-test-app | |
with: | |
platform: ${{ matrix.template }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:android || yarn build:android | |
shell: bash | |
working-directory: template-example | |
- name: Determine whether the Android app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Build | |
if: ${{ steps.affected.outputs.android != '' }} | |
uses: ./.github/actions/gradle | |
with: | |
project-root: template-example | |
- name: react-native run-android | |
if: ${{ steps.affected.outputs.android != '' }} | |
run: | | |
../scripts/testing/react-native.mjs run-android | |
working-directory: template-example | |
timeout-minutes: 60 | |
macos: | |
name: "macOS" | |
runs-on: macos-14 | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: macos | |
project-root: example | |
cache-key-prefix: example | |
- name: Set up react-native@canary | |
if: ${{ github.event_name == 'schedule' }} | |
uses: ./.github/actions/setup-react-native | |
with: | |
version: canary-macos | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
with: | |
immutable: ${{ github.event_name != 'schedule' }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:macos || yarn build:macos | |
working-directory: example | |
- name: Determine whether the macOS app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.macos != '' }} | |
uses: ./.github/actions/cocoapods | |
with: | |
project-directory: macos | |
working-directory: example | |
- name: Build x86 | |
if: ${{ steps.affected.outputs.macos != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh macos/Example.xcworkspace build-for-testing | |
working-directory: example | |
- name: Test `react-native config` | |
if: ${{ steps.affected.outputs.macos != '' }} | |
run: | | |
node --test test/config.test.mjs | |
working-directory: example | |
- name: Test | |
# Temporarily disabled due to random failures | |
if: false # ${{ steps.affected.outputs.macos != '' && github.event_name != 'schedule' }} | |
run: | | |
../scripts/build/xcodebuild.sh macos/Example.xcworkspace test-without-building | |
working-directory: example | |
- name: Prepare for arm64 build | |
if: ${{ steps.affected.outputs.macos != '' }} | |
run: | | |
rm -fr macos/build | |
working-directory: example | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.macos != '' }} | |
uses: ./.github/actions/cocoapods | |
with: | |
project-directory: macos | |
working-directory: example | |
- name: Build arm64 | |
if: ${{ steps.affected.outputs.macos != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh macos/Example.xcworkspace build ARCHS=arm64 | |
working-directory: example | |
timeout-minutes: 60 | |
macos-template: | |
name: "macOS [template]" | |
strategy: | |
matrix: | |
template: [all, macos] | |
runs-on: macos-14 | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: macos | |
project-root: example | |
cache-key-prefix: template-${{ matrix.template }} | |
- name: Initialize test app | |
uses: ./.github/actions/init-test-app | |
with: | |
platform: ${{ matrix.template }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:macos || yarn build:macos | |
working-directory: template-example | |
- name: Determine whether the macOS app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.macos != '' }} | |
run: | | |
pod install --project-directory=macos | |
working-directory: template-example | |
- name: Build | |
if: ${{ steps.affected.outputs.macos != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh macos/TemplateExample.xcworkspace build | |
working-directory: template-example | |
timeout-minutes: 60 | |
visionos: | |
name: "visionOS" | |
runs-on: macos-14 | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: visionos | |
project-root: example | |
cache-key-prefix: example | |
xcode-developer-dir: /Applications/Xcode_15.2.app | |
- name: Set up react-native@nightly | |
if: ${{ github.event_name == 'schedule' }} | |
uses: ./.github/actions/setup-react-native | |
with: | |
version: nightly | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
with: | |
immutable: ${{ github.event_name != 'schedule' }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:visionos || yarn build:visionos | |
working-directory: example | |
- name: Determine whether the visionOS app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.visionos != '' }} | |
uses: ./.github/actions/cocoapods | |
with: | |
project-directory: visionos | |
working-directory: example | |
- name: Build | |
if: ${{ steps.affected.outputs.visionos != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh visionos/Example.xcworkspace build-for-testing | |
working-directory: example | |
- name: Test `react-native config` | |
if: ${{ steps.affected.outputs.visionos != '' }} | |
run: | | |
node --test test/config.test.mjs | |
working-directory: example | |
timeout-minutes: 60 | |
visionos-template: | |
name: "visionOS [template]" | |
strategy: | |
matrix: | |
template: [all, visionos] | |
runs-on: macos-14 | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: visionos | |
project-root: example | |
cache-key-prefix: template-${{ matrix.template }} | |
xcode-developer-dir: /Applications/Xcode_15.2.app | |
- name: Initialize test app | |
uses: ./.github/actions/init-test-app | |
with: | |
platform: ${{ matrix.template }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:visionos || yarn build:visionos | |
working-directory: template-example | |
- name: Determine whether the visionOS app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Install Pods | |
if: ${{ steps.affected.outputs.visionos != '' }} | |
run: | | |
pod install --project-directory=visionos | |
working-directory: template-example | |
- name: Build | |
if: ${{ steps.affected.outputs.visionos != '' }} | |
run: | | |
../scripts/build/xcodebuild.sh visionos/TemplateExample.xcworkspace build | |
working-directory: template-example | |
timeout-minutes: 60 | |
windows: | |
name: "Windows" | |
runs-on: windows-2022 | |
strategy: | |
matrix: | |
platform: [ARM64, x64] | |
configuration: [Debug, Release] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: windows | |
- name: Set up react-native@canary | |
if: ${{ github.event_name == 'schedule' }} | |
uses: ./.github/actions/setup-react-native | |
with: | |
version: canary-windows | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
with: | |
immutable: ${{ github.event_name != 'schedule' }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:windows | |
- name: Generate Visual Studio solution | |
run: | | |
yarn install-windows-test-app --use-nuget | |
working-directory: example | |
- name: Test `react-native config` | |
run: | | |
node --test test/config.test.mjs | |
working-directory: example | |
- name: Determine whether the Windows app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Build | |
if: ${{ steps.affected.outputs.windows != '' }} | |
run: | | |
if ("${{ matrix.configuration }}" -eq "Release") { | |
yarn ci:windows --release --arch ${{ matrix.platform }} | |
} else { | |
yarn ci:windows --arch ${{ matrix.platform }} | |
} | |
working-directory: example/windows | |
- name: Test | |
if: ${{ steps.affected.outputs.windows != '' && matrix.platform == 'x64' }} | |
run: | | |
../../../scripts/build/MSBuild.ps1 -Configuration ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Target Build ReactAppTests.vcxproj | |
../../../scripts/build/VSTest.ps1 ${{ matrix.platform }}\${{ matrix.configuration }}\ReactAppTests.dll | |
working-directory: example/windows/ReactAppTests | |
timeout-minutes: 60 | |
windows-template: | |
name: "Windows [template]" | |
runs-on: windows-2022 | |
if: ${{ github.event_name != 'schedule' }} | |
strategy: | |
matrix: | |
template: [all, windows] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
with: | |
platform: windows | |
- name: Initialize test app | |
uses: ./.github/actions/init-test-app | |
with: | |
platform: ${{ matrix.template }} | |
- name: Bundle JavaScript | |
run: | | |
yarn build:windows | |
- name: Generate Visual Studio solution | |
run: | | |
yarn install-windows-test-app --use-nuget | |
working-directory: template-example | |
- name: Determine whether the Windows app needs to be built | |
id: affected | |
uses: ./.github/actions/affected | |
- name: Build | |
if: ${{ steps.affected.outputs.windows != '' }} | |
run: | | |
yarn windows --logging --no-packager --no-launch --no-deploy | |
working-directory: template-example | |
timeout-minutes: 60 | |
release: | |
permissions: | |
contents: write # create releases (semantic-release) | |
id-token: write # enable use of OIDC for npm provenance (semantic-release) | |
needs: | |
- review | |
- ios | |
- ios-template | |
- android | |
- android-template | |
- macos | |
- macos-template | |
- windows | |
- windows-template | |
runs-on: ubuntu-24.04 | |
if: ${{ github.event_name != 'schedule' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
filter: blob:none | |
fetch-depth: 0 | |
- name: Set up toolchain | |
uses: ./.github/actions/setup-toolchain | |
- name: Install npm dependencies | |
uses: ./.github/actions/yarn | |
- name: Verify tarball content | |
run: | | |
yarn test test/pack.test.ts | |
- name: Release | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
run: | | |
yarn semantic-release | |
autobot: | |
name: "Autobot" | |
permissions: | |
contents: read | |
pull-requests: write | |
if: ${{ github.event_name == 'pull_request' }} | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Label | |
uses: actions/labeler@v5.0.0 | |
with: | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
sync-labels: true | |
continue-on-error: true |