Lebih lanjut ke konten utama
Integrasi CI/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)

Martin Donadieu

Martin Donadieu

Pengembang Konten

Automatic Capacitor IOS build with GitHub actions with certificate

Setelah mengatur CI/CD untuk aplikasi Capacitor dapat menjadi kompleks dan memakan waktu. Berikut adalah apa yang perlu Anda ketahui:

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

Pembangunan Capgo untuk CI/CD oleh Capgo

Lebih baik menghindari Fastlane, pengguna Xcode, sertifikat, profil pengaturan, dan skrip unggah. Pembangunan Capgo melakukan pembangunan iOS asli yang ditandatangani dari pipeline CI/CD yang sudah ada:

  • Kompatibel dengan pipeline Anda: Aktifkan Pembangunan Capgo dari GitHub Actions, GitLab CI, Jenkins, atau skrip lokal setelah pembangunan web Anda dan npx cap sync.
  • Tanda tangan dari rahasia CI: Simpan kunci App Store Connect, sertifikat, profil pengaturan, kata sandi, dan ID tim di rahasia CI Anda sendiri.
  • Tidak perlu menjaga pengguna runner asli: Pembangunan Capgo menyediakan lingkungan pembangunan Apple yang diperbarui, sehingga Anda tidak perlu mengelola pengguna macOS, gambar Xcode, atau jalur Fastlane.
  • Artikel dan pengiriman: Unduh artefak yang ditandatangani untuk QA atau kirimkan rilis build melalui Capgo CLI.

Pembayaran

  • Capgo plans start at $12/month
  • Pembayaran __CAPGO_KEEP_0__ mulai dari $12/bulan
  • Termasuk pembaruan OTA dan sekitar 15 build native per bulan

Set up Capgo Build in CI/CD

Setup __CAPGO_KEEP_0__ Build di CI/CD

Petunjuk Manual

Continuous Delivery for iOS using Fastlane and GitHub Actions and certificate

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

Prasyarat sebelum melanjutkan tutorial:

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

Harga __CAPGO_KEEP_0__ Action

https://GitHub.com/features/actions

https://github.com/features/actions

gratis’hingga batas tertentu, tergantung pada mesin yang dipilih. Kami akan menggunakan sebuah
macOS 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 postingan ini 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 App Store Connect API
  2. Mengcopy File-File Fastlane
  3. Mengkonfigurasi Aksi GitHub

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.
From 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

Mengambil Kunci App Store Connect API

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 Aplikasi Toko App.

  2. Pilih Pengguna dan Akses.

Akses Pengguna Aplikasi Toko App

3 — Pilih tab Integrasi.

Aplikasi Toko App API Integrasi

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

Aplikasi Toko App API kunci membuat

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

Aplikasi Toko App 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 Hak akses rolePilihlah Pengelola Aplikasi.

  1. Klik Buat.

Kunci API tidak dapat dibatasi aksesnya untuk aplikasi tertentu.

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

Unduh kunci App Store Connect

Kamu bisa mendapatkan semua informasi yang dibutuhkan di sini.
<1> ID Masalah. (APPLE_ISSUER_ID rahasia)
<2> ID Kunci. (APPLE_KEY_ID rasis)
Klik <3> ‘Download API Key’ untuk mendownload kunci API pribadi Anda. Tautan download hanya muncul jika kunci pribadi belum pernah didownload. Apple tidak menyimpan salinan kunci pribadi. Jadi, Anda hanya bisa mendownloadnya 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 untuk mengirimkan informasi ini ke Fastlane. Saya memilih untuk menggunakan aksi baru Fastlane app_store_connect_api_keySaya menunjukkan metode ini karena saya pikir ini adalah cara yang paling mudah untuk bekerja dengan CI kebanyakan, di mana Anda bisa mengatur variabel lingkungan. Silakan lihat cara lainnya di Dokumentasi Fastlane

Sekarang kita bisa mengelola App Store Connect dengan Fastlane menggunakan kunci __CAPGO_KEEP_0__, hebat!APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Now we can manage the App Store Connect with Fastlane using the API key, great!

Buka XCode dan pergi ke

Pengaturan 2. Sertifikat > Akun > ID Apple > Tim dan pilih tim Anda.

Code identitas tanda tangan

Klik pada Pengelola sertifikat.

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

Klik pada + dan pilih Distribusi Apple

Distribusi Apple

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

Untuk melakukan itu, Anda perlu pergi ke keychain, ganti ke keychain login, kemudian tab keychain login keychain login Maka Anda dapat memilih sertifikat yang ingin Anda download. (Cari berdasarkan tanggal sertifikat).

