CI/CD를 위한 Capacitor 앱 설정은 복잡하고 시간이 많이 걸립니다. 여기서 필요한 정보를 알려드리겠습니다.
새로운 빌드에 권장: Capgo 빌드 사용
현재는 __CAPGO_KEEP_0__ 빌드와 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__를 사용하는 것을 추천합니다. Capgo CLI를 사용하여 Capgo 네이티브 빌드를 생성합니다. 이 Fastlane 가이드는 기존 Capacitor 액션 PIPELINE을 유지 관리하는 팀을 위해 유지됩니다. 그러나 새로운 iOS 빌드는 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__를 사용하여 Fastlane, Xcode 런너, 인증서, 업로드 스크립트를 유지 관리하지 않도록 하세요. This Fastlane guide is kept for teams maintaining existing GitHub Actions pipelines, but new iOS builds should use the Capgo CLI so you do not have to maintain Fastlane, Xcode runners, certificates, and upload scripts yourself.
Capgo Build for CI/CD by Capgo
__CAPGO_KEEP_0__ 빌드 Capgo 빌드는 CI/CD PIPELINE에서 기존 네이티브 iOS 빌드를 생성합니다. __CAPGO_KEEP_0__ 빌드는 PIPELINE과 함께 작동합니다.
- : __CAPGO_KEEP_0__ 빌드를 __CAPGO_KEEP_1__ 액션, GitLab CI, Jenkins, 또는 로컬 스크립트에서 웹 빌드 후 트리거하세요.: Trigger Capgo Build from GitHub Actions, GitLab CI, Jenkins, or local scripts after your web build and
npx cap sync. - CI에서 서명하기CI 비밀을 사용하여 App Store Connect 키, 인증서, 배포 프로파일, 비밀번호 및 팀 ID를 보관하세요.
- 자연스러운 실행기 관리가 필요하지 않습니다Capgo 빌드는 유지 관리되는 Apple 빌드 환경을 제공하므로 macOS 실행기, Xcode 이미지를 관리하거나 Fastlane 경로를 관리할 필요가 없습니다.
- 아티팩트 및 제출QA에서 서명된 아티팩트를 다운로드하거나 Capgo CLI를 통해 릴리스 빌드를 제출하세요.
가격
- Capgo 플랜은 1달에 12달러부터 시작됩니다.
- OTA 업데이트와 매월 약 15개의 네이티브 빌드가 포함됩니다.
- 추가 빌드 분량은 분당 크레딧으로 청구됩니다.
수동 설정 안내서
이것을 하세요:
iOS에서 Fastlane과 GitHub 액션 및 인증서를 사용하는 지속적인 배포
필수 조건
이 튜토리얼을 계속하기 전에:
- Fastlane이 설치되어 개발 머신에
- iOS 개발자 프로그램 회원이되어야합니다.
가격에 대한 중요한 정보

https://github.com/features/actions
서비스는 '무료 __CAPGO_KEEP_0__에 따라 선택한 기계에 따라 제한까지.
App Store Connect __CAPGO_KEEP_0__를 사용할 것입니다. macOS 스크린샷에서 가격과 제한을 볼 수 있습니다 (가격은 튜토리얼이 생성된 시점의 가격으로, 미래에 변경될 수 있습니다).
요구 사항과 가격에 대한 경고를 받은 후, 계속하세요.
주의: 이 포스트에서 App Store Connect에 앱을 생성한 것으로 가정합니다. Fastlane이 중요한 정보를 복사합니다.
이 튜토리얼에서 배울 내용
포스트에서 따르는 단계
- App Store Connect API를 Fastlane과 함께 사용하는 방법
- 요구 사항:
- App Store Connect API 키를 생성하는 방법
- 앱 스토어 연결 API 키를 사용하여
- 요구 사항:
- Copy Fastlane 파일
- GitHub 작업을 구성하십시오
1. 앱 스토어 연결 API을 Fastlane과 함께 사용하십시오
2021년 2월부터 모든 사용자가 앱 스토어 연결에 로그인하기 위해 2단계 인증 또는 2단계 인증이 필요합니다. Apple ID에 대한 추가 보안 계층은 계정에 접근할 수 있는 사람을 단 하나로 보장합니다.
From Apple Support
Requirements
Fastlane이 앱 스토어 연결 API을 사용하여 앱을 업로드할 수 있도록 하려면 다음 세 가지를 제공해야 합니다. 세 가지: 발급자 ID
- Issuer ID
- __CAPGO_KEEP_0__ ID
- __CAPGO_KEEP_0__ 파일 또는 __CAPGO_KEEP_0__ 내용
App Store Connect API 키를 얻는 방법
App Store Connect에서 Admin 권한이 있어야 키를 생성할 수 있습니다. Admin 권한이 없다면 해당 문서를 읽어주어야 합니다.
-
로그인 App Store Connect.
-
선택 사용자 및 액세스.

