name: Publish Release on: push: tags: - "v0.*.*" # This should match v0.X.Y - "v0.*.*-rc.*" # This should match v0.X.Y-RC.0 jobs: set_release_type: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' outputs: RELEASE_TYPE: ${{ steps.set_release_type.outputs.RELEASE_TYPE }} env: EVENT_NAME: ${{ github.event_name }} REF: ${{ github.ref }} steps: - id: set_release_type run: | echo "Setting release type to release" echo "RELEASE_TYPE=release" >> $GITHUB_OUTPUT prepare_hermes_workspace: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' env: HERMES_WS_DIR: /tmp/hermes HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion outputs: react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }} hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }} steps: - name: Checkout uses: actions/checkout@v4 - name: Prepare Hermes Workspace id: prepare-hermes-workspace uses: ./.github/actions/prepare-hermes-workspace with: hermes-ws-dir: ${{ env.HERMES_WS_DIR }} hermes-version-file: ${{ env.HERMES_VERSION_FILE }} build_hermesc_apple: runs-on: macos-14 needs: prepare_hermes_workspace env: HERMES_WS_DIR: /tmp/hermes steps: - name: Checkout uses: actions/checkout@v4 - name: Build HermesC Apple uses: ./.github/actions/build-hermesc-apple with: hermes-version: ${{ needs.prepare_hermes_workspace.output.hermes-version }} react-native-version: ${{ needs.prepare_hermes_workspace.output.react-native-version }} build_apple_slices_hermes: runs-on: macos-14 needs: [build_hermesc_apple, prepare_hermes_workspace] env: HERMES_WS_DIR: /tmp/hermes HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin IOS_DEPLOYMENT_TARGET: "15.1" XROS_DEPLOYMENT_TARGET: "1.0" MAC_DEPLOYMENT_TARGET: "10.15" strategy: fail-fast: false matrix: flavor: [Debug, Release] slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] steps: - name: Checkout uses: actions/checkout@v4 - name: Build Slice uses: ./.github/actions/build-apple-slices-hermes with: flavor: ${{ matrix.flavor }} slice: ${{ matrix.slice}} hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} build_hermes_macos: runs-on: macos-14 needs: [build_apple_slices_hermes, prepare_hermes_workspace] env: HERMES_WS_DIR: /tmp/hermes HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin continue-on-error: true strategy: fail-fast: false matrix: flavor: [Debug, Release] steps: - name: Checkout uses: actions/checkout@v4 - name: Build Hermes MacOS uses: ./.github/actions/build-hermes-macos with: hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} flavor: ${{ matrix.flavor }} prebuild_apple_dependencies: if: github.repository == 'facebook/react-native' uses: ./.github/workflows/prebuild-ios-dependencies.yml secrets: inherit prebuild_react_native_core: uses: ./.github/workflows/prebuild-ios-core.yml secrets: inherit needs: [prebuild_apple_dependencies, build_hermes_macos] build_hermesc_linux: runs-on: ubuntu-latest needs: prepare_hermes_workspace env: HERMES_WS_DIR: /tmp/hermes HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin steps: - name: Checkout uses: actions/checkout@v4 - name: Build HermesC Linux uses: ./.github/actions/build-hermesc-linux with: hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} build_hermesc_windows: runs-on: windows-2025 needs: prepare_hermes_workspace env: HERMES_WS_DIR: 'C:\tmp\hermes' HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin' HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin' ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip" MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin' CMAKE_DIR: 'C:\Program Files\CMake\bin' steps: - name: Checkout uses: actions/checkout@v4 - name: Build HermesC Windows uses: ./.github/actions/build-hermesc-windows with: hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} build_npm_package: runs-on: 8-core-ubuntu needs: [ set_release_type, prepare_hermes_workspace, build_hermes_macos, build_hermesc_linux, build_hermesc_windows, prebuild_apple_dependencies, prebuild_react_native_core, ] container: image: reactnativecommunity/react-native-android:latest env: TERM: "dumb" GRADLE_OPTS: "-Dorg.gradle.daemon=false" # By default we only build ARM64 to save time/resources. For release/nightlies, we override this value to build all archs. ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a" env: HERMES_WS_DIR: /tmp/hermes GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }} ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }} ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }} ORG_GRADLE_PROJECT_SONATYPE_USERNAME: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPE_USERNAME }} ORG_GRADLE_PROJECT_SONATYPE_PASSWORD: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPE_PASSWORD }} REACT_NATIVE_BOT_GITHUB_TOKEN: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true - name: Build and Publish NPM Package uses: ./.github/actions/build-npm-package with: hermes-ws-dir: ${{ env.HERMES_WS_DIR }} release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} gha-npm-token: ${{ env.GHA_NPM_TOKEN }} gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Publish @react-native-community/template id: publish-template-to-npm uses: actions/github-script@v6 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | const {publishTemplate} = require('./.github/workflow-scripts/publishTemplate.js') const version = "${{ github.ref_name }}" const isDryRun = false await publishTemplate(github, version, isDryRun); - name: Wait for template to be published timeout-minutes: 3 uses: actions/github-script@v6 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | const {verifyPublishedTemplate, isLatest} = require('./.github/workflow-scripts/publishTemplate.js') const version = "${{ github.ref_name }}" await verifyPublishedTemplate(version, isLatest()); - name: Update rn-diff-purge to generate upgrade-support diff run: | curl -X POST https://api.github.com/repos/react-native-community/rn-diff-purge/dispatches \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: Bearer $REACT_NATIVE_BOT_GITHUB_TOKEN" \ -d "{\"event_type\": \"publish\", \"client_payload\": { \"version\": \"${{ github.ref_name }}\" }}" - name: Verify Release is on NPM timeout-minutes: 3 uses: actions/github-script@v6 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | const {verifyReleaseOnNpm} = require('./.github/workflow-scripts/verifyReleaseOnNpm.js'); const {isLatest} = require('./.github/workflow-scripts/publishTemplate.js'); const version = "${{ github.ref_name }}"; await verifyReleaseOnNpm(version, isLatest()); - name: Verify that artifacts are on Maven uses: actions/github-script@v6 with: script: | const {verifyArtifactsAreOnMaven} = require('./.github/workflow-scripts/verifyArtifactsAreOnMaven.js'); const version = "${{ github.ref_name }}"; await verifyArtifactsAreOnMaven(version); generate_changelog: needs: build_npm_package uses: ./.github/workflows/generate-changelog.yml secrets: inherit bump_podfile_lock: needs: build_npm_package uses: ./.github/workflows/bump-podfile-lock.yml secrets: inherit create_draft_release: needs: generate_changelog uses: ./.github/workflows/create-draft-release.yml secrets: inherit