Mengatur CI/CD untuk aplikasi Capacitor dapat kompleks dan memakan waktu. Berikut ini yang perlu Anda ketahui:
Dianjurkan untuk Pembangunan Baru: Gunakan Capgo Pembangunan
Sekarang kami merekomendasikan menggunakan Capgo Pembangunan dengan Capgo CLI untuk pembangunan Capacitor asli. Petunjuk Panduan Fastlane ini disimpan untuk tim yang menjaga pipeline GitHub Actions yang sudah ada, tetapi build iOS baru harus menggunakan Capgo CLI sehingga Anda tidak perlu menjaga Fastlane, runner Xcode, sertifikat, dan skrip unggah sendiri.
Prasyarat
Sebelum memulai, Anda perlu mengatur:
- Akun GitHub dengan akses admin
- Anggota program pengembang iOS
- Akses API App Store Connect dengan izin yang tepat
- Pengertian tentang GitHub Actions workflows
- Pengetahuan tentang konfigurasi Fastlane
- Waktu untuk menjaga dan memperbaiki pipeline
- Sertifikat dan profil pengembang yang tepat
Pengaturan CI/CD Profesional oleh Capgo
Lepaskan kompleksitas. Capgo mengatur pipa CI/CD Anda secara langsung di platform favorit Anda:
- Kemandirian Platform: Berfungsi dengan GitHub Actions, GitLab CI, atau lainnya
- Integrasi Tanpa Gangguan: Tidak perlu berganti platform, berfungsi dengan proses Anda saat ini
- Konfigurasi yang Disesuaikan: Pengaturan yang disesuaikan sesuai kebutuhan proyek Anda
- Bimbingan Ahli: Kami telah mengatur CI/CD untuk 50+ aplikasi
Pricing
- Biaya pengaturan satu kali: $2,600
- Biaya operasional Anda: sekitar $300/tahun
- Bandingkan dengan Solusi Proprietary Lainnya: $6,000/tahun
- Simpan $26,100 selama 5 tahun
Petunjuk Manual Setup
Jika Anda masih ingin mengatur segalanya sendiri, berikut adalah 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 di mesin pengembangan Anda. di mesin pengembangan Anda.
- Pastikan Anda merupakan anggota program pengembang iOS.
Informasi penting tentang harga.

https://github.com/features/actions
Pelayanan ini adalah ‘gratis’sampai batasnya, tergantung pada mesin yang dipilih. Kami akan menggunakan sebuah
mesin macOS, Anda dapat melihat harga dan batasannya (harga sesuai dengan pembuatan tutorial, mereka mungkin mengalami perubahan di masa depan) Setelah diingatkan 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!
Pilih program pengembang iOS yang tepat untuk Anda.
Harga yang ditawarkan sangat beragam.
Apa yang akan Anda pelajari dalam tutorial
Langkah-langkah yang harus diikuti dalam postingan
- Menggunakan App Store Connect API dengan Fastlane
- Persyaratan:
- Membuat Kunci App Store Connect API
- Menggunakan Kunci App Store Connect API
- Persyaratan:
- Salin File Fastlane
- Konfigurasi 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.
Dari Dukungan Apple
Persyaratan
Untuk Fastlane dapat menggunakan App Store Connect API untuk mengunggah aplikasi Anda, Anda perlu menyediakan hal-hal berikut: tiga hal:
- ID Penerbit
- ID Kunci
- File Kunci atau Konten Kunci
Mendapatkan 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.
-
Masuk ke App Store Connect.
-
Pilih Pengguna dan Akses.

3 — Pilih tab Integrasi.

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

- Masukkan nama untuk kunci. Nama hanya untuk referensi Anda dan tidak menjadi bagian dari kunci itu sendiri.

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. Kami merekomendasikan untuk memilih pengelola aplikasi.
- Klik Generate.
Kunci API tidak dapat dibatasi aksesnya hanya untuk aplikasi tertentu.
Nama kunci baru, ID kunci, tautan download, dan informasi lainnya muncul di halaman.

Kamu bisa mendapatkan semua tiga informasi yang diperlukan di sini.
<1> ID Masalah. (APPLE_ISSUER_ID rahasia)
<2> ID Kunci. (APPLE_KEY_ID rasis)
<3> Klik "Unduh Kunci API" untuk mengunduh kunci pribadi API Anda. Tautan download hanya muncul jika kunci pribadi belum diunduh. Apple tidak menyimpan salinan kunci pribadi. Jadi, kamu hanya bisa mengunduhnya sekali.
🔴 Simpan kunci pribadi di tempat yang aman. Kamu tidak boleh berbagi kunci, menyimpan kunci di repositori code, atau menyertakan kunci di sisi klien code.
Menggunakan Kunci API App Store Connect
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_keyAnda dapat belajar cara lainnya di Dokumentasi FastlaneSaya 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 konversi 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, bagus!
2. Sertifikat
Buka XCode dan pergi ke Pengaturan > Akun > ID Apple > Tim dan pilih tim Anda.

Klik pada Kelola sertifikat.
Jika Anda belum menciptakan sertifikat, Anda dapat membuat sertifikat baru.
Klik pada + dan pilih Distribusi Apple

Lalu Anda perlu pergi ke keychain untuk mendownload sertifikat sebagai .p12 file.
Untuk melakukannya, Anda perlu pergi ke keychain dan switch ke login keychain kemudian tab tersebut Sertifikat Saya.

Setelah itu Anda dapat memilih sertifikat yang ingin Anda download. (Cari berdasarkan tanggal sertifikat)
Lalu klik kanan pada kunci pribadi pada sertifikat dan pilih Export.
Pilih format file Pertukaran Informasi Pribadi (.p12).
Itu akan mengunduh sertifikat sebagai .p12 file.
Silakan membuka file di terminal dan gunakan perintah berikut untuk mengonversinya ke Base64:
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
Ini akan menjadi rahasmu. BUILD_CERTIFICATE_BASE64 Silakan juga memberikan kata sandi sertifikat. Kata sandi ini akan menjadi rahasmu. P12_PASSWORD 3. Profil pengaturan
Buka
Apple Developer dan pilih tim yang tepat. Lalu buat profil baru dengan mengklik
Buat Profil Baru +

App Store Connect Pilih App Store Connect.

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

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

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

file. .mobileprovision 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 mengotomatisasi 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:
- Nama Folder:
<project-root>/fastlane/ - Nama File:
<project-root>/fastlane/Fastfile
Level ini sama dengan package.json, capacitor.config.*, dan folder. ios/ Tidak buat folder ini 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 repository yang Anda konfigurasi di langkah berikutnya. Anda hanya memerlukan file lokal jika Anda ingin menjalankan atau menguji Fastlane dari mesin sendiri. .env File:
Untuk pengujian lokal, buat <project-root>/fastlane/.env berikutnya dari 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 APP_STORE_CONNECT_TEAM_ID
Pergi ke Pusat Pengembang dan gulir ke bawah ke Membership details bagian.
Team ID adalah nilai yang Anda perlu atur dalam APP_STORE_CONNECT_TEAM_ID rahasia.
Mendapatkan BUNDLE_IDENTIFIER
- Buka Xcode
- Klik dua kali pada
Appdi navigator proyek - Lalu klik tab
Signing and Capabilities - Salin nilai dari
Bundle identifierNilai ini yang perlu Anda masukkan keBUNDLE_IDENTIFIERrahasia.
6. Pengolahan Pembangunan
Dalam GitHub Aksi, Biaya Anda berdasarkan menit yang digunakan untuk menjalankan alur kerja CI/CD Anda. Dari pengalaman saya, membutuhkan sekitar 10–15 menit sebelum sebuah 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
ke skip_waiting_for_build_processing . Ini akan menghemat menit build dengan tidak menunggu App Store Connect untuk selesai memproses build. trueNamun, ada trade-off - Anda harus memperbarui informasi kesesuaian aplikasi Anda di App Store Connect secara manual sebelum Anda dapat mendistribusikan build kepada pengguna.
Optimasi ini lebih berguna untuk proyek pribadi di mana menit build berbiaya. Untuk proyek publik/gratis, menit build gratis sehingga tidak perlu mengaktifkan pengaturan ini. Lihat halaman harga __CAPGO_KEEP_0__ untuk informasi lebih lanjut.
This optimization is mainly useful for private projects where build minutes cost money. For public/free projects, the build minutes are free so there’s no need to enable this setting. See GitHub’s Optimasi menit build gratis
7. Konfigurasi GitHub Aksi
Konfigurasi GitHub rahasia
Silakan salin rahasia dari .env file dan tempelkan ke rahasia GitHub di repository.
Lihat Pengaturan > Rahasia dan variabel > Aksi > Rahasia repository baru
2. BUILD_CERTIFICATE_BASE64 - Sertifikat yang di-Base64.
3. BUILD_PROVISION_PROFILE_BASE64 - Profil pengembangan yang di-Base64.
4. BUNDLE_IDENTIFIER - identifikasi bundle aplikasi Anda.
5. APPLE_KEY_ID — Kunci App Store Connect API 🔺ID Kunci.
6. APPLE_ISSUER_ID — Kunci App Store Connect API 🔺ID Penerbit.
7. APPLE_KEY_CONTENT — Kunci App Store Connect API 🔺 Konten Kunci. .p8, periksa
8. Konfigurasi file GitHub workflow.
Buat direktori GitHub workflow.
cd .github/workflows
Dalam folder, buat file bernama workflow dan tambahkan kode berikut. build-upload-ios.ymlWorkflow 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 tag, jika Anda memerlukan untuk otomatisasi tag, silakan lihat Pembangunan otomatis dan rilis dengan GitHub aksi 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, aplikasi Anda dapat memiliki modul Cordova lama, tetapi Capacitor plugin JavaScript 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.

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

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.
Artikel Terkait
Petunjuk Pengaturan CI/CD
- Membangun Otomatis Capacitor Android dengan GitHub Actions - Konfigurasi CI/CD Android lengkap
- Membangun dan Mengeluarkan Otomatis dengan GitHub Actions - Tutorial pipa CI/CD lengkap
- Kelola Membangun Dev dan Prod dengan GitHub Actions - Pengelolaan lingkungan
- Membangun Otomatis Capacitor iOS dengan Match - Alternatif menggunakan Fastlane Match
Alternatif Platform CI/CD
- Membangun dengan GitLab CI - Alternatif GitLab
- Membangun dengan CodeMagic - Panduan setup CodeMagic
Pembaruan Langsung & Pengembangan
- Capgo Dokumentasi Pembaruan Langsung - Tambahkan pembaruan OTA ke aplikasi Anda
- Integrasi CI/CD dengan Capgo - Integrasi pembaruan langsung ke dalam pipeline Anda
Terima kasih
Blog ini didasarkan pada artikel berikut: