mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
42735717b5
Summary: The cache checks in GHA were performed against bool values, while the actual values are strings. So the checks were always failing and all the steps were executed, even when not necessary. The reason why it was failing is because, with this setup, when a cache is hit, some steps were skipped in previous jobs, making following jobs trying to execute code on not-existing files. ## Changelog: [Internal] - Fix cache for build_hermes_macos Pull Request resolved: https://github.com/facebook/react-native/pull/45127 Test Plan: GHA are green again Reviewed By: blakef Differential Revision: D58947838 Pulled By: cipolleschi fbshipit-source-id: 8dba216e72a3034fd4c1484418d37bfb78cf314d
665 lines
31 KiB
YAML
665 lines
31 KiB
YAML
name: Nightly
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
# nightly build @ 2:15 AM UTC
|
|
schedule:
|
|
- cron: '15 2 * * *'
|
|
|
|
|
|
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 nightly"
|
|
echo "RELEASE_TYPE=nightly" >> $GITHUB_OUTPUT
|
|
|
|
prepare_hermes_workspace:
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
HERMES_WS_DIR: /tmp/hermes
|
|
HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion
|
|
BUILD_FROM_SOURCE: true
|
|
GRADLE_OPTS: '-Dorg.gradle.daemon=false'
|
|
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.1.1
|
|
- name: Prepare Hermes Workspace
|
|
id: prepare-hermes-workspace
|
|
uses: ./.github/actions/prepare-hermes-workspace
|
|
|
|
build_hermesc_apple:
|
|
runs-on: macos-13
|
|
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.1.1
|
|
- name: Restore Hermes workspace
|
|
uses: ./.github/actions/restore-hermes-workspace
|
|
- name: Hermes apple cache
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_host_hermesc
|
|
key: v2-hermesc-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
- name: Build HermesC Apple
|
|
run: |
|
|
cd ./packages/react-native/sdks/hermes || exit 1
|
|
. ./utils/build-apple-framework.sh
|
|
build_host_hermesc_if_needed
|
|
|
|
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
|
|
continue-on-error: true
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
flavor: [Debug, Release]
|
|
slice: [macosx, iphoneos, iphonesimulator, catalyst, xros, xrsimulator]
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4.1.1
|
|
- name: Setup xcode
|
|
uses: ./.github/actions/setup-xcode
|
|
- name: Cache setup
|
|
id: cache_setup
|
|
uses: ./.github/actions/cache_setup
|
|
with:
|
|
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
|
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
- name: Restore Hermes workspace
|
|
uses: ./.github/actions/restore-hermes-workspace
|
|
- name: Check if the required artifacts already exist
|
|
id: check_if_apple_artifacts_are_there
|
|
run: |
|
|
FLAVOR="${{ matrix.flavor }}"
|
|
echo "Flavor is $FLAVOR"
|
|
OSX_BIN="/tmp/hermes/osx-bin/$FLAVOR"
|
|
DSYM="/tmp/hermes/dSYM/$FLAVOR"
|
|
HERMES="/tmp/hermes/hermes-runtime-darwin/hermes-ios-$FLAVOR.tar.gz"
|
|
|
|
if [[ -d "$OSX_BIN" ]] && \
|
|
[[ -d "$DSYM" ]] && \
|
|
[[ -f "$HERMES" ]]; then
|
|
|
|
echo "Artifacts are there!"
|
|
echo "ARTIFACTS_EXIST=true" >> $GITHUB_ENV
|
|
echo "ARTIFACTS_EXIST=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
- name: Build the Hermes ${{ matrix.slice }} frameworks
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: |
|
|
cd ./packages/react-native/sdks/hermes || exit 1
|
|
SLICE=${{ matrix.slice }}
|
|
FLAVOR=${{ matrix.flavor }}
|
|
FINAL_PATH=build_"$SLICE"_"$FLAVOR"
|
|
echo "Final path for this slice is: $FINAL_PATH"
|
|
|
|
if [[ -d "$FINAL_PATH" ]]; then
|
|
echo "[HERMES] Skipping! Found the requested slice at $FINAL_PATH".
|
|
exit 0
|
|
fi
|
|
|
|
if [[ "$ARTIFACTS_EXIST" ]]; then
|
|
echo "[HERMES] Skipping! Artifacts exists already."
|
|
exit 0
|
|
fi
|
|
|
|
if [[ "$SLICE" == "macosx" ]]; then
|
|
echo "[HERMES] Building Hermes for MacOS"
|
|
BUILD_TYPE="${{ matrix.flavor }}" ./utils/build-mac-framework.sh
|
|
else
|
|
echo "[HERMES] Building Hermes for iOS: $SLICE"
|
|
BUILD_TYPE="${{ matrix.flavor }}" ./utils/build-ios-framework.sh "$SLICE"
|
|
fi
|
|
|
|
echo "Moving from build_$SLICE to $FINAL_PATH"
|
|
mv build_"$SLICE" "$FINAL_PATH"
|
|
|
|
# check whether everything is there
|
|
if [[ -d "$FINAL_PATH/API/hermes/hermes.framework" ]]; then
|
|
echo "Successfully built hermes.framework for $SLICE in $FLAVOR"
|
|
else
|
|
echo "Failed to built hermes.framework for $SLICE in $FLAVOR"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -d "$FINAL_PATH/API/hermes/hermes.framework.dSYM" ]]; then
|
|
echo "Successfully built hermes.framework.dSYM for $SLICE in $FLAVOR"
|
|
else
|
|
echo "Failed to built hermes.framework.dSYM for $SLICE in $FLAVOR"
|
|
echo "Please try again"
|
|
exit 1
|
|
fi
|
|
- name: Save slice cache
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
|
|
|
|
build_hermes_macos:
|
|
runs-on: macos-13
|
|
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.1.1
|
|
- name: Setup xcode
|
|
uses: ./.github/actions/setup-xcode
|
|
- name: Setup node.js
|
|
uses: ./.github/actions/setup-node
|
|
- name: Cache setup
|
|
id: cache_setup
|
|
uses: ./.github/actions/cache_setup
|
|
with:
|
|
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
|
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
- name: Restore Hermes workspace
|
|
uses: ./.github/actions/restore-hermes-workspace
|
|
- name: Check if the required artifacts already exist
|
|
id: check_if_apple_artifacts_are_there
|
|
run: |
|
|
FLAVOR="${{ matrix.flavor }}"
|
|
echo "Flavor is $FLAVOR"
|
|
OSX_BIN="/tmp/hermes/osx-bin/$FLAVOR"
|
|
DSYM="/tmp/hermes/dSYM/$FLAVOR"
|
|
HERMES="/tmp/hermes/hermes-runtime-darwin/hermes-ios-$FLAVOR.tar.gz"
|
|
|
|
if [[ -d "$OSX_BIN" ]] && \
|
|
[[ -d "$DSYM" ]] && \
|
|
[[ -f "$HERMES" ]]; then
|
|
|
|
echo "Artifacts are there!"
|
|
echo "ARTIFACTS_EXIST=true" >> $GITHUB_ENV
|
|
echo "ARTIFACTS_EXIST=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
- name: Yarn- Install Dependencies
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: yarn install --non-interactive
|
|
- name: Slice cache macosx
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_macosx_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-macosx-${{ matrix.flavor }}
|
|
- name: Slice cache iphoneos
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_iphoneos_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-iphoneos-${{ matrix.flavor }}
|
|
- name: Slice cache iphonesimulator
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_iphonesimulator_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-iphonesimulator-${{ matrix.flavor }}
|
|
- name: Slice cache catalyst
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_catalyst_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-catalyst-${{ matrix.flavor }}
|
|
- name: Slice cache xros
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_xros_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-xros-${{ matrix.flavor }}
|
|
- name: Slice cache xrsimulator
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
path: ./packages/react-native/sdks/hermes/build_xrsimulator_${{ matrix.flavor }}
|
|
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-xrsimulator-${{ matrix.flavor }}
|
|
- name: Move back build folders
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: |
|
|
ls -l ./packages/react-native/sdks/hermes
|
|
cd ./packages/react-native/sdks/hermes || exit 1
|
|
mv build_macosx_${{ matrix.flavor }} build_macosx
|
|
mv build_iphoneos_${{ matrix.flavor }} build_iphoneos
|
|
mv build_iphonesimulator_${{ matrix.flavor }} build_iphonesimulator
|
|
mv build_catalyst_${{ matrix.flavor }} build_catalyst
|
|
mv build_xros_${{ matrix.flavor }} build_xros
|
|
mv build_xrsimulator_${{ matrix.flavor }} build_xrsimulator
|
|
- name: Prepare destroot folder
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: |
|
|
cd ./packages/react-native/sdks/hermes || exit 1
|
|
. ./utils/build-apple-framework.sh
|
|
prepare_dest_root_for_ci
|
|
- name: Create fat framework for iOS
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: |
|
|
cd ./packages/react-native/sdks/hermes || exit 1
|
|
echo "[HERMES] Creating the universal framework"
|
|
chmod +x ./utils/build-ios-framework.sh
|
|
./utils/build-ios-framework.sh build_framework
|
|
- name: Package the Hermes Apple frameworks
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: |
|
|
BUILD_TYPE="${{ matrix.flavor }}"
|
|
echo "Packaging Hermes Apple frameworks for $BUILD_TYPE build type"
|
|
|
|
TARBALL_OUTPUT_DIR=$(mktemp -d /tmp/hermes-tarball-output-XXXXXXXX)
|
|
|
|
TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE")
|
|
|
|
echo "Packaging Hermes Apple frameworks for $BUILD_TYPE build type"
|
|
|
|
TARBALL_OUTPUT_PATH=$(node ./packages/react-native/scripts/hermes/create-tarball.js \
|
|
--inputDir ./packages/react-native/sdks/hermes \
|
|
--buildType "$BUILD_TYPE" \
|
|
--outputDir $TARBALL_OUTPUT_DIR)
|
|
|
|
echo "Hermes tarball saved to $TARBALL_OUTPUT_PATH"
|
|
|
|
mkdir -p $HERMES_TARBALL_ARTIFACTS_DIR
|
|
cp $TARBALL_OUTPUT_PATH $HERMES_TARBALL_ARTIFACTS_DIR/.
|
|
|
|
mkdir -p /tmp/hermes/osx-bin/${{ matrix.flavor }}
|
|
cp ./packages/react-native/sdks/hermes/build_macosx/bin/* /tmp/hermes/osx-bin/${{ matrix.flavor }}
|
|
ls -lR /tmp/hermes/osx-bin/
|
|
- name: Upload darwin artifacts
|
|
uses: actions/upload-artifact@v4.3.1
|
|
with:
|
|
name: hermes-darwin-bin-${{ matrix.flavor }}
|
|
path: /tmp/hermes/hermes-runtime-darwin
|
|
- name: Upload osx-bin
|
|
uses: actions/upload-artifact@v4.3.1
|
|
with:
|
|
name: hermes-osx-bin-${{ matrix.flavor }}
|
|
path: /tmp/hermes/osx-bin
|
|
- name: Create dSYM archive
|
|
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
|
run: |
|
|
FLAVOR=${{ matrix.flavor }}
|
|
WORKING_DIR="/tmp/hermes_tmp/dSYM/$FLAVOR"
|
|
|
|
mkdir -p "$WORKING_DIR/macosx"
|
|
mkdir -p "$WORKING_DIR/catalyst"
|
|
mkdir -p "$WORKING_DIR/iphoneos"
|
|
mkdir -p "$WORKING_DIR/iphonesimulator"
|
|
mkdir -p "$WORKING_DIR/xros"
|
|
mkdir -p "$WORKING_DIR/xrsimulator"
|
|
|
|
cd ./packages/react-native/sdks/hermes || exit 1
|
|
|
|
DSYM_FILE_PATH=API/hermes/hermes.framework.dSYM
|
|
cp -r build_macosx/$DSYM_FILE_PATH "$WORKING_DIR/macosx/"
|
|
cp -r build_catalyst/$DSYM_FILE_PATH "$WORKING_DIR/catalyst/"
|
|
cp -r build_iphoneos/$DSYM_FILE_PATH "$WORKING_DIR/iphoneos/"
|
|
cp -r build_iphonesimulator/$DSYM_FILE_PATH "$WORKING_DIR/iphonesimulator/"
|
|
cp -r build_xros/$DSYM_FILE_PATH "$WORKING_DIR/xros/"
|
|
cp -r build_xrsimulator/$DSYM_FILE_PATH "$WORKING_DIR/xrsimulator/"
|
|
|
|
DEST_DIR="/tmp/hermes/dSYM/$FLAVOR"
|
|
tar -C "$WORKING_DIR" -czvf "hermes.framework.dSYM" .
|
|
|
|
mkdir -p "$DEST_DIR"
|
|
mv "hermes.framework.dSYM" "$DEST_DIR"
|
|
- name: Upload hermes dSYM artifacts
|
|
uses: actions/upload-artifact@v4.3.1
|
|
with:
|
|
name: hermes-dSYM-${{ matrix.flavor }}
|
|
path: /tmp/hermes/dSYM/${{ matrix.flavor }}
|
|
|
|
build_hermesc_linux:
|
|
runs-on: ubuntu-latest
|
|
needs: prepare_hermes_workspace
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4.1.1
|
|
- name: Install dependencies
|
|
run: |
|
|
sudo apt update
|
|
sudo apt install -y git openssh-client cmake build-essential \
|
|
libreadline-dev libicu-dev jq zip python3
|
|
- name: Cache setup
|
|
id: cache_setup
|
|
uses: ./.github/actions/cache_setup
|
|
with:
|
|
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
|
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
- name: Linux cache
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
key: v1-hermes-${{ github.job }}-linux-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
path: |
|
|
/tmp/hermes/linux64-bin/
|
|
/tmp/hermes/hermes/destroot/
|
|
- name: Set up workspace
|
|
run: |
|
|
mkdir -p /tmp/hermes/linux64-bin
|
|
- name: Build HermesC for Linux
|
|
run: |
|
|
if [ -f /tmp/hermes/linux64-bin/hermesc ]; then
|
|
echo 'Skipping; Clean "/tmp/hermes/linux64-bin" to rebuild.'
|
|
else
|
|
cd /tmp/hermes
|
|
cmake -S hermes -B build -DHERMES_STATIC_LINK=ON -DCMAKE_BUILD_TYPE=Release -DHERMES_ENABLE_TEST_SUITE=OFF \
|
|
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DCMAKE_CXX_FLAGS=-s -DCMAKE_C_FLAGS=-s \
|
|
-DCMAKE_EXE_LINKER_FLAGS="-Wl,--whole-archive -lpthread -Wl,--no-whole-archive"
|
|
cmake --build build --target hermesc -j 4
|
|
cp /tmp/hermes/build/bin/hermesc /tmp/hermes/linux64-bin/.
|
|
fi
|
|
- name: Upload linux artifacts
|
|
uses: actions/upload-artifact@v4.3.0
|
|
with:
|
|
name: hermes-linux-bin
|
|
path: /tmp/hermes/linux64-bin
|
|
|
|
build_hermesc_windows:
|
|
runs-on: windows-2019
|
|
needs: prepare_hermes_workspace
|
|
env:
|
|
HERMES_WS_DIR: 'D:\tmp\hermes'
|
|
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.1.1
|
|
- name: Cache setup
|
|
id: cache_setup
|
|
uses: ./.github/actions/cache_setup
|
|
with:
|
|
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
|
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
- name: Windows cache
|
|
uses: actions/cache@v4.0.0
|
|
with:
|
|
key: v2-hermes-${{ github.job }}-windows-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
path: |
|
|
D:\tmp\hermes\win64-bin\
|
|
D:\tmp\hermes\hermes\icu\
|
|
D:\tmp\hermes\hermes\deps\
|
|
D:\tmp\hermes\hermes\build_release\
|
|
- name: setup-msbuild
|
|
uses: microsoft/setup-msbuild@v1.3.2
|
|
- name: Set up workspace
|
|
run: |
|
|
#New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR
|
|
New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\icu
|
|
New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\deps
|
|
New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\win64-bin
|
|
#New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\hermes
|
|
#New-Item -ItemType SymbolicLink -ErrorAction SilentlyContinue -Target tmp\hermes\hermes -Path $Env:HERMES_WS_DIR -Name hermes
|
|
- name: Build HermesC for Windows
|
|
run: |
|
|
if (-not(Test-Path -Path $Env:HERMES_WS_DIR\win64-bin\hermesc.exe)) {
|
|
choco install --no-progress cmake --version 3.14.7
|
|
if (-not $?) { throw "Failed to install CMake" }
|
|
|
|
cd $Env:HERMES_WS_DIR\icu
|
|
# If Invoke-WebRequest shows a progress bar, it will fail with
|
|
# Win32 internal error "Access is denied" 0x5 occurred [...]
|
|
$progressPreference = 'silentlyContinue'
|
|
Invoke-WebRequest -Uri "$Env:ICU_URL" -OutFile "icu.zip"
|
|
Expand-Archive -Path "icu.zip" -DestinationPath "."
|
|
|
|
cd $Env:HERMES_WS_DIR
|
|
Copy-Item -Path "icu\bin64\icu*.dll" -Destination "deps"
|
|
# Include MSVC++ 2015 redistributables
|
|
Copy-Item -Path "c:\windows\system32\msvcp140.dll" -Destination "deps"
|
|
Copy-Item -Path "c:\windows\system32\vcruntime140.dll" -Destination "deps"
|
|
Copy-Item -Path "c:\windows\system32\vcruntime140_1.dll" -Destination "deps"
|
|
|
|
$Env:PATH += ";$Env:CMAKE_DIR;$Env:MSBUILD_DIR"
|
|
$Env:ICU_ROOT = "$Env:HERMES_WS_DIR\icu"
|
|
|
|
cmake -S hermes -B build_release -G 'Visual Studio 16 2019' -Ax64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DHERMES_ENABLE_WIN10_ICU_FALLBACK=OFF
|
|
if (-not $?) { throw "Failed to configure Hermes" }
|
|
echo "Running windows build..."
|
|
cd build_release
|
|
cmake --build . --target hermesc --config Release
|
|
if (-not $?) { throw "Failed to build Hermes" }
|
|
|
|
echo "Copying hermesc.exe to win64-bin"
|
|
cd $Env:HERMES_WS_DIR
|
|
Copy-Item -Path "build_release\bin\Release\hermesc.exe" -Destination "win64-bin"
|
|
# Include Windows runtime dependencies
|
|
Copy-Item -Path "deps\*" -Destination "win64-bin"
|
|
}
|
|
else {
|
|
Write-Host "Skipping; Clean c:\tmp\hermes\win64-bin to rebuild."
|
|
}
|
|
- name: Upload windows artifacts
|
|
uses: actions/upload-artifact@v4.3.0
|
|
with:
|
|
name: hermes-win64-bin
|
|
path: D:\tmp\hermes\win64-bin\
|
|
|
|
build_android:
|
|
runs-on: 8-core-ubuntu
|
|
needs: [set_release_type]
|
|
container:
|
|
image: reactnativecommunity/react-native-android:latest
|
|
env:
|
|
TERM: "dumb"
|
|
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4.1.1
|
|
- name: Setup node.js
|
|
uses: ./.github/actions/setup-node
|
|
- name: Install dependencies
|
|
run: yarn install --non-interactive
|
|
- name: Set React Native Version
|
|
run: node ./scripts/releases/set-rn-version.js --build-type ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
|
|
- name: Setup gradle
|
|
uses: ./.github/actions/setup-gradle
|
|
- name: Build and publish all the Android Artifacts to /tmp/maven-local
|
|
run: |
|
|
# By default we only build ARM64 to save time/resources. For release/nightlies/prealpha, we override this value to build all archs.
|
|
if [[ "${{ needs.set_release_type.outputs.RELEASE_TYPE }}" == "dry-run" ]]; then
|
|
export ORG_GRADLE_PROJECT_reactNativeArchitectures="arm64-v8a"
|
|
else
|
|
export ORG_GRADLE_PROJECT_reactNativeArchitectures="armeabi-v7a,arm64-v8a,x86,x86_64"
|
|
fi
|
|
./gradlew publishAllToMavenTempLocal build -PenableWarningsAsErrors=true
|
|
shell: bash
|
|
- name: Upload test results
|
|
if: ${{ always() }}
|
|
uses: actions/upload-artifact@v4.3.0
|
|
with:
|
|
name: build-android-results
|
|
compression-level: 1
|
|
path: |
|
|
packages/gradle-plugin/settings-plugin/build/reports
|
|
packages/gradle-plugin/react-native-gradle-plugin/build/reports
|
|
packages/react-native/ReactAndroid/build/reports
|
|
- name: Upload RNTester APK
|
|
if: ${{ always() }}
|
|
uses: actions/upload-artifact@v4.3.0
|
|
with:
|
|
name: rntester-apk
|
|
path: packages/rn-tester/android/app/build/outputs/apk/
|
|
compression-level: 0
|
|
|
|
build_npm_package:
|
|
runs-on: 8-core-ubuntu
|
|
needs: [set_release_type, prepare_hermes_workspace, build_hermes_macos, build_hermesc_linux, build_hermesc_windows,build_android]
|
|
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/prealpha, we override this value to build all archs.
|
|
ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a"
|
|
# Repeated here, as the environment key in this executor will overwrite the one in defaults
|
|
PUBLIC_ANALYSISBOT_GITHUB_TOKEN_A: ${{ secrets.GITHUB_ANALYSISBOT_TOKEN_A }}
|
|
PUBLIC_ANALYSISBOT_GITHUB_TOKEN_B: ${{ secrets.GITHUB_ANALYSISBOT_TOKEN_B }}
|
|
HERMES_WS_DIR: /tmp/hermes
|
|
env:
|
|
GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }}
|
|
ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }}
|
|
ORG_GRADLE_PROJECT_SIGNING_KEY_ENCODED: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY_ENCODED }}
|
|
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.1.1
|
|
- name: Create /tmp/hermes/osx-bin directory
|
|
run: mkdir -p /tmp/hermes/osx-bin
|
|
- name: Download osx-bin release artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-osx-bin-Release
|
|
path: /tmp/hermes/osx-bin
|
|
- name: Download osx-bin debug artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-osx-bin-Debug
|
|
path: /tmp/hermes/osx-bin
|
|
- name: Download darwin-bin release artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-darwin-bin-Release
|
|
path: /tmp/hermes/hermes-runtime-darwin
|
|
- name: Download darwin-bin debug artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-darwin-bin-Debug
|
|
path: /tmp/hermes/hermes-runtime-darwin
|
|
- name: Download hermes dSYM debug artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-dSYM-Debug
|
|
path: /tmp/hermes/dSYM/Debug
|
|
- name: Download hermes dSYM release vartifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-dSYM-Release
|
|
path: /tmp/hermes/dSYM/Release
|
|
- name: Download windows-bin artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-win64-bin
|
|
path: /tmp/hermes/win64-bin
|
|
- name: Download linux-bin artifacts
|
|
uses: actions/download-artifact@v4.1.3
|
|
with:
|
|
name: hermes-linux-bin
|
|
path: /tmp/hermes/linux64-bin
|
|
- name: Cache setup
|
|
id: cache_setup
|
|
uses: ./.github/actions/cache_setup
|
|
with:
|
|
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
|
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
|
- name: Show /tmp/hermes directory
|
|
run: ls -lR /tmp/hermes
|
|
- name: Copy Hermes binaries
|
|
shell: bash
|
|
run: |
|
|
mkdir -p ./packages/react-native/sdks/hermesc ./packages/react-native/sdks/hermesc/osx-bin ./packages/react-native/sdks/hermesc/win64-bin ./packages/react-native/sdks/hermesc/linux64-bin
|
|
|
|
# When build_hermes_macos runs as a matrix, it outputs
|
|
if [[ -d $HERMES_WS_DIR/osx-bin/Release ]]; then
|
|
cp -r $HERMES_WS_DIR/osx-bin/Release/* ./packages/react-native/sdks/hermesc/osx-bin/.
|
|
elif [[ -d $HERMES_WS_DIR/osx-bin/Debug ]]; then
|
|
cp -r $HERMES_WS_DIR/osx-bin/Debug/* ./packages/react-native/sdks/hermesc/osx-bin/.
|
|
else
|
|
ls $HERMES_WS_DIR/osx-bin || echo "hermesc macOS artifacts directory missing."
|
|
echo "Could not locate macOS hermesc binary."; exit 1;
|
|
fi
|
|
|
|
# Sometimes, GHA creates artifacts with lowercase Debug/Release. Make sure that if it happen, we uppercase them.
|
|
if [[ -f "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-debug.tar.gz" ]]; then
|
|
mv "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-debug.tar.gz" "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Debug.tar.gz"
|
|
fi
|
|
|
|
if [[ -f "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-release.tar.gz" ]]; then
|
|
mv "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-release.tar.gz" "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Release.tar.gz"
|
|
fi
|
|
|
|
cp -r $HERMES_WS_DIR/win64-bin/* ./packages/react-native/sdks/hermesc/win64-bin/.
|
|
cp -r $HERMES_WS_DIR/linux64-bin/* ./packages/react-native/sdks/hermesc/linux64-bin/.
|
|
|
|
# Make sure the hermesc files are actually executable.
|
|
chmod -R +x packages/react-native/sdks/hermesc/*
|
|
|
|
mkdir -p ./packages/react-native/ReactAndroid/external-artifacts/artifacts/
|
|
cp $HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Debug.tar.gz ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-ios-debug.tar.gz
|
|
cp $HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Release.tar.gz ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-ios-release.tar.gz
|
|
cp $HERMES_WS_DIR/dSYM/Debug/hermes.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-debug.tar.gz
|
|
cp $HERMES_WS_DIR/dSYM/Release/hermes.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-release.tar.gz
|
|
- name: Setup node.js
|
|
uses: ./.github/actions/setup-node
|
|
- name: Install dependencies
|
|
run: yarn install --non-interactive
|
|
- name: Build packages
|
|
run: yarn build
|
|
# Continue with publish steps
|
|
- name: Set npm credentials
|
|
run: echo "//registry.npmjs.org/:_authToken=${{ secrets.GHA_NPM_TOKEN }}" > ~/.npmrc
|
|
- name: Publish NPM
|
|
run: |
|
|
echo "GRADLE_OPTS = $GRADLE_OPTS"
|
|
export ORG_GRADLE_PROJECT_reactNativeArchitectures="armeabi-v7a,arm64-v8a,x86,x86_64"
|
|
node ./scripts/releases-ci/publish-npm.js -t nightly
|
|
- name: Zip Maven Artifacts from /tmp/maven-local
|
|
working-directory: /tmp
|
|
run: zip -r maven-local.zip maven-local
|
|
- name: Upload Maven Artifacts
|
|
uses: actions/upload-artifact@v4.3.1
|
|
with:
|
|
name: maven-local
|
|
path: /tmp/maven-local.zip
|
|
- name: Upload npm logs
|
|
uses: actions/upload-artifact@v4.3.1
|
|
with:
|
|
name: npm-logs
|
|
path: ~/.npm/_logs
|
|
- name: Build release package as a job artifact
|
|
if: needs.set_release_type.outputs.RELEASE_TYPE == 'dry-run'
|
|
run: |
|
|
mkdir -p build
|
|
|
|
FILENAME=$(cd packages/react-native; npm pack | tail -1)
|
|
mv packages/react-native/$FILENAME build/
|
|
|
|
echo $FILENAME > build/react-native-package-version
|
|
- name: Upload release package
|
|
uses: actions/upload-artifact@v4.3.1
|
|
if: needs.set_release_type.outputs.RELEASE_TYPE == 'dry-run'
|
|
with:
|
|
name: react-native-package
|
|
path: build
|
|
- name: Update rn-diff-purge to generate upgrade-support diff
|
|
if: needs.set_release_type.outputs.RELEASE_TYPE == 'release'
|
|
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 }}\" }}"
|