Belajar Capacitorjs - CI/CD Pipeline Build Aplikasi
Episode 19 of 28

Belajar Capacitorjs - CI/CD Pipeline Build Aplikasi

Membangun CI/CD pipeline dengan GitHub Actions untuk build signed IPA/APK, Fastlane untuk signing & build automation, Ionic Appflow sebagai managed option, keamanan certificates & keystores di CI, serta praktik push tag → artifact siap distribusi.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 18 kita menguasai testing dan debugging, pada episode ini kita membangun CI/CD pipeline — otomasi build, test, dan distribusi aplikasi. Di dunia production, manual build tidak scalable. Satu pipeline yang handal menghemat jam kerja dan mengurangi human error.

Mengapa CI/CD penting? Karena mobile app memiliki build yang kompleks: web build → Capacitor sync → native build → signing → artifact. Setiap langkah bisa gagal. CI/CD memastikan setiap build terstandardisasi dan reproducible.

Arsitektur Pipeline

100%

GitHub Actions untuk iOS + Android

Workflow Configuration

.github/workflows/build.yml
name: Build & Release
 
on:
  push:
    tags:
      - 'v*'
 
jobs:
  build-android:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - run: npx cap sync android
 
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'
 
      - name: Build APK
        working-directory: android
        run: ./gradlew assembleRelease
 
      - name: Sign APK
        uses: r0adkll/sign-android-release@v1
        with:
          releaseDirectory: android/app/build/outputs/apk/release
          signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
          alias: ${{ secrets.ANDROID_ALIAS }}
          keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
          keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}
 
      - uses: actions/upload-artifact@v4
        with:
          name: app-release.apk
          path: android/app/build/outputs/apk/release/*.apk
 
  build-ios:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - run: npx cap sync ios
 
      - name: Build IPA
        uses: yukiarrr/ios-build-action@v1.12.0
        with:
          project-path: ios/App/App.xcodeproj
          workspace-path: ios/App/App.xcworkspace
          scheme: App
          p12-base64: ${{ secrets.IOS_P12_BASE64 }}
          mobileprovision-base64: ${{ secrets.IOS_PROVISION_BASE64 }}
          code-signing-identity: 'iPhone Distribution'
          team-id: ${{ secrets.IOS_TEAM_ID }}
 
      - uses: actions/upload-artifact@v4
        with:
          name: app-release.ipa
          path: ios/App.ipa

Fastlane

Fastlane mengautomasi build, signing, dan upload ke store:

Setup

Install Fastlane
npm install -D fastlane
cd ios && fastlane init

Fastfile

Rubyios/fastlane/Fastfile
default_platform(:ios)
 
platform :ios do
  desc "Build and upload to TestFlight"
  lane :beta do
    build_app(
      workspace: "App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
    )
    upload_to_testflight
  end
 
  desc "Build and upload to App Store"
  lane :release do
    build_app(
      workspace: "App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
    )
    upload_to_app_store(skip_metadata: true, skip_screenshots: true)
  end
end

Android Fastlane

Rubyandroid/fastlane/Fastfile
default_platform(:android)
 
platform :android do
  desc "Build and upload to Play Console internal testing"
  lane :beta do
    gradle(
      task: "assemble",
      build_type: "Release",
      project_dir: "./"
    )
    upload_to_play_store(track: 'internal')
  end
end

Ionic Appflow (Managed Option)

Ionic Appflow adalah platform managed CI/CD dari Ionic:

  • Automated builds: push ke git → build otomatis di cloud.
  • Live updates: deploy update tanpa store review.
  • Package builds: build native IPA/APK di cloud tanpa macOS/Xcode.

Cocok untuk team yang tidak ingin mengelola CI/CD sendiri. Harga mulai dari free tier untuk project kecil.

Warning

Jangan pernah commit certificates, keystores, atau provisioning profiles ke git. Gunakan GitHub Secrets atau environment variables di CI.

Keamanan Secrets di CI

SecretPlatformKeterangan
ANDROID_SIGNING_KEYAndroidBase64 encoded keystore
ANDROID_ALIASAndroidKey alias
ANDROID_KEY_STORE_PASSWORDAndroidPassword keystore
IOS_P12_BASE64iOSBase64 encoded p12
IOS_PROVISION_BASE64iOSBase64 encoded provisioning profile
IOS_TEAM_IDiOSApple Team ID

Convert File ke Base64

Convert p12 ke base64
base64 -i certificate.p12 -o certificate_base64.txt

Push Tag → Artifact

Setelah pipeline dikonfigurasi:

Release pipeline
git tag v1.0.0
git push origin v1.0.0

Pipeline akan otomatis:

  1. Build web (npm run build).
  2. Sync ke native (npx cap sync).
  3. Build native (Gradle/Xcode).
  4. Sign dengan certificates.
  5. Upload artifact (IPA/APK).
  6. Distribusi ke TestFlight/Play Console.

Tip

Mulai dari internal testing track (Play Console) atau TestFlight (iOS). Jangan langsung publish ke production. Uji di minimal 3-5 perangkat sebelum release public.

Penutup

Pada episode 19 ini, kalian telah memahami:

  • GitHub Actions untuk automated build iOS + Android.
  • Fastlane untuk signing, build, dan upload ke store.
  • Ionic Appflow sebagai managed CI/CD option.
  • Keamanan secrets: certificates dan keystores di CI.
  • Push tag → artifact siap distribusi.

Di episode 20 selanjutnya, kita akan membahas publikasi ke App Store dan Play Store — provisioning profiles, App Store Connect, keystore signing, Play Console release tracks, target API level requirements, dan checklist rilis pertama. Sampai jumpa!

Belajar Capacitorjs - CI/CD Pipeline Build Aplikasi | Belajar Capacitorjs