Release to Staging v2.9.28 - 2026-08-07 #347
This file contains hidden or 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: KMP CI | |
| permissions: | |
| contents: read | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened, labeled] | |
| paths: | |
| - "packages/kmp-sdk/**" | |
| - "packages/kmp-sdk-test-app/**" | |
| - "packages/kmp-minipay-sample/**" | |
| - ".github/workflows/kmp-ci.yml" | |
| - ".github/actions/**" | |
| - ".github/CI_FORCE_RUN" | |
| push: | |
| branches: [dev, staging, main] | |
| paths: | |
| - "packages/kmp-sdk/**" | |
| - "packages/kmp-sdk-test-app/**" | |
| - "packages/kmp-minipay-sample/**" | |
| - ".github/workflows/kmp-ci.yml" | |
| - ".github/actions/**" | |
| - ".github/CI_FORCE_RUN" | |
| jobs: | |
| # ── KMP SDK ────────────────────────────────────────────── | |
| kmp-sdk-tests: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :shared:jvmTest | |
| - uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: kmp-sdk-test-results | |
| path: packages/kmp-sdk/shared/build/reports/tests/ | |
| kmp-sdk-android-build: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :shared:assembleDebug | |
| kmp-sdk-ios-framework: | |
| if: | | |
| github.event_name == 'workflow_dispatch' || | |
| (github.event_name == 'push' && contains(fromJSON('["refs/heads/staging","refs/heads/main"]'), github.ref)) || | |
| (github.event_name == 'pull_request' && contains(fromJSON('["staging","main"]'), github.base_ref)) || | |
| (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-ios')) | |
| runs-on: namespace-profile-apple-silicon-6cpu | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64 | |
| kmp-sdk-ios-test: | |
| if: | | |
| github.event_name == 'workflow_dispatch' || | |
| (github.event_name == 'push' && contains(fromJSON('["refs/heads/staging","refs/heads/main"]'), github.ref)) || | |
| (github.event_name == 'pull_request' && contains(fromJSON('["staging","main"]'), github.base_ref)) || | |
| (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-ios')) | |
| runs-on: namespace-profile-apple-silicon-6cpu | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :shared:iosSimulatorArm64Test | |
| # ── KMP Test App ───────────────────────────────────────── | |
| kmp-test-app-tests: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk-test-app | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :composeApp:testDebugUnitTest | |
| - uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: kmp-test-app-test-results | |
| path: packages/kmp-sdk-test-app/composeApp/build/reports/tests/ | |
| kmp-test-app-android-build: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk-test-app | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :composeApp:assembleDebug | |
| kmp-test-app-ios-build: | |
| if: | | |
| github.event_name == 'workflow_dispatch' || | |
| (github.event_name == 'push' && contains(fromJSON('["refs/heads/staging","refs/heads/main"]'), github.ref)) || | |
| (github.event_name == 'pull_request' && contains(fromJSON('["staging","main"]'), github.base_ref)) || | |
| (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-ios')) | |
| runs-on: namespace-profile-apple-silicon-6cpu | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-sdk-test-app | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Generate token for private dependencies | |
| uses: ./.github/actions/generate-github-token | |
| id: github-token | |
| with: | |
| app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }} | |
| private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }} | |
| configure-netrc: "true" | |
| - name: Configure git for HTTPS dependency fetch | |
| run: git config --global url."https://github.com/".insteadOf "git@github.com:" | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - name: Build KMP framework for iOS | |
| working-directory: packages/kmp-sdk | |
| run: ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64 | |
| - name: Install CocoaPods dependencies | |
| working-directory: packages/kmp-sdk-test-app/iosApp | |
| run: pod install | |
| - name: Find iOS Simulator | |
| id: sim | |
| uses: ./.github/actions/find-ios-simulator | |
| - name: Build iOS app | |
| working-directory: packages/kmp-sdk-test-app/iosApp | |
| run: | | |
| xcodebuild -workspace iosApp.xcworkspace \ | |
| -scheme iosApp \ | |
| -sdk iphonesimulator \ | |
| -destination "id=${{ steps.sim.outputs.id }}" \ | |
| ONLY_ACTIVE_ARCH=YES \ | |
| build | |
| # ── KMP Minipay Sample ────────────────────────────────── | |
| kmp-minipay-android-build: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-minipay-sample | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - run: ./gradlew :composeApp:assembleDebug | |
| kmp-minipay-ios-build: | |
| if: | | |
| github.event_name == 'workflow_dispatch' || | |
| (github.event_name == 'push' && contains(fromJSON('["refs/heads/staging","refs/heads/main"]'), github.ref)) || | |
| (github.event_name == 'pull_request' && contains(fromJSON('["staging","main"]'), github.base_ref)) || | |
| (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-ios')) | |
| runs-on: namespace-profile-apple-silicon-6cpu | |
| timeout-minutes: 60 | |
| defaults: | |
| run: | |
| working-directory: packages/kmp-minipay-sample | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Generate token for private dependencies | |
| uses: ./.github/actions/generate-github-token | |
| id: github-token | |
| with: | |
| app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }} | |
| private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }} | |
| configure-netrc: "true" | |
| - name: Configure git for HTTPS dependency fetch | |
| run: git config --global url."https://github.com/".insteadOf "git@github.com:" | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - uses: ./.github/actions/cache-gradle | |
| - uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - name: Build KMP framework for iOS | |
| working-directory: packages/kmp-sdk | |
| run: ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64 | |
| - name: Find iOS Simulator | |
| id: sim | |
| uses: ./.github/actions/find-ios-simulator | |
| - name: Resolve SPM dependencies | |
| working-directory: packages/kmp-minipay-sample/iosApp | |
| run: | | |
| xcodebuild -project iosApp.xcodeproj \ | |
| -resolvePackageDependencies | |
| - name: Build iOS app | |
| working-directory: packages/kmp-minipay-sample/iosApp | |
| run: | | |
| xcodebuild -project iosApp.xcodeproj \ | |
| -scheme iosApp \ | |
| -sdk iphonesimulator \ | |
| -destination "id=${{ steps.sim.outputs.id }}" \ | |
| ONLY_ACTIVE_ARCH=YES \ | |
| ARCHS=arm64 \ | |
| SWIFT_ENABLE_EXPLICIT_MODULES=NO \ | |
| build |