Lompat ke konten utama
CI/CD

Automatic Capacitor IOS build with GitHub actions with certificate

Cara mengatur pipeline CI/CD untuk aplikasi IOS Ionic Anda menggunakan fastlane dan GitHub dalam waktu 5 menit (2024)

Kredit Artikel

Martin Donadieu

Pengarang

Valeria

Pengulas

Jordan

Pengedit

Automatic Capacitor IOS build dengan GitHub aksi dengan sertifikat

Pengaturan CI/CD untuk aplikasi Capacitor dapat kompleks dan memakan waktu. Berikut adalah hal-hal yang perlu Anda ketahui:

Sekarang kami merekomendasikan menggunakan Capgo Build dengan Capgo CLI untuk pembangunan Capacitor asli. Petunjuk Fastlane ini disimpan untuk tim yang menjaga pipeline aksi GitHub yang sudah ada, tetapi pembangunan iOS baru harus menggunakan Capgo CLI agar Anda tidak perlu menjaga Fastlane, pengguna Xcode, sertifikat, dan skrip unggah sendiri.

Capgo Build untuk CI/CD oleh Capgo

Lebih baik menghindari menjaga Fastlane, pengguna Xcode, sertifikat, profil pengaturan, dan skrip unggah. Capgo Build runs signed native iOS builds from your existing CI/CD pipeline:

  • Bekerja sama dengan pipeline Anda: Aktifkan Capgo Build dari GitHub Actions, GitLab CI, Jenkins, atau skrip lokal setelah build web Anda npx cap sync.
  • Menggunakan rahasia CISimpan kunci App Store Connect, sertifikat, profil pengaturan, kata sandi, dan ID tim di rahasia CI milik Anda sendiri.
  • Tidak ada perawatan runner asliMembangun Capgo menyediakan lingkungan build Apple yang terkelola, sehingga Anda tidak perlu mengelola runner macOS, gambar Xcode, atau jalur Fastlane.
  • Artikel dan pengiriman: Unduh artefak yang ditandatangani untuk QA atau kirimkan rilis build melalui Capgo CLI.

Penghargaan

  • Capgo plans start at $12/month
  • Termasuk pembaruan OTA dan sekitar 15 bangun asli per bulan
  • Menit pembangunan tambahan dikenakan biaya per menit melalui kredit

Atur Capgo Build di CI/CD

Petunjuk Pengaturan Manual

Berikut apa yang perlu Anda lakukan:

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

Prerequisites

Sebelum melanjutkan dengan tutorial ini:

  • Pastikan Anda telah menginstal Fastlane installed Pastikan Anda merupakan anggota program pengembang iOS.
  • Pastikan Anda sudah menjadi anggota program pengembang iOS.

Harga __CAPGO_KEEP_0__ Action

https://GitHub.com/features/actions

https://github.com/features/actions

Jasa ini adalah ‘free’ sampai batas yang ditentukan, tergantung pada mesin yang dipilih.
Kami akan menggunakan machine mesin, Anda dapat melihat harga dan batasan (harga pada saat pembuatan tutorial, mereka mungkin mengalami perubahan di masa depan)

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

Catatan: Dalam artikel ini 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
      • Menggunakan Kunci App Store Connect API
  2. Menyalin File Fastlane
  3. Configure GitHub Actions

1. Menggunakan 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.
Mulai Dukungan Apple

Bantuan Apple

Untuk memungkinkan Fastlane menggunakan App Store Connect API untuk mengunggah aplikasi Anda, Anda perlu menyediakan informasi berikut. three tiga

  1. hal:
  2. ID Issuer
  3. Kunci File atau Kunci Konten

Mendapatkan Kunci App Store Connect API

To generate keys, you must have Admin permission in App Store Connect. If you don’t have that permission, you can direct the relevant person to this article.

  1. Masuk ke Aplikasi Store Connect.

  2. Pilih Pengguna dan Akses.

Akses Pengguna Aplikasi Store Connect

3 — Pilih tab Integrasi.

Aplikasi Store Connect API Integrasi

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

Aplikasi Store Connect API kunci membuat

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

Aplikasi Store Connect API kunci membuat nama

6 — Di bawah Akses, pilih peran untuk kunci. Peran yang berlaku untuk kunci sama dengan peran yang berlaku untuk pengguna di tim Anda. Lihat Izin Akses PeranKami merekomendasikan untuk memilih Pengelola aplikasi.

  1. Click Generate.

Hak akses API tidak dapat dibatasi pada aplikasi tertentu.

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

Unduh kunci App Store Connect

Di sini Anda dapat mengambil tiga informasi yang diperlukan.
<1> ID Masalah. (APPLE_ISSUER_ID rahasianya)
<2> ID Kunci. (APPLE_KEY_ID rahasianya)
Klik <3> ‘Download API Key’ untuk mengunduh kunci pribadi API Anda. Tautan download hanya muncul jika kunci pribadi belum diunduh. Apple tidak menyimpan salinan kunci pribadi. Jadi, Anda hanya bisa mengunduhnya sekali.

🔴 Simpan kunci pribadi Anda di tempat yang aman. Anda tidak boleh berbagi kunci, menyimpan kunci di code repository, atau menyertakan kunci di code sisi klien.

Menggunakan Kunci API App Store Connect

File Kunci API (p8 file yang Anda download), ID kunci, dan ID pengirim adalah diperlukan untuk membuat token JWT untuk otorisasi. Ada beberapa cara informasi ini dapat diberikan ke Fastlane. Saya memilih menggunakan aksi baru Fastlane app_store_connect_api_keyAnda dapat mengetahui cara lainnya di Dokumentasi FastlaneSekarang kita bisa mengelola App Store Connect dengan Fastlane menggunakan kunci __CAPGO_KEEP_0__, hebat!

Silakan mengonversi file p8 yang Anda download ke Base64 dan simpan sebagai rahasia ("APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Sekarang kita dapat mengelola App Store Connect dengan Fastlane menggunakan kunci API, hebat!

2. Sertifikat

Buka XCode dan navigasikan ke Settings > Akun > ID Apple > Tim dan pilih tim Anda.

Code identitas tanda tangan

Klik pada Kelola sertifikat.

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

Klik pada + Pilih dan pilih Distribusi Apple

Distribusi Apple

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

Untuk melakukan hal ini, Anda perlu pergi ke keychain, ubah ke keychain login keychain kemudian tab Sertifikat Saya.

Sertifikat Saya

Anda dapat memilih sertifikat yang ingin Anda download. (Cari berdasarkan tanggal sertifikat)

Dan kemudian klik kanan pada kunci pribadi pada sertifikat dan pilih Ekspor.

Pilih format file Informasi Pribadi Pertukaran (.p12).

File itu akan mengunduh sertifikat sebagai .p12 file.

Silakan buka file tersebut di terminal dan gunakan perintah berikut untuk mengonversinya ke Base64:

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

Akan menjadi milik Anda BUILD_CERTIFICATE_BASE64 Kunci rahasia. Selain itu, ketika diminta, silakan berikan kata sandi sertifikat Anda. Kata sandi ini akan menjadi kunci Anda. P12_PASSWORD Buka

3. Profil Pengaturan

Ekspor Pilih format file Pilih tim yang tepat.

Membuat profil baru, dengan mengklik pada +

Membuat Profil Baru

Dan pilih App Store Connect.

Pilih App Store Connect

Anda perlu memilih aplikasi yang tepat, hati-hati karena tidak boleh menggunakan wildcard, jika tidak proses signing akan gagal.

Pilih aplikasi yang tepat

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

Pilih sertifikat yang tepat

Finally enter the name of the profile and click on Membuat.

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

Membuat profil

Anda dapat mengunduh profil sebagai .mobileprovision file.

Mengunduh 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 umum. Dengan menggunakan Fastlane, Anda dapat mengonfigurasi jalur kustom yang menggabungkan serangkaian aksi yang melakukan tugas yang biasanya Anda lakukan menggunakan Android Studio. Anda dapat melakukan banyak hal dengan Fastlane, tetapi untuk tujuan tutorial ini, kita hanya akan menggunakan beberapa aksi inti.

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

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

ini sama tingkat dengan package.json, capacitor.config.*, dan ios/ folder. Jangan membuatnya 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

Aksi GitHub menggunakan rahasia repositori yang Anda konfigurasi di langkah berikutnya. Anda hanya memerlukan sebuah .env Jika Anda ingin menjalankan atau menguji Fastlane dari mesin sendiri.

berikutnya di samping <project-root>/fastlane/.env dekat dengan FastfileJangan tambahkan file ini ke repositori. Tambahkan. fastlane/.env kepadamu .gitignore Periksa terlebih dahulu (atau pastikan sudah diabaikan). Berikut 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 Pengembang App Store Connect

Pergi ke Pusat Pengembang dan gulir ke bawah ke Membership details section. The Team ID adalah nilai yang Anda perlu atur dalam APP_STORE_CONNECT_TEAM_ID secret.

app-store-connect-team-id

Mendapatkan BUNDLE_IDENTIFIER

  1. Buka Xcode
  2. Klik dua kali pada App di navigator proyek
  3. Klik tab tersebut Signing and Capabilities
  4. Salin nilai dari Bundle identifier Ini adalah nilai yang perlu Anda tetapkan di BUNDLE_IDENTIFIER rahasianya.
bundle-identifier-xcode

6. Pengolahan Build

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

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 trueini akan menghemat waktu pembangunan dengan tidak menunggu App Store Connect untuk selesai memproses pembangunan.

Namun, ada kekurangan - Anda harus memperbarui informasi kesesuaian aplikasi secara manual di App Store Connect sebelum dapat mendistribusikan pembangunan ke pengguna.

Optimasi ini lebih berguna untuk proyek pribadi di mana waktu pembangunan berbiaya. Untuk proyek publik/gratis, waktu pembangunan gratis sehingga tidak perlu mengaktifkan pengaturan ini. Lihat halaman harga GitHub untuk informasi lebih lanjut. 7. Konfigurasi __CAPGO_KEEP_0__ Actions

Konfigurasi rahasia GitHub

Konfigurasi rahasia GitHub

Silakan salin rahasia dari .env masukkan file dan tempelkan mereka ke dalam rahasia GitHub repository.

Pergi ke Settings &gt; Rahasia dan Variabel &gt; Aksi &gt; Repository Rahasia Baru

github-rahasia

2. BUILD_CERTIFICATE_BASE64 - Sertifikat yang telah di-Base64.

3. BUILD_PROVISION_PROFILE_BASE64 - Profil Pengembangan yang telah di-Base64.

4. BUNDLE_IDENTIFIER - Identifikasi Paket Aplikasi Anda.

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

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

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

8. Konfigurasi GitHub file aliran

Buat direktori aliran GitHub.

cd .github/workflows

Dalam workflow dan tambahkan kode berikut. build-upload-ios.ymlAliran ini harus diaktifkan setelah setiap __CAPGO_KEEP_0__

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

Ini alur kerja yang harus diaktifkan setelah setiap GitHub tagAutomatic build dan rilis dengan __CAPGO_KEEP_0__ aksi Automatic build dan rilis otomatis dengan aksi GitHub pertama.

Kemudian alur kerja 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 harus dipilih.

8. Aktifkan alur kerja

Create a Commit

Buat komit, Anda harus melihat alur kerja aktif di repository.

Aktifkan alur kerja

Push komit baru ke cabang main atau development untuk mengaktifkan alur kerja.

Dibuat dengan commit

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

Dashboard Testflight

9. Apakah saya bisa mengdeploy dari mesin lokal?

Iya, Anda bisa, dan itu sangat mudah.

You can use Xcode to build and sign your app, as always.

Panduan Pengaturan CI/CD

Platform CI/CD Alternatif

Pembaruan Otomatis dan Pengembangan

Terima kasih

Blog ini didasarkan pada artikel berikut:

Teruskan dari Automatic Capacitor build IOS otomatis dengan GitHub actions dengan sertifikat

Jika Anda menggunakan Automatic Capacitor build IOS otomatis dengan GitHub actions dengan sertifikat untuk merencanakan otomatisasi CI/CD, hubungkannya dengan Capgo CI/CD untuk alur kerja produk di Capgo Otomatisasi CI/CD, Capgo Pembangunan Asli untuk alur kerja produk di Capgo Pembangunan Asli, Capgo Integrasi untuk alur kerja produk di Integrasi Capgo untuk alur kerja produk di __CAPGO_KEEP_0__ Integrasi, untuk detail implementasi di Integrasi CI/CD, dan Integrasi GitHub Actions Untuk detail implementasi di GitHub Integrasi Aksi.

Live updates untuk Capacitor aplikasi

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

Terbaru dari Blog kami

Capgo memberikan Anda wawasan terbaik yang Anda butuhkan untuk membuat aplikasi mobile profesional sejati.