dan kemudian klik kanan pada kunci pribadi pada sertifikat dan pilih

pilih

pilih Ekspor.

Pilih format file Informasi Pribadi Pertukaran (.p12).

File tersebut akan didownload sebagai .p12 file.

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

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

File tersebut akan menjadi rahasmu. Selain itu, ketika diminta, silakan berikan kata sandi sertifikat. Kata sandi tersebut akan menjadi rahasmu. BUILD_CERTIFICATE_BASE64 3. Profil Pengaturan P12_PASSWORD Buka

Pengembang Apple

Konversi Ekspor 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 harus memilih aplikasi yang tepat, berhati-hatilah karena Anda tidak dapat menggunakan wildcard lainnya, 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 Lanjutkan.

Pilih Sertifikat yang Tepat

Terakhir, masukkan nama profil dan klik pada Membuat.

Nama ini akan digunakan untuk mengidentifikasi profil di Fastlane, di bawah nilai dari 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 mengotomasi tugas pengembangan mobile yang umum. Dengan menggunakan Fastlane, Anda dapat mengonfigurasi jalur kustom yang dapat 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

Level ini 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 Aksi menggunakan rahasia repositori yang Anda atur di langkah berikutnya. Anda hanya memerlukan file lokal jika Anda ingin menjalankan atau menguji Fastlane dari mesin sendiri. .env Untuk pengujian lokal, buat

berikutnya di samping <project-root>/fastlane/.env . Jangan komit file ini. Tambahkan Fastfileke dalam fastlane/.env pertama (atau pastikan sudah diabaikan). Berikut adalah contoh: .gitignore Mendapatkan ID TIM APLIKASI APP STORE

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=

Setting up secrets

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

app-store-connect-team-id

Mendapatkan BUNDLE_IDENTIFIER

  1. Buka Xcode
  2. Ganda klik pada App dalam navigator proyek
  3. Kemudian klik pada tab Signing and Capabilities
  4. Salin nilai dari Bundle identifier Ini adalah nilai yang perlu Anda tetapkan di BUNDLE_IDENTIFIER secret.
bundle-identifier-xcode

6. Pengolahan Proses

Di GitHub Actions, biaya Anda akan ditagih berdasarkan menit yang telah digunakan untuk menjalankan alur kerja CI/CD Anda. Dari pengalaman saya, membutuhkan sekitar 10–15 menit sebelum proses pembangunan dapat diproses di App Store Connect. Untuk proyek pribadi, biaya perkiraan per pembangunan 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

__CAPGO_KEEP_0__ skip_waiting_for_build_processing ke trueMenyimpan waktu pembangunan ini dapat menghemat menit pembangunan dengan tidak menunggu App Store Connect untuk selesai memproses pembangunan.

Namun, ada pertukaran - Anda harus memperbarui informasi kesesuaian 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. Mengatur Aksi __CAPGO_KEEP_0__

Konfigurasi rahasia GitHub

Silakan salin rahasia dari file dan tempelkan ke rahasia GitHub di repository.

Pergi ke .env file and paste them into the GitHub repository secrets.

Settings Settings &gt; Rahasia dan Variabel &gt; Aksi &gt; Secret Baru Repositori

github-rahasia

2. BUILD_CERTIFICATE_BASE64 - Sertifikat yang telah di-Base64.

3. BUILD_PROVISION_PROFILE_BASE64 - Profil Pengembang yang telah di-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 – Daftar Aplikasi Apple API Kunci 🔺 Isi kunci kunci ini .p8, Periksa itu

8. Konfigurasi GitHub file aliran

Buat direktori aliran GitHub.

cd .github/workflows

Dalam direktori tersebut, buat file bernama 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

This workflow should be triggered after each GitHub Jika Anda perlu otomatisasi tag, silakan lihatAutomatic build dan rilis dengan __CAPGO_KEEP_0__ aksi Automatic build and release with GitHub actions pertama.

Lalu alur kerja ini akan menarik kembali 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 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 commit

Sesudah 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

Alternatif Platform CI/CD

Pembaruan Hidup &amp; Pengiriman

Terima kasih

Artikel 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 Otomatisasi CI/CD untuk alur kerja produk di Capgo Otomatisasi CI/CD, Capgo Pembangunan Nativ untuk alur kerja produk di Capgo Pembangunan Nativ, Capgo Integrasi for the product workflow in Capgo Integrations, untuk alur kerja produk di __CAPGO_KEEP_0__ Integrasi, Integrasi CI/CD GitHub Actions Integration for the implementation detail in GitHub Actions Integration.

Update Hidup untuk Capacitor aplikasi

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

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

Mulai Sekarang

Terbaru dari Blog Kami

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