name: ios-release on: workflow_dispatch: inputs: release: type: choice default: full options: - full - pre description: Whether to make a release, choose full release (uses platform/ios/VERSION) or pre-release pre_release_version: type: string default: '' description: Version (only for pre-releases) jobs: ios-build-dynamic: runs-on: macos-26 defaults: run: working-directory: platform/ios shell: bash steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4 with: submodules: recursive - name: Build XCFramework (Dynamic) run: | bazel build --compilation_mode=opt --features=dead_strip,thin_lto --objc_enable_binary_stripping \ --apple_generate_dsym --output_groups=+dsyms --//:renderer=metal //platform/ios:MapLibre.dynamic --embed_label=maplibre_ios_"$(cat VERSION)" echo xcframework="$(bazel info execution_root)"/"$(bazel cquery --output=files --compilation_mode=opt --//:renderer=metal //platform/ios:MapLibre.dynamic)" >> "$GITHUB_ENV" - name: Create .zip with debug symbols working-directory: ./bazel-bin/platform/ios/MapLibre.dynamic_dsyms run: | zip MapLibre_ios_device.framework.dSYM.zip MapLibre_ios_device.framework.dSYM/Contents/Resources/DWARF/MapLibre_ios_device MapLibre_ios_device.framework.dSYM/Contents/Info.plist echo debug_symbols_ios="$(realpath MapLibre_ios_device.framework.dSYM.zip)" >> "$GITHUB_ENV" - name: Copy debug symbols to root working-directory: . run: cp ${{ env.debug_symbols_ios }} . - name: Add license to XCFramework zip run: | cp ${{ env.xcframework }} MapLibre.dynamic.xcframework.zip chmod +w MapLibre.dynamic.xcframework.zip zip MapLibre.dynamic.xcframework.zip LICENSE.md # add license to zip working-directory: . - name: Upload artifact uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: xcframework path: | MapLibre.dynamic.xcframework.zip MapLibre_ios_device.framework.dSYM.zip ios-build-static: runs-on: macos-15 defaults: run: working-directory: platform/ios shell: bash steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4 with: submodules: recursive - name: Build XCFramework (Static) # for now, just build it TODO: make a static framework release run: | bazel build //platform/ios:MapLibre.static --//:renderer=metal --compilation_mode="opt" --copt -g --copt="-Oz" --strip never --output_groups=+dsyms --apple_generate_dsym echo xcframework_static="$(bazel info execution_root)"/"$(bazel cquery --output=files --compilation_mode=opt --//:renderer=metal //platform/ios:MapLibre.static)" >> "$GITHUB_ENV" - name: Add license to XCFramework zip run: | cp ${{ env.xcframework_static }} MapLibre.static.xcframework.zip chmod +w MapLibre.static.xcframework.zip zip MapLibre.static.xcframework.zip LICENSE.md # add license to zip working-directory: . - name: Upload artifact uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: xcframework-static path: | MapLibre.static.xcframework.zip ios-release: permissions: id-token: write # needed for AWS contents: write # allow making a release actions: write # for triggering ios-release-cocoapods.yml issues: write # for notify-release-on-prs.ts runs-on: ubuntu-latest needs: - ios-build-dynamic - ios-build-static defaults: run: working-directory: platform/ios shell: bash steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4 with: submodules: recursive - uses: actions/download-artifact@v8 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v4 with: node-version-file: ".nvmrc" - name: Get version (release) if: github.event.inputs.release == 'full' run: | echo version="$(head VERSION)" >> "$GITHUB_ENV" echo changelog_version_heading="## $(head VERSION)" >> "$GITHUB_ENV" - name: Get version (pre-release) if: github.event.inputs.release == 'pre' run: | version="${{ github.event.inputs.pre_release_version }}" if [[ -z "$version" ]]; then version="$(head VERSION)"-pre${{ github.sha }} fi if [[ "$version" != *"pre"* ]]; then echo "::error::Pre-release version must include 'pre' (Current version: $version)" exit 1 fi echo version="$version" >> "$GITHUB_ENV" echo changelog_version_heading="## main" >> "$GITHUB_ENV" - name: Create tag if it does not exist working-directory: . run: .github/scripts/ensure-tag.sh ios-v${{ env.version }} ${{ github.sha }} - name: Extract changelog for version run: | awk '/^##/ { p = 0 }; p == 1 { print }; $0 == "${{ env.changelog_version_heading }}" { p = 1 };' CHANGELOG.md > changelog_for_version.md cat changelog_for_version.md - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v4 with: aws-region: us-west-2 role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} role-session-name: ${{ github.run_id }} - name: Upload changelog to S3 run: aws s3 cp changelog_for_version.md s3://maplibre-native/changelogs/ios-${{ env.version }}.md - name: Release (GitHub) - Create Draft id: github_release uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 with: name: ios-v${{ env.version }} files: | xcframework/MapLibre.dynamic.xcframework.zip xcframework/MapLibre_ios_device.framework.dSYM.zip xcframework-static/MapLibre.static.xcframework.zip tag_name: ios-v${{ env.version }} prerelease: ${{ github.event.inputs.release == 'pre' }} body_path: platform/ios/changelog_for_version.md fail_on_unmatched_files: true draft: true # needed to trigger workflow for Swift Package Index release - name: Generate token uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 id: generate_token with: app-id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} private-key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - name: Release (Swift Package Index) run: | echo "::add-mask::${{ steps.generate_token.outputs.token }}" release_workflow_id=81221759 # id of release.yml curl -L \ -X POST \ -H "Accept: application/vnd.github+json" \ -H "Authorization: token ${{ steps.generate_token.outputs.token }}" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/maplibre/maplibre-gl-native-distribution/actions/workflows/$release_workflow_id/dispatches \ -d '{"ref":"main","inputs":{ "changelog_url": "https://maplibre-native.s3.eu-central-1.amazonaws.com/changelogs/ios-${{ env.version }}.md", "version":"${{ env.version }}", "download_url": "https://github.com/maplibre/maplibre-native/releases/download/ios-v${{ env.version }}/MapLibre.dynamic.xcframework.zip"}}' - run: npm install working-directory: . - name: Release (CocoaPods) shell: bash -leo pipefail {0} # so pod is found run: gh workflow run ios-release-cocoapods.yml --field version=${{ env.version }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish release (remove draft) uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 with: tag_name: ios-v${{ env.version }} name: ios-v${{ env.version }} draft: false - name: Write release notifications if: github.repository_owner == 'maplibre' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: node .github/scripts/notify-release-on-prs.ts --tag ios-v${{ env.version }} working-directory: .