Lompat ke konten utama
Integrasi/CD

Automatic Capacitor IOS build with GitHub actions with certificate

How to set up a CI/CD pipeline for your IOS Ionic app using fastlane and GitHub Actions in 5 mins (2024)

Kredit artikel

Martin Donadieu

Pengarang

Valeria

Pengulas

Jordan

Pengedit

Automatic Capacitor IOS build with GitHub actions with certificate

Mengatur CI/CD untuk aplikasi Capacitor dapat kompleks dan memakan waktu. Berikut ini yang perlu Anda ketahui:

Sekarang kami merekomendasikan menggunakan Capgo Build dengan Capgo CLI untuk pembangunan native Capacitor. Panduan Fastlane ini dipertahankan untuk tim yang memelihara pipeline aksi GitHub yang sudah ada, tetapi pembangunan iOS baru harus menggunakan Capgo CLI sehingga Anda tidak perlu memelihara Fastlane, runner Xcode, sertifikat, dan skrip unggah sendiri.

Capgo Build untuk CI/CD oleh Capgo

Lepaskan diri dari Fastlane, runner Xcode, sertifikat, profil pengaturan, dan skrip unggah. Capgo Build __CAPGO_KEEP_0__ Build menjalankan pembangunan iOS yang ditandatangani secara native dari pipeline CI/CD yang sudah ada Anda:

  • Bekerja dengan pipeline Anda: Aktifkan Capgo Build dari GitHub Actions, GitLab CI, Jenkins, atau skrip lokal setelah pembangunan web Anda dan npx cap sync.
  • Signing dari CI rahasia: Simpan kunci App Store Connect, sertifikat, profil pengaturan, kata sandi, dan ID tim di rahasia CI Anda sendiri.
  • No pengelolaan runner native: Capgo Build menyediakan lingkungan pembangunan Apple yang dipelihara, sehingga Anda tidak perlu mengelola runner macOS, gambar Xcode, atau jalur Fastlane.
  • Artikel dan pengiriman: Unduh artikel yang ditandatangani untuk QA atau kirimkan rilis build melalui Capgo CLI.

Harga

  • Capgo plans start at $12/month
  • Navigation/label for the Pricing page. Page/area: Capgo Builder / native cloud build product page. Role: Section subtitle or tagline. Seen in: page native-build.astro. Message key `native_build_builder_pricing_eyebrow` (Native Build Builder Pricing Eyebrow). | Navigation/label for the Pricing page. Page/area: Capgo marketing website. Role: Call-to-action button or link label. Seen in: component BlogMidArticleCta.astro. Message key `blog_mid_article_china_cta_pricing_button` (Blog Mid Article China CTA Pricing Button). | Navigation/label for the Pricing page. Page/area: Capgo marketing website. Role: Short UI label or navigation item. Seen in: site footer, site header, page pricing.astro. Message key `pricing` (Pricing).
  • Rencana __CAPGO_KEEP_0__ mulai dari $12/bulan

Set up Capgo Build in CI/CD

Menit tambahan pembangunan dibebankan berdasarkan menit melalui kredit-kredit Anda. context

Berikut apa yang perlu Anda lakukan:

Pengiriman Terus-menerus untuk iOS menggunakan Fastlane dan GitHub Aksi dan sertifikat

Prasyarat

Sebelum melanjutkan dengan tutorial:

  • Pastikan Anda telah menginstal Fastlane pada mesin pengembangan Anda. Pastikan Anda merupakan bagian dari program keanggotaan pengembang iOS.
  • Informasi penting tentang harga

Harga __CAPGO_KEEP_0__ Action

https://GitHub.com/features/actions

https://github.com/features/actions

The service is ‘gratis hingga batas yang ditentukan, tergantung pada mesin yang dipilih.
Kita akan menggunakan sebuah mesin macOS mesin, Anda dapat melihat harga dan batasan (harga sesuai dengan waktu pembuatan tutorial, mereka mungkin mengalami perubahan di masa depan)

Setelah Anda diingatkan tentang persyaratan dan harga, mari kita melanjutkan.

Catatan: Dalam postingan saya, saya asumsikan bahwa Anda telah membuat aplikasi di App Store Connect. Informasi penting akan dikopi oleh Fastlane!

Apa yang akan Anda pelajari dalam tutorial ini

Langkah-langkah yang harus diikuti dalam postingan ini

  1. Menggunakan App Store Connect API dengan Fastlane
    • Persyaratan:
      • Membuat Kunci App Store Connect API
      • Memakai Kunci API App Store Connect
  2. Salin File Fastlane
  3. Konfigurasi GitHub Aksi

1. Memakai Kunci App Store Connect API dengan Fastlane

Mulai Februari 2021, verifikasi dua faktor atau verifikasi dua langkah diperlukan untuk semua pengguna untuk masuk ke App Store Connect. Layer keamanan tambahan untuk ID Apple Anda membantu memastikan bahwa Anda adalah satu-satunya orang yang dapat mengakses akun Anda.
Dari Bantuan Apple

Persyaratan

Untuk Fastlane dapat menggunakan Kunci App Store Connect API untuk mengunggah aplikasi Anda, Anda perlu menyediakan hal-hal berikut: tiga hal:

  1. ID Penerbit
  2. ID Kunci
  3. File Kunci atau Konten Kunci

Mendapatkan Kunci API App Store Connect

Untuk menghasilkan kunci, Anda harus memiliki izin Admin di App Store Connect. Jika Anda tidak memiliki izin tersebut, Anda dapat mengarahkan orang yang relevan ke artikel ini.

  1. Masuk ke App Store Connect.

  2. Pilih Pengguna dan Akses.

Akses Pengguna App Store Connect

3 — Pilih tab Integrasi.

Integrasi Kunci API App Store Connect

  1. Klik Generate API Key atau tombol Tambah (+).

App Store Connect API kunci aplikasi membuat

  1. Masukkan nama untuk kunci. Nama ini hanya untuk referensi Anda dan bukan bagian dari kunci itu sendiri.

App Store Connect API kunci aplikasi membuat nama

6 — Di bawah Akses, pilih peran untuk kunci. Peran yang berlaku untuk kunci sama dengan peran yang berlaku untuk anggota tim Anda. Lihat izin peran. Kami merekomendasikan untuk memilih pengelola aplikasi.

  1. Klik Buat.

Akses API kunci tidak dapat dibatasi pada aplikasi tertentu.

Nama kunci baru, ID kunci, tautan download, dan informasi lainnya muncul di halaman.

App Store Connect download kunci

Anda dapat mengambil semua informasi yang diperlukan di sini.
<1> ID Masalah. (APPLE_ISSUER_ID <2> ID Kunci. (
<3> Klik "Unduh Kunci __CAPGO_KEEP_0__" untuk mengunduh kunci pribadi __CAPGO_KEEP_1__ Anda. Tautan unduh hanya muncul jika kunci pribadi belum diunduh. Apple tidak menyimpan salinan kunci pribadi. Jadi, Anda hanya dapat mengunduhnya sekali.APPLE_KEY_ID Simpan kunci pribadi Anda di tempat yang aman. Anda tidak boleh berbagi kunci, menyimpan kunci di __CAPGO_KEEP_0__ repository, atau termasuk kunci di __CAPGO_KEEP_1__ sisi klien.
<3> Click “Download API Key” to download your API private key. The download link appears only if the private key has not yet been downloaded. Apple does not keep a copy of the private key. So, you can download it only once.

🔴 Store your private key in a safe place. You should never share your keys, store keys in a code repository, or include keys in client-side code.

Using an App Store Connect API Key

The API Key file (p8 file that you download), the key ID, and the issuer ID are required in order to create the JWT token for authorization. There are multiple ways that this information can be passed into Fastlane. I chose to use the Fastlane’s new action app_store_connect_api_key<1> ID Masalah. ( <2> ID Kunci. (<3> Klik "Unduh Kunci __CAPGO_KEEP_0__" untuk mengunduh kunci pribadi __CAPGO_KEEP_1__ Anda. Tautan unduh hanya muncul jika kunci pribadi belum diunduh. Apple tidak menyimpan salinan kunci pribadi. Jadi, Anda hanya dapat mengunduhnya sekali.

Simpan kunci pribadi Anda di tempat yang aman. Anda tidak boleh berbagi kunci, menyimpan kunci di __CAPGO_KEEP_0__ repository, atau termasuk kunci di __CAPGO_KEEP_1__ sisi klien.APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Kita bisa mengelola App Store Connect dengan menggunakan Fastlane menggunakan kunci API, bagus!

2. Sertifikat

Buka XCode dan pergi ke Pengaturan > Akun > ID Apple > Tim dan pilih tim Anda.

Code identitas tanda tangan

Klik pada Pengelolaan sertifikat.

Jika Anda belum membuat sertifikat, Anda dapat membuat sertifikat baru.

Klik pada + dan pilih Distribusi Apple

Distribusi Apple

Maka Anda perlu pergi ke keychain untuk mengunduh sertifikat sebagai .p12 file.

Mengunduhnya, Anda perlu pergi ke keychain, ganti ke keychain log masuk tab Sertifikat Saya.

Sertifikat Saya

Pilih sertifikat yang ingin Anda download. (Cari berdasarkan tanggal sertifikat)

Klik kanan pada kunci pribadi pada sertifikat dan pilih Export.

Pilih format file Informasi Pribadi (p12).

Sertifikat akan didownload sebagai .p12 file.

Buka file tersebut di terminal dan gunakan perintah berikut untuk mengkonversinya ke Base64:

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

ini akan menjadi rahasmu. Selain itu, ketika diminta, silakan berikan password sertifikat. Password ini akan menjadi BUILD_CERTIFICATE_BASE64 rahasiamu P12_PASSWORD rahasia.

3. Profil pengaturan

Buka Pengembang Apple dan pilih tim yang tepat.

Kemudian buat profil baru, dengan mengklik pada +

Buat profil baru

Dan pilih App Store Connect.

Pilih App Store Connect

Kemudian Anda perlu memilih aplikasi yang tepat, berhati-hatilah Anda tidak bisa menggunakan wildcard lainnya, karena signing akan gagal.

Pilih aplikasi yang tepat

Pilih sertifikat yang tepat yang telah Anda buat sebelumnya (carilah tanggal kadaluarsa, harus sama hari dan bulan dengan hari ini) dan klik pada Teruskan.

Pilih sertifikat yang tepat

Terakhir, masukkan nama profil dan klik pada Generate.

Nama yang akan digunakan untuk mengidentifikasi profil di Fastlane, di bawah nilai APPLE_PROFILE_NAME.

Generate profil

Anda dapat mengunduh profil sebagai .mobileprovision file.

Unduh profil

Silakan mengonversi profil ke Base64 dan simpan sebagai rahasia (BUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Salin file Fastlane

Fastlane adalah sebuah library Ruby yang dibuat untuk otomatisasi tugas pengembangan mobile yang umum. Dengan menggunakan Fastlane, Anda dapat mengonfigurasi jalur

Buat folder Fastlane di root projek Capacitor/Ionic Anda dan tambahkan file Fastfile di sana:

  • Folder: <project-root>/fastlane/
  • File: <project-root>/fastlane/Fastfile

Level yang sama dengan package.json, capacitor.config.*, dan folder. ios/ Tidak buat di dalam ios/App/.

platform :ios do
  desc 'Export ipa and submit to TestFlight'
  lane :beta do
    keychain_info = { keychain_name: "ios-build-#{Time.now.to_i}.keychain", keychain_password: SecureRandom.uuid }
    
    begin
      setup_signing(keychain_info)
      bump_build_number
      build_app_with_signing(keychain_info)
      submit_to_testflight
    ensure
      cleanup_keychain(keychain_info)
    end
  end

  private_lane :setup_signing do |options|
    create_keychain(
      name: options[:keychain_name],
      password: options[:keychain_password],
      unlock: true,
      timeout: 0,
      lock_when_sleeps: false, 
      add_to_search_list: true
    )
    import_cert(options)
    install_profile
    update_project_settings
  end

  lane :bump_build_number do
		file = File.read('../package.json')
		data_hash = JSON.parse(file)
		api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
		build_num = app_store_build_number(
      api_key: api_key,
			app_identifier: ENV['BUNDLE_IDENTIFIER'],
			live: false
    )
		build_num = build_num + 1
		UI.message("Bumped build number to #{build_num}")
		increment_build_number(
			build_number: build_num,
			xcodeproj: "./ios/App/App.xcodeproj",
			skip_info_plist: true
		)
	end

  private_lane :import_cert do |options|
    cert_path = "#{Dir.tmpdir}/build_certificate.p12"
    File.write(cert_path, Base64.decode64(ENV['BUILD_CERTIFICATE_BASE64']))
    import_certificate(
      certificate_path: cert_path,
      certificate_password: ENV['P12_PASSWORD'] || "",
      keychain_name: options[:keychain_name],
      keychain_password: options[:keychain_password],
      log_output: true
    )
    File.delete(cert_path)
  end  
  
  private_lane :cleanup_keychain do |options|
    delete_keychain(
      name: options[:keychain_name]
    )
  end  

  private_lane :install_profile do
    profile_path = "#{Dir.tmpdir}/build_pp.mobileprovision"
    File.write(profile_path, Base64.decode64(ENV['BUILD_PROVISION_PROFILE_BASE64']))
    UI.user_error!("Failed to create provisioning profile at #{profile_path}") unless File.exist?(profile_path)
    ENV['PROVISIONING_PROFILE_PATH'] = profile_path
    install_provisioning_profile(path: profile_path)
    File.delete(profile_path)
  end

  private_lane :update_project_settings do
    update_code_signing_settings(
      use_automatic_signing: false,
      path: "./ios/App/App.xcodeproj",
      code_sign_identity: "iPhone Distribution",
      profile_name: ENV['APPLE_PROFILE_NAME'],
      bundle_identifier: ENV['BUNDLE_IDENTIFIER'],
      team_id: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
    update_project_team(
      path: "./ios/App/App.xcodeproj",
      teamid: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
  end

  private_lane :build_app_with_signing do |options|
    unlock_keychain(
      path: options[:keychain_name],
      password: options[:keychain_password],
      set_default: false
    )
    build_app(
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      configuration: "Release",
      export_method: "app-store",
      output_name: "App.ipa",
      export_options: {
        provisioningProfiles: {
          ENV['BUNDLE_IDENTIFIER'] => ENV['APPLE_PROFILE_NAME']
        }
      },
      xcargs: "-verbose",
      buildlog_path: "./build_logs",
      export_xcargs: "-allowProvisioningUpdates",
    )
  end   

  private_lane :submit_to_testflight do
    api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
    pilot(
      api_key: api_key,
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )
  end
end

5. Mengatur rahasia

GitHub Actions menggunakan rahasia repositori yang Anda konfigurasi di langkah berikutnya. Anda hanya memerlukan file lokal jika Anda ingin menjalankan atau menguji Fastlane dari mesin sendiri. .env Untuk pengujian lokal, buat

di samping <project-root>/fastlane/.env __CAPGO_KEEP_0__ Fastfile. Jangan pernah mengirimkan file ini. Tambahkan fastlane/.env ke dalam .gitignore proyek pertama Anda (atau pastikan sudah diabaikan). Berikut adalah contoh:

APP_STORE_CONNECT_TEAM_ID=UVTJ336J2D
BUNDLE_IDENTIFIER=ee.forgr.testfastlane
# See previous section for these secrets
BUILD_CERTIFICATE_BASE64=
BUILD_PROVISION_PROFILE_BASE64=
APPLE_KEY_ID=
APPLE_ISSUER_ID=
APPLE_KEY_CONTENT=
P12_PASSWORD=
APPLE_PROFILE_NAME=

Mendapatkan ID Tim APP STORE CONNECT

Buka Pusat Pengembang dan gulir ke bawah ke Membership details bagian tersebut. Team ID adalah nilai yang perlu Anda masukkan ke dalam APP_STORE_CONNECT_TEAM_ID rahasianya.

app-store-connect-team-id

Mendapatkan ID BUNDLE IDENTIFIER

  1. Buka Xcode
  2. Klik dua kali pada App di navigator proyek
  3. Lalu klik tab Signing and Capabilities
  4. Salin nilai dari Bundle identifierNilai ini yang perlu Anda masukkan ke BUNDLE_IDENTIFIER secret.
bundle-identifier-xcode

6. Pengolahan Build

Di GitHub Actions, Anda dikenakan biaya berdasarkan menit yang digunakan untuk menjalankan alur kerja CI/CD Anda. Dari pengalaman saya, membutuhkan sekitar 10–15 menit sebelum build dapat diproses di App Store Connect. In Actions

Untuk proyek pribadi, biaya perkiraan per build dapat mencapai $0,08/min x 15 menit = $1,2, atau lebih, tergantung pada konfigurasi dan dependensi proyek Anda.

Jika Anda khawatir tentang biaya untuk proyek pribadi, Anda dapat mengatur skip_waiting_for_build_processing ke true. Ini akan menghemat menit build dengan tidak menunggu App Store Connect untuk selesai memproses build.

Namun, ada trade-off - Anda harus memperbarui informasi kesesuaian aplikasi Anda di App Store Connect sebelum Anda dapat mendistribusikan build kepada pengguna.

Optimasi ini lebih berguna untuk proyek pribadi di mana menit build mengeluarkan biaya. Untuk proyek publik/gratis, menit build gratis jadi tidak perlu mengaktifkan pengaturan ini. Lihat halaman harga GitHub untuk informasi lebih lanjut. 7. Mengatur __CAPGO_KEEP_0__ Actions

Konfigurasi rahasia GitHub

Configure GitHub secrets

Silakan salin rahasia dari .env file and paste them into the GitHub repository secrets.

Perlu pergi ke Pengaturan > Rahasia dan variabel > Aksi > Buat rahasia repository baru

github-secrets

2. BUILD_CERTIFICATE_BASE64 - Sertifikat yang di-Base64.

3. BUILD_PROVISION_PROFILE_BASE64 - Profil sertifikat Base64.

4. BUNDLE_IDENTIFIER - Identifikasi paket aplikasi Anda.

5. APPLE_KEY_ID — App Store Connect API Kunci 🔺ID Kunci.

6. APPLE_ISSUER_ID — App Store Connect API Kunci 🔺ID Penerbit.

7. APPLE_KEY_CONTENT — App Store Connect API Kunci 🔺 Isi Kunci dari .p8, periksa itu

8. Konfigurasi GitHub file aliran

Buat direktori aliran GitHub.

cd .github/workflows

Di dalam folder, buat file bernama workflow dan tambahkan yang berikut. build-upload-ios.ymldan tambahkan yang berikut.

name: Build source code on ios

on:
  push:
    tags:
      - '*'

jobs:
  build_ios:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: npm
      - name: Install dependencies
        id: install_code
        run: npm ci
      - name: Build
        id: build_code
        run: npm run build
      - uses: actions/cache@v5
        with:
          path: ios/App/Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - name: Sync
        id: sync_code
        run: npx cap sync
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.0'
          bundler-cache: true
      - uses: maierj/fastlane-action@v3.1.0
        env:
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          BUNDLE_IDENTIFIER: ${{ secrets.BUNDLE_IDENTIFIER }}
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          APPLE_PROFILE_NAME: ${{ secrets.APPLE_PROFILE_NAME }}
        with:
          lane: ios beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v6
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 10

Alur ini harus diaktifkan setelah setiap GitHub tagtag, jika Anda perlu mengotomatisasi tag, silakan lihat Automatic build dan rilis dengan GitHub actions terlebih dahulu.

Kemudian alur ini akan menarik dependensi NodeJS Anda, menginstalnya, dan membangun aplikasi JavaScript Anda.

Setiap kali Anda mengirimkan komit baru, rilis akan dibangun di TestFlight.

Aplikasi Anda tidak perlu menggunakan Ionic, hanya dasar Capacitor yang wajib, dan dapat memiliki modul Cordova lama, tetapi Capacitor plugin JavaScript disarankan.

8. Aktifkan alur ini

Buat Komit

Buat perubahanKamu akan melihat alur kerja aktif di repository.

Trigger Alur Kerja

Push komit baru ke cabang main atau development Bagaimana cara mengaktifkan alur kerja?

Untuk mengaktifkan alur kerja.

Dibuat dengan komit

Setelah beberapa menit, hasil build harus tersedia di dashboard App Store Connect Anda.

Dashboard Testflight

9. Apakah saya bisa mengunduh dari mesin lokal?

Ya, kamu bisa, dan itu sangat mudah.

Panduan Pengaturan CI/CD

Alternatif Platform CI/CD

Pembaruan Langsung &amp; Pengiriman

Terima Kasih

Blog ini berdasarkan artikel berikut:

Keep going from Automatic Capacitor IOS build with GitHub actions with certificate

Jika Anda menggunakan Automatic Capacitor IOS build with GitHub actions with certificate Untuk merencanakan otomatisasi CI/CD, hubungkannya dengan Capgo CI/CD untuk alur kerja produk di Capgo CI/CD, Capgo Pembangunan Nativ untuk alur kerja produk di Capgo Pembangunan Nativ, Capgo Integrasi untuk alur kerja produk di Capgo Integrasi, Integrasi CI/CD untuk detail implementasi di Integrasi CI/CD, dan GitHub Integrasi Aksi untuk detail implementasi di GitHub Integrasi Aksi

Live update untuk Capacitor aplikasi

Ketika bug layer web masih aktif, kirimkan perbaikan melalui Capgo bukan menunggu hari-hari untuk persetujuan toko aplikasi. Pengguna mendapatkan update di latar belakang sementara perubahan native tetap dalam jalur review normal.

Dukungan Manusia dari Martin

Mulai Sekarang

Terbaru dari Blog Kami

Capgo memberikan Anda wawasan terbaik yang Anda butuhkan untuk menciptakan aplikasi mobile yang profesional sebenarnya.