3 — 통합 탭을 선택합니다.

- API 키 생성하기 또는 (+) 버튼을 클릭하세요.

- __CAPGO_KEEP_0__ 키를 생성하는 데 사용하는 앱 스토어 연결 키입니다.

6 — 앱 스토어 연결 키의 접근 권한을 설정합니다. 앱 스토어 연결 키의 권한은 팀 내 사용자에게 적용되는 권한과 동일합니다. 자세한 내용은 역할 권한을 참조하세요. 권한을 설정할 때는 앱 매니저.
- 를 선택하는 것을 권장합니다.
API 키의 앱에 대한 접근 권한을 제한할 수 없습니다.
새로운 키의 이름, 키 ID, 다운로드 링크, 기타 정보가 페이지에 나타납니다.

여기서 필요한 세 가지 정보를 모두 가져올 수 있습니다.
<1> 문제 ID. (APPLE_ISSUER_ID <2> 키 ID. (
<3> "다운로드 __CAPGO_KEEP_0__ 키"를 클릭하여 __CAPGO_KEEP_1__ 개인 키를 다운로드하세요. 다운로드 링크는 개인 키가 다운로드되지 않은 경우에만 나타납니다. 애플은 개인 키의 복사본을 유지하지 않습니다. 따라서 개인 키를 한번만 다운로드할 수 있습니다.APPLE_KEY_ID 개인 키를 안전한 장소에 저장하세요. 키를 공유하지 마세요. 키를 __CAPGO_KEEP_0__ 저장소에 저장하지 마세요. 또는 __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을 참조하세요. CI에서 가장 많이 사용하는 방법으로 생각하기 때문에 이 방법을 보여주고 있습니다. 환경 변수를 설정할 수 있기 때문입니다. 다운로드한 p8 파일을 Base64로 변환하여 비밀로 저장하세요.Please convert the p8 file that you download to Base64 and store it as a secret (
Please convert the p8 file that you download to Base64 and store it as a secret (APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
API 키를 사용하여 Fastlane을 통해 앱 스토어 연결 관리를 이제 가능합니다. 정말 좋습니다!
2. 인증서
XCode를 열고 설정 > 계정 > Apple ID > 팀 팀을 선택하세요.

클릭하세요 인증서 관리.
인증서가 아직 없다면 인증서를 새로 만들 수 있습니다.
클릭하세요 + 및 선택하세요 애플 배포

그 다음 키체인에 가서 인증서를 파일로 다운로드해야 합니다. .p12 이 작업을 하려면 키체인에 가서 로그인 키체인으로 switch하고 탭을 선택해야 합니다.
로그인 키체인 키체인 My Certificates.

그리고 날짜별로 인증서를 찾으세요.
인증서의 개인 키를 오른쪽 클릭하고 Export.
파일 형식을 선택하세요. Personal Information Exchange (.p12).
인증서가 파일 형식으로 다운로드됩니다. .p12 터미널에서 파일을 열고 다음 명령어를 사용하여 Base64로 변환하세요.
이것이
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
비밀입니다. 또한 인증서의 비밀번호를 제공하실 때, 이 비밀번호를 사용하세요. BUILD_CERTIFICATE_BASE64 인증서의 비밀번호를 제공하실 때, 이 비밀번호를 사용하세요. P12_PASSWORD __CAPGO_KEEP_0__.
3. 프로비전 프로파일
열기 애플 개발자 그리고 올바른 팀을 선택하세요.
그런 다음 새로운 프로파일을 만들려면 +

그리고 선택하세요 앱 스토어 연결.

그런 다음 올바른 앱을 선택해야 합니다. 주의할 점은 와일드 카드 사용 시 서명이 실패할 수 있으므로 주의해야 합니다.

오늘 날짜와 일치하는 만료일을 가진 이전에 생성한 인증서를 선택하세요 (인증서 이름을 확인하세요)하고 클릭하세요. Continue.

마지막으로 프로필 이름을 입력하고 클릭하세요. Generate.
프로필 이름은 Fastlane에서 프로필을 식별하는 값으로 사용됩니다.
APPLE_PROFILE_NAME.

프로필을 파일 형태로 다운로드할 수 있습니다. .mobileprovision Download the profile

4. Fastlane 파일을 복사하세요BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
__CAPGO_KEEP_0__
Fastlane은 Ruby 라이브러리로, 모바일 개발을 자동화하는 데 사용됩니다. Fastlane을 사용하면 Android Studio를 사용하여 수행하는 일반적인 작업을 수행하는 일련의 '액션'을 포함하는 '레인'을 구성할 수 있습니다. Fastlane을 사용할 수 있는 것은 많지만, 이 튜토리얼의 목적을 위해, 우리는 핵심 액션의 일부만 사용할 것입니다.
Create the Fastlane folder at the root of your Capacitor/Ionic project and add the Fastfile there:
- 폴더:
<project-root>/fastlane/ - 파일:
<project-root>/fastlane/Fastfile
이것은 package.json, capacitor.config.*와 같은 레벨입니다. ios/ , 그리고 폴더입니다. 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
Fastlane 폴더를
GitHub Actions uses the repository secrets you configure in the next step. You only need a local .env 5. 비밀 설정
Capgo Actions은 다음 단계에서 구성한 저장소 비밀을 사용합니다. 로컬 파일이 필요하지 않습니다. 로컬 테스트를 위해 Fastlane을 실행하거나 테스트하려면 로컬 머신에서만 사용합니다. <project-root>/fastlane/.env 로컬 테스트를 위해 다음을 만들세요: Fastfile. 이 파일을 커밋하지 마세요. 추가하세요 fastlane/.env ignore 목록에 .gitignore 첫 번째 (또는 이미 무시되어 있는지 확인하세요). 예를 들어:
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=
APP_STORE_CONNECT_TEAM_ID를 가져오기
Developer Center로 이동하여 부분으로 스크롤 다운하세요.
이 값은 Membership details secret.app-store-connect-team-id Team ID 에서 설정해야 하는 것입니다. APP_STORE_CONNECT_TEAM_ID APP_STORE_CONNECT_TEAM_ID를 가져오기
부분으로 스크롤 다운하세요.
- Xcode를 열어주세요
- Double click on the
App프로젝트 탐색기에서 - Then click on the tab
Signing and Capabilities - Copy the value of the
Bundle identifier. 이 값을 App Store Connect에서 설정해야 합니다.BUNDLE_IDENTIFIERsecret.
6. 처리 중입니다.
In GitHub Actions, CI/CD 워크플로우를 실행하는 데 사용한 분의 수에 따라 요금이 청구됩니다. 내 경험에 따르면 App Store Connect에서 빌드를 처리하는 데 10–15분 정도 걸립니다. you are billed based on the minutes
For private projects, the estimated cost per build can go up to $0.08/min x 15 mins = $1.2, or more, depending on the configuration and dependencies of your project.
If you’re concerned about costs for private projects, you can set skip_waiting_for_build_processing to true. This will save build minutes by not waiting for App Store Connect to finish processing the build.
However, there is a tradeoff - you’ll need to manually update your app’s compliance information in App Store Connect before you can distribute the build to users.
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 pricing page for more details.
7. Setup GitHub Actions
GitHub Actions 설정
파일에서 비밀을 복사하고 __CAPGO_KEEP_0__ 저장소 비밀에 붙여넣으세요. .env 파일에서 비밀을 복사하고 GitHub 저장소 비밀에 붙여넣으세요.
설정으로 이동하세요. 설정 > 비밀 및 변수 > 액션 > 새 저장소 비밀
2. BUILD_CERTIFICATE_BASE64 - Base64로 인코딩된 인증서.
3. BUILD_PROVISION_PROFILE_BASE64 - Base64 인코딩된 배포 프로파일.
4. BUNDLE_IDENTIFIER - 앱의 번들 식별자.
5. APPLE_KEY_ID — 앱 스토어 연결 API 키 🔺키 ID.
6. APPLE_ISSUER_ID — 앱 스토어 연결 API 키 🔺발급자 ID.
7. APPLE_KEY_CONTENT — 앱 스토어 연결 API 키 🔺키 내용. .p8, 체크하세요.
8. GitHub 워크플로 파일을 구성하세요.
GitHub 워크플로 디렉토리를 생성하세요.
cd .github/workflows
폴더 안에 workflow 파일 이름으로 build-upload-ios.yml생성하고 다음을 추가하세요.
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 태그자동화된 태그를 위해, 자동 빌드 및 릴리즈와 GitHub 액션 먼저.
그 다음으로, 이 워크플로우는 NodeJS 의존성을 가져와, 설치하고, JavaScript 앱을 빌드합니다.
각각의 새로운 커밋을 전송할 때마다, 테스트 플라이트에서 릴리즈가 빌드됩니다.
앱은 Ionic 을 사용하지 않아도 됩니다. 단, Capacitor 베이스만 필수입니다. 오래된 Cordova 모듈을 사용할 수 있지만, Capacitor JS 플러그인은 선호됩니다.
8. 워크플로우를 트리거하세요
커밋을 생성하세요
커밋을 만드세요 수정repository에서 활성 워크플로우를 볼 수 있습니다.
워크플로우 트리거
branch에 새로운 커밋을 푸시하세요. main 워크플로우를 트리거하기 위해 development 커밋으로 시작

테스트 플라이트 대시보드

네, 가능합니다. 그리고 그것은 매우 간단합니다.
Xcode를 사용하여 앱을 빌드하고 서명할 수 있습니다. 항상 그랬듯이.
관련 문서
__CAPGO_KEEP_0__
CI/CD 설정 매뉴얼
- 자동 Capacitor Android 빌드와 GitHub 액션 - Android CI/CD 설정 완료
- 자동 빌드 및 릴리즈와 GitHub 액션 - CI/CD pipeline 완전한 튜토리얼
- GitHub 액션으로 개발 및 프로덕션 빌드 관리 - 환경 관리
- 자동 Capacitor iOS 빌드와 Match - Fastlane Match를 사용하는 대안
CI/CD 플랫폼 대안
- GitLab CI로 빌드 - GitLab 대안
- CodeMagic으로 빌드하기 - CodeMagic 설정 가이드
실시간 업데이트 및 배포
- Capgo 실시간 업데이트 문서 - 앱에 OTA 업데이트 추가하기
- CI/CD 통합하기 Capgo - pipeline에 실시간 업데이트 통합하기
감사합니다
다음 기사에 기반한 이 블로그입니다:
자동 Capacitor IOS 빌드에서 GitHub 동작과 인증서와 함께 계속 진행하세요.
자동 __CAPGO_KEEP_0__ IOS 빌드와 __CAPGO_KEEP_1__ 동작과 인증서를 사용하는 경우 Automatic Capacitor IOS build with GitHub actions with certificate __CAPGO_KEEP_0__ CI/CD를 사용하여 제품 워크플로우를 관리하세요. Capgo 네이티브 빌드를 사용하여 제품 워크플로우를 관리하세요. Capgo 통합을 사용하여 제품 워크플로우를 관리하세요. Capgo Native Builds CI/CD 자동화 계획을 위해 사용하는 경우 Capgo CI/CD와 연결하세요. Capgo CI/CD를 사용하여 제품 워크플로우를 관리하세요. Capgo 네이티브 빌드를 사용하여 제품 워크플로우를 관리하세요. __CAPGO_KEEP_0__ 통합을 사용하여 제품 워크플로우를 관리하세요. CI/CD 통합 구현 세부 사항에 대해, 그리고 GitHub 액션 통합 CI/CD 통합 구현 세부 사항에 대해 GitHub 액션 통합.