Lewati ke konten utama
CI/CD

Pembangunan Otomatis Capacitor IOS dengan GitHub aksi dengan sertifikat

Cara Mengatur Pipa CI/CD untuk Aplikasi IOS Ionic Anda menggunakan fastlane dan GitHub Aksi dalam 5 menit (2024)

Martin Donadieu

Martin Donadieu

Pengembang Konten

Pembangunan Otomatis Capacitor IOS dengan GitHub aksi dengan sertifikat

Mengatur 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 native Capacitor. Panduan Fastlane ini dipertahankan untuk tim yang mempertahankan pipeline aksi GitHub yang sudah ada, tetapi pembangunan iOS baru harus menggunakan Capgo CLI sehingga Anda tidak perlu mempertahankan Fastlane, runner Xcode, sertifikat, dan skrip unggah sendiri.

Capgo Build untuk CI/CD oleh Capgo

Lepaskan Fastlane, runner Xcode, sertifikat, profil pengaturan, dan skrip unggah. Capgo Build melakukan pembangunan native iOS yang ditandatangani dari pipeline CI/CD Anda:

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

Harga

  • Rencana Capgo mulai dari $12/bulan
  • Menggunakan pembaruan OTA dan sekitar 15 build asli per bulan
  • Menit tambahan build yang dibebankan dengan menit melalui kredit

Set up Capgo Build di CI/CD

Petunjuk Manual Pengaturan

Berikut adalah langkah-langkah yang perlu Anda lakukan:

Pengiriman Terus Menerus untuk iOS menggunakan Fastlane dan Aksi GitHub dan sertifikat

Persyaratan

Sebelum melanjutkan dengan tutorial:

  • Pastikan Anda telah menginstal Fastlane di mesin pengembangan Anda. Pastikan Anda merupakan anggota program pengembang iOS.
  • Informasi penting tentang harga

Harga Aksi __CAPGO_KEEP_0__

https://GitHub.com/features/actions

https://github.com/features/actions

Pelayanan ini adalah ‘gratis hingga batas yang ditentukan, tergantung pada mesin yang dipilih.
Kita akan menggunakan sebuah mesin macOS mesin, Anda dapat melihat harga dan batasan (harga pada saat pembuatan tutorial, mereka mungkin mengalami perubahan di masa depan)

Setelah diberi peringatan tentang persyaratan dan harga, mari kita melanjutkan.

Catatan: Dalam postingan saya, saya asumsikan Anda telah membuat aplikasi di App Store Connect. Informasi penting akan dicopy 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 API App Store Connect
  2. Salin File-File Fastlane
  3. Konfigurasi Aksi GitHub

1. Menggunakan App Store Connect API dengan Fastlane

Mulai Februari 2021, autentikasi 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 Dukungan Apple

Persyaratan

Untuk Fastlane dapat menggunakan 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 API Kunci 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 API App Store Connect

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

App Store Connect API keys create

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

App Store Connect API keys create nama

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

  1. Klik Generate.

Akses kunci API tidak dapat dibatasi pada aplikasi tertentu.

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

App Store Connect download keys

Anda dapat mengambil semua informasi yang diperlukan di sini.
ID Masalah. (APPLE_ISSUER_ID ID Kunci. (
Klik "Unduh __CAPGO_KEEP_0__ Kunci" untuk mengunduh kunci pribadi __CAPGO_KEEP_1__ Anda. Tautan download 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 mencantumkan kunci di sisi klien __CAPGO_KEEP_1__.
<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. Saya menunjukkan metode ini karena saya pikir ini adalah cara yang paling mudah untuk bekerja dengan CI yang paling umum, di mana Anda dapat menetapkan variabel lingkungan. Silakan mengonversi file p8 yang Anda download ke Base64 dan simpan sebagai rahasia (Saya menunjukkan metode ini karena saya pikir ini adalah cara yang paling mudah untuk bekerja dengan CI yang paling umum, di mana Anda dapat menetapkan variabel lingkungan.

Saya menunjukkan metode ini karena saya pikir ini adalah cara yang paling mudah untuk bekerja dengan CI yang paling umum, di mana Anda dapat menetapkan variabel lingkungan.APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

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

2. Sertifikat

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

Sertifikat Code identitas tanda tangan

Klik pada Kelola sertifikat.

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

Klik pada + dan pilih Distribusi Apple

Distribusi Apple

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

Untuk melakukannya, Anda perlu pergi ke keychain untuk beralih ke keychain login keychain login Lalu Anda dapat memilih sertifikat yang ingin Anda download. (Cari berdasarkan tanggal sertifikat) .

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

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

Klik kanan pada kunci pribadi di sertifikat dan pilih Export.

Pilih format file Informasi Pribadi (p12).

File tersebut akan diunduh sebagai .p12 file.

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

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

ini akan menjadi BUILD_CERTIFICATE_BASE64 rahasiamu. Selain itu, ketika diminta, silakan berikan kata sandi sertifikat. Kata sandi ini akan menjadi P12_PASSWORD rahasiamu.

3. Profil Pengaturan

Buka Apple Developer dan pilih tim yang tepat.

Kemudian buatlah 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 karena Anda tidak dapat menggunakan wildcard lainnya, karena 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 Lanjutkan.

Pilih sertifikat yang tepat

Masukkan nama profil terakhir dan klik pada Generate.

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

Buat 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 mengotomasi tugas pengembangan mobile yang 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 direktori proyek Capacitor/Ionic Anda dan tambahkan file Fastfile di sana:

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

Ini adalah tingkat yang sama seperti 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

GitHub Aksi menggunakan rahasia repository yang Anda konfigurasi di langkah berikutnya. Anda hanya memerlukan file lokal .env jika Anda ingin menjalankan atau menguji Fastlane dari mesin sendiri.

Untuk pengujian lokal, buat <project-root>/fastlane/.env di samping Fastfile. Jangan komit file ini. Tambahkan fastlane/.env ke dalam .gitignore pertama (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 APLIKASI APP STORE CONNECT

Pergi ke Pusat Pengembang dan gulir ke bawah ke Membership details Bab. Team ID adalah nilai yang perlu Anda tetapkan di APP_STORE_CONNECT_TEAM_ID rahasia.

app-store-connect-team-id

Mendapatkan ID BUNDLE

  1. Buka Xcode
  2. Dua kali klik pada App dalam navigator proyek
  3. Klik tab kemudian. Signing and Capabilities
  4. Salin nilai dari " Bundle identifierIni adalah nilai yang perlu Anda atur di " BUNDLE_IDENTIFIER rahasianya.
bundle-identifier-xcode

6. Proses Pengompilan

Dalam GitHub Aksi, Anda dikenakan biaya berdasarkan menit yang digunakan untuk menjalankan alur kerja CI/CD Anda. Dari pengalaman saya, membutuhkan waktu sekitar 10–15 menit sebelum proses pengompilan dapat diproses di App Store Connect. Untuk proyek pribadi, biaya perkiraan per pengompilan dapat mencapai

$0,08/min x 15 menit = $1,2 , atau lebih, tergantung pada konfigurasi dan dependensi proyek Anda.you are billed based on the minutes you have used for running your CI/CD workflow. From my experience, it takes about 10–15 minutes before a build can be processed in App Store Connect.

If Anda khawatir tentang biaya untuk proyek pribadi, Anda dapat menyetel skip_waiting_for_build_processing ke true. Ini akan menyimpan menit pembangunan dengan tidak menunggu App Store Connect untuk selesai memproses pembangunan.

Tapi, ada pertukaran - Anda harus memperbarui informasi keselarasandan aplikasi secara manual di App Store Connect sebelum Anda dapat mendistribusikan pembangunan ke pengguna.

Optimasi ini lebih berguna untuk proyek pribadi di mana menit pembangunan menghabiskan uang. Untuk proyek publik/gratis, menit pembangunan gratis jadi tidak perlu mengaktifkan pengaturan ini. Lihat halaman harga GitHub untuk informasi lebih lanjut. 7. Konfigurasi __CAPGO_KEEP_0__ Aksi Konfigurasi rahasia __CAPGO_KEEP_0__

7. Setup GitHub Actions

file dan tempelkan ke dalam rahasia GitHub di repository.

Pergi ke .env Konfigurasi rahasia GitHub

Konfigurasi rahasia __CAPGO_KEEP_0__ Pengaturan > Rahasia dan variabel > Aksi > Rahasia repositori baru

github-rahasia

2. BUILD_CERTIFICATE_BASE64 - Sertifikat yang dikodekan Base64.

3. BUILD_PROVISION_PROFILE_BASE64 - Profil pengaturan yang dikodekan Base64.

4. BUNDLE_IDENTIFIER - Identifikasi paket aplikasi Anda.

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

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

7. APPLE_KEY_CONTENT — Kunci API App Store Connect 🔺 Konten kunci. .p8, Cek itu

8. Konfigurasi GitHub file aliran kerja

Buat direktori aliran kerja GitHub.

cd .github/workflows

Di dalam workflow folder, buat file bernama build-upload-ios.ymldan tambahkan kode 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

Aliran kerja ini harus diaktifkan setelah setiap GitHub tag, jika Anda perlu mengautomatisasi tag silakan lihat Pembangunan dan rilis otomatis dengan GitHub aksi terlebih dahulu.

Kemudian aliran kerja ini akan pull dependensi NodeJS, menginstalnya dan membangun aplikasi JavaScript Anda.

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

Aplikasi Anda tidak perlu menggunakan Ionic, hanya dasar Capacitor yang wajib., Aplikasi Anda dapat memiliki modul Cordova yang lama, tetapi plugin JS Capacitor harus dipilih.

8. Aktifkan alur kerja

Buat Komit

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 komit

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

Dashboard Testflight

9. Apakah saya bisa mengdeploy dari mesin lokal?

Ya, Anda bisa, dan itu sangat mudah.

Anda bisa menggunakan Xcode untuk membangun dan menandatangani aplikasi Anda, seperti biasa.

Panduan Pengaturan CI/CD

Penggunaan Platform CI/CD Alternatif

Pembaruan Hidup & Pengaturan

Terima kasih

Blog ini berdasarkan artikel berikut:

Teruslah dari Pembangunan IOS Otomatis Capacitor dengan GitHub aksi dengan sertifikat

Jika Anda menggunakan Pembangunan IOS Otomatis Capacitor dengan GitHub aksi dengan sertifikat untuk merencanakan otomatisasi CI/CD, hubungkannya dengan Capgo CI/CD untuk alur kerja produk di Capgo CI/CD, Capgo Pembangunan Asli untuk alur kerja produk di Capgo Pembangunan Asli, 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.

Pembaruan Langsung untuk Capacitor aplikasi

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

Mulai Sekarang

Terbaru dari Blog Kami

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