Update node release based on maplibre-js release workflow #3958
Workflow file for this run
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: ios-ci | |
on: | |
workflow_dispatch: | |
inputs: | |
release: | |
required: false | |
type: boolean | |
description: Makes a release with version platform/ios/VERSION | |
push: | |
branches: | |
- main | |
tags: | |
- 'ios-*' | |
pull_request: | |
branches: | |
- '*' | |
permissions: | |
id-token: write # needed for AWS | |
contents: write # allow making a release | |
jobs: | |
pre_job: | |
runs-on: ubuntu-latest | |
outputs: | |
should_skip: ${{ github.event_name != 'workflow_dispatch' && steps.changed-files-yaml.outputs.ios_any_changed != 'true' }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Get all iOS files that have changed | |
if: github.event_name != 'workflow_dispatch' | |
id: changed-files-yaml | |
uses: tj-actions/changed-files@v41 | |
with: | |
files_yaml_from_source_file: .github/changed-files.yml | |
- name: Run step if test file(s) change | |
if: steps.changed-files-yaml.outputs.ios_any_changed == 'true' | |
run: | | |
echo "One or more iOS file(s) has changed." | |
echo "List of changes: ${{ steps.changed-files-yaml.outputs.ios_all_changed_files }}" | |
ios-build: | |
needs: pre_job | |
if: needs.pre_job.outputs.should_skip != 'true' | |
runs-on: [self-hosted, macOS, ARM64] | |
concurrency: | |
# cancel jobs on PRs only | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | |
env: | |
BUILDTYPE: Debug | |
HOMEBREW_NO_AUTO_UPDATE: 1 | |
HOMEBREW_NO_INSTALL_CLEANUP: 1 | |
defaults: | |
run: | |
working-directory: platform/ios | |
shell: bash | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
fetch-depth: 0 | |
- name: Cache node modules | |
uses: actions/cache@v3 | |
env: | |
cache-name: cache-node-modules | |
with: | |
path: /user/local/lib/node_modules | |
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
${{ runner.os }}-build-${{ env.cache-name }}- | |
${{ runner.os }}-build- | |
${{ runner.os }}- | |
- name: Cache Bazel | |
uses: actions/cache@v3 | |
with: | |
key: ${{ runner.os }}-bazel-${{ hashFiles('.bazelversion', '.bazelrc', 'WORKSPACE', 'WORKSPACE.bazel', 'MODULE.bazel') }} | |
restore-keys: | | |
${{ runner.os }}-bazel- | |
path: ~/.cache/bazel | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 18 | |
- name: npm install | |
run: npm ci --ignore-scripts | |
- run: cp bazel/example_config.bzl bazel/config.bzl | |
- name: Check debug symbols | |
run: bazel run //platform:check-public-symbols --//:renderer=metal | |
- name: Lint plist files | |
run: bazel run //platform/ios:lint-plists --//:renderer=metal | |
- name: Running iOS tests | |
run: bazel test //platform/ios/test:ios_test --test_output=errors --//:renderer=metal | |
- name: Running iOS UI tests | |
run: bazel test //platform/ios/iosapp-UITests:uitest --test_output=errors --//:renderer=metal | |
# render test | |
- name: Build RenderTest .ipa and .xctest for AWS Device Farm | |
run: | | |
set -e | |
bazel run --//:renderer=metal //platform/ios:xcodeproj | |
build_dir="$(mktemp -d)" | |
xcodebuild build-for-testing -scheme RenderTest -project MapLibre.xcodeproj -derivedDataPath "$build_dir" | |
render_test_app_dir="$(dirname "$(find "$build_dir" -name RenderTestApp.app)")" | |
cd "$render_test_app_dir" | |
mkdir Payload | |
mv RenderTestApp.app Payload | |
zip -r RenderTestApp.zip Payload | |
mv RenderTestApp.zip RenderTestApp.ipa | |
cd Payload/RenderTestApp.app/PlugIns | |
zip -r "$render_test_app_dir"/RenderTest.xctest.zip RenderTest.xctest | |
echo render_test_artifacts_dir="$render_test_app_dir" >> "$GITHUB_ENV" | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: ios-render-test | |
retention-days: 3 | |
if-no-files-found: error | |
path: | | |
${{ env.render_test_artifacts_dir }}/RenderTest.xctest.zip | |
${{ env.render_test_artifacts_dir }}/RenderTestApp.ipa | |
# C++ unit tests | |
- name: Build CppUnitTests .ipa and .xctest for AWS Device Farm | |
run: | | |
set -e | |
bazel run --//:renderer=metal //platform/ios:xcodeproj | |
build_dir="$(mktemp -d)" | |
xcodebuild build-for-testing -scheme CppUnitTests -project MapLibre.xcodeproj -derivedDataPath "$build_dir" | |
ios_cpp_test_app_dir="$(dirname "$(find "$build_dir" -name CppUnitTestsApp.app)")" | |
cd "$ios_cpp_test_app_dir" | |
mkdir Payload | |
mv CppUnitTestsApp.app Payload | |
zip -r CppUnitTestsApp.zip Payload | |
mv CppUnitTestsApp.zip CppUnitTestsApp.ipa | |
cd Payload/CppUnitTestsApp.app/PlugIns | |
zip -r "$ios_cpp_test_app_dir"/CppUnitTests.xctest.zip CppUnitTests.xctest | |
echo ios_cpp_test_artifacts_dir="$ios_cpp_test_app_dir" >> "$GITHUB_ENV" | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: ios-cpp-unit-tests | |
retention-days: 3 | |
if-no-files-found: error | |
path: | | |
${{ env.ios_cpp_test_artifacts_dir }}/CppUnitTests.xctest.zip | |
${{ env.ios_cpp_test_artifacts_dir }}/CppUnitTestsApp.ipa | |
# Size test (Bloaty) | |
- name: Build dynamic library for size test (Bloaty) | |
run: | | |
bazel build //platform/ios:MapLibre.dynamic --//:renderer=metal --//:maplibre_platform=ios --compilation_mode="opt" --copt -g --copt="-Oz" --strip never --output_groups=+dsyms --apple_generate_dsym | |
bazel_bin="$(bazel info --compilation_mode="opt" bazel-bin)" | |
unzip "$bazel_bin"/platform/ios/MapLibre.dynamic.xcframework.zip | |
cp "$bazel_bin"/platform/ios/MapLibre.dynamic_dsyms/MapLibre_ios_device.framework.dSYM/Contents/Resources/DWARF/MapLibre_ios_device MapLibre_DWARF | |
cp MapLibre.xcframework/ios-arm64/MapLibre.framework/MapLibre MapLibre_dynamic | |
- name: Upload size test as artifact (Bloaty) | |
if: github.event_name == 'pull_request' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ios-size-test-files | |
retention-days: 3 | |
if-no-files-found: error | |
path: | | |
platform/ios/MapLibre_DWARF | |
platform/ios/MapLibre_dynamic | |
- name: Configure AWS Credentials | |
if: github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME | |
uses: aws-actions/configure-aws-credentials@v4 | |
with: | |
aws-region: us-west-2 | |
role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} | |
role-session-name: ${{ github.run_id }} | |
- name: Upload MapLibre_DWARF & MapLibre_dynamic to S3 | |
if: github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME | |
run: | | |
aws s3 cp MapLibre_DWARF s3://maplibre-native/size-test-ios/MapLibre_DWARF-main | |
aws s3 cp MapLibre_dynamic s3://maplibre-native/size-test-ios/MapLibre_dynamic-main | |
- if: github.event_name == 'pull_request' | |
uses: ./.github/actions/save-pr-number | |
# Make Metal XCFramework release | |
- name: Should make release? | |
if: ${{ github.ref == 'refs/heads/main' }} | |
run: echo make_release=true >> "$GITHUB_ENV" | |
- name: Build XCFramework | |
run: | | |
bazel build --compilation_mode=opt --//:renderer=metal --//:maplibre_platform=ios //platform/ios:MapLibre.dynamic | |
echo xcframework="$(bazel info execution_root)"/"$(bazel cquery --output=files --compilation_mode=opt --//:renderer=metal --//:maplibre_platform=ios //platform/ios:MapLibre.dynamic)" >> "$GITHUB_ENV" | |
- name: Get version (release) | |
if: env.make_release && github.event.inputs.release | |
run: echo version="$(cat VERSION)" >> "$GITHUB_ENV" | |
- name: Get version (pre-release) | |
if: env.make_release && !github.event.inputs.release | |
run: echo version="$(cat VERSION)"-pre${{ github.sha }} >> "$GITHUB_ENV" | |
- name: Create tag | |
if: env.make_release | |
run: | | |
git tag -a ios-v${{ env.version }} -m "Publish ios-v${{ env.version }}" ${{ github.sha }} | |
git push origin ios-v${{ env.version }} | |
- name: Release | |
if: env.make_release | |
uses: softprops/action-gh-release@v1 | |
with: | |
name: ios-v${{ env.version }} | |
files: ${{ env.xcframework }} | |
tag_name: ios-v${{ env.version }} | |
prerelease: ${{ !github.event.inputs.release }} | |
ios-ci-result: | |
runs-on: ubuntu-latest | |
if: needs.pre_job.outputs.should_skip != 'true' && always() | |
needs: | |
- pre_job | |
- ios-build | |
steps: | |
- name: Mark result as failed | |
if: needs.ios-build.result != 'success' | |
run: exit 1 |