Capacitor 앱의 CI/CD 설정은 복잡하고 시간이 많이 걸립니다. 다음을 알아야 합니다.
Capgo 빌드 (새로운 빌드에 권장): Capgo 빌드
현재 __CAPGO_KEEP_0__ 빌드를 권장합니다. Capgo 빌드 (Capgo CLI) native Capacitor 빌드용으로. 이 Fastlane 가이드는 기존 GitHub Actions pipeline 유지 관리하는 팀을 위해 유지되지만, 새로운 iOS 빌드는 Fastlane, Xcode 런너, 인증서, 업로드 스크립트 유지 관리를 하지 않도록 Capgo CLI 사용하십시오.
Capgo 빌드 (CI/CD에 의해 생성됨) - Capgo
Fastlane, Xcode 런너, 인증서, 배포 프로파일, 업로드 스크립트 유지 관리를 생략하십시오. Capgo 빌드 기존 CI/CD pipeline에서 signed native iOS 빌드를 실행합니다.
- CI/CD pipeline과 함께 작동합니다.: Trigger Capgo Build from GitHub Actions, GitLab CI, Jenkins, or local scripts after your web build and
npx cap sync. - : __CAPGO_KEEP_0__ 빌드를 __CAPGO_KEEP_1__ Actions, GitLab CI, Jenkins, 또는 로컬 스크립트에서 웹 빌드 후에 트리거하십시오.CI secret에서 서명합니다
- : App Store Connect 키, 인증서, 배포 프로파일, 비밀번호, 팀 ID를 CI secret에 저장하십시오.native 런너 유지 관리를 생략합니다. : Capgo 빌드는 Apple 빌드 환경을 유지 관리하므로 macOS 런너, Xcode 이미지, 또는 Fastlane 경로를 관리할 필요가 없습니다.
- __CAPGO_KEEP_0__: Download signed artifacts for QA or submit release builds through the Capgo CLI.
__CAPGO_KEEP_0__
- Capgo
- __CAPGO_KEEP_0__
- __CAPGO_KEEP_0__
__CAPGO_KEEP_0__
__CAPGO_KEEP_0__
GitHub
__CAPGO_KEEP_0__
__CAPGO_KEEP_0__
- __CAPGO_KEEP_0__을 설치한 개발 환경에 이미 설치되어야 합니다.
- iOS 개발자 프로그램 회원이되어야 합니다.
가격에 대한 중요한 정보

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

3 — 통합 탭을 선택하세요.

- Generate API Key 또는 (+) 버튼을 클릭하세요.

- 키 이름을 입력하세요. 키 이름은 키 자체의 일부가 아니며 참고용으로만 사용됩니다.

6 — 액세스 아래에서 키에 적용되는 역할을 선택하세요. 키에 적용되는 역할은 팀 내 사용자에 적용되는 역할과 동일합니다. 역할 권한선택하는 것을 추천합니다. 앱 관리자.
- Generate을 클릭하세요.
API 키의 접근 권한은 특정 앱으로 제한할 수 없습니다.
새 키의 이름, 키 ID, 다운로드 링크 및 기타 정보가 페이지에 나타납니다.

여기서 세 가지 필요한 정보를 모두 가져올 수 있습니다.
<1> 이슈 ID. (APPLE_ISSUER_ID 비밀)
<2> 키 ID. (APPLE_KEY_ID 비밀)
<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.
App Store Connect API 키 사용
API 키 파일(p8 파일), 키 ID, 발급자 ID가 JWT 토큰 인증을 위해 필요합니다. 이 정보를 Fastlane에 전달하는 방법은 여러 가지가 있습니다. Fastlane의 새로운 액션을 사용하여 선택했습니다. app_store_connect_api_key다른 방법을 알아보려면 Fastlane 문서Fastlane의 이 방법을 보여주고 있는 이유는 CI에서 가장 쉽게 작업할 수 있는 방법이라고 생각하기 때문입니다.
__CAPGO_KEEP_0__ 키를 Base64로 변환하고 비밀로 저장하세요.APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
App Store Connect를 Fastlane으로 관리할 수 있게되었습니다. API 키를 사용하여!
2. 인증서
XCode를 열고 설정 > 계정 > 애플 아이디 > 팀 팀을 선택하세요.

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

그런 다음 인증서를 다운로드하기 위해 키 체인에 가야합니다. 인증서를 파일로 다운로드할 수 있습니다. .p12 이 작업을 수행하려면 키 체인에 가서 로그인 키 체인으로 switch하고 'My Certificates' 탭으로 이동해야합니다.
My Certificates My Certificates 그런 다음 다운로드하고 싶은 인증서를 선택할 수 있습니다. (인증서의 날짜를 확인하세요) 그런 다음 인증서의 개인 키를 오른쪽 클릭하고 '및 선택'을 선택하세요..

__CAPGO_KEEP_0__
__CAPGO_KEEP_0__ Export.
파일 형식 선택 개인 정보 교환 (.p12).
파일로 인증서를 다운로드 할 것입니다. .p12 파일을 열어 주시고, 다음 명령어를 사용하여 Base64로 변환하세요:
이것이 당신의
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
비밀입니다. 또한, 인증서의 비밀번호를 제공할 때, 비밀번호가 당신의 BUILD_CERTIFICATE_BASE64 비밀입니다. P12_PASSWORD 3. 프로비전 프로파일
열기
애플 개발자 Open __CAPGO_KEEP_0__
__CAPGO_KEEP_0__ +

__CAPGO_KEEP_2__ __CAPGO_KEEP_3__.

__CAPGO_KEEP_5__

__CAPGO_KEEP_7__ __CAPGO_KEEP_8__.

__CAPGO_KEEP_10__ 생성.
프로파일을 Fastlane에서 식별하기 위해 사용될 이름입니다. __CAPGO_KEEP_0__ 값 아래에 있습니다.
APPLE_PROFILE_NAME.

프로필을 다운로드할 수 있습니다. .mobileprovision 파일.

프로필을 Base64로 변환하고 비밀로 저장하세요 ("__CAPGO_KEEP_0__")BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Fastlane 파일 복사
Fastlane은 Ruby 라이브러리로 모바일 개발 작업을 자동화하기 위해 만들어졌습니다. Fastlane을 사용하면 Android studio에서 수행하는 일반적인 작업을 수행하는 일련의 "작업"을 포함하는 "로드"를 구성할 수 있습니다. Fastlane을 사용할 수많은 기능이 있지만, 이 튜토리얼의 목적을 위해, 우리는 핵심 작업의 일부만 사용할 것입니다.
프로젝트의 루트에 Fastlane 폴더를 만들고, Capacitor/Ionic 프로젝트의 루트에 Fastfile을 추가하세요.
- 폴더:
<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
5. 비밀을 설정하는 방법
GitHub Actions는 다음 단계에서 구성한 저장소 비밀을 사용합니다. 로컬 .env 파일이 필요하지 않습니다. 만약 Fastlane을 로컬에서 실행하거나 테스트하려면.
로컬 테스트를 위해 <project-root>/fastlane/.env 다음에 Fastfile이 파일을 커밋하지 마세요. fastlane/.env 로컬에서 .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를 가져옵니다.
Go to Developer Center 밑으로 스크롤하여 Membership details 섹션을 확인하세요.
Team ID 는 APP_STORE_CONNECT_TEAM_ID 에서 설정해야 하는 값입니다.
app-store-connect-team-id
- BUNDLE_IDENTIFIER를 가져오기
- Open Xcode
AppDouble click on the - 프로젝트 탐색기에서
Signing and Capabilities - Copy the value of the
Bundle identifier이 값을BUNDLE_IDENTIFIERsecret.
6. Build Processing
In GitHub Actions, CI/CD 워크플로우를 실행하는 데 사용한 분의 수에 따라 요금이 청구됩니다. 내 경험에 따르면, 앱 스토어 연결에서 빌드를 처리하는 데 10-15분이 걸립니다. 비공개 프로젝트의 빌드당 예상 비용은
$0.08/min x 15 mins = $1.2 또는 그 이상, 프로젝트의 구성 및 의존성에 따라 다릅니다.비공개 프로젝트의 비용에 대한 걱정은 없으시다면,
__CAPGO_KEEP_0__ skip_waiting_for_build_processing 이것을 true. 이 설정을 활성화하면 App Store Connect에서 빌드 처리를 기다릴 필요가 없으므로 빌드 시간이 줄어듭니다.
그러나, 이 설정을 활성화하면 앱의 준수 정보를 App Store Connect에서 수동으로 업데이트해야 합니다. 사용자에게 빌드를 배포하기 전에.
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 더 많은 정보는 __CAPGO_KEEP_0__의 가격 정보 페이지
7. Setup GitHub Actions
7. GitHub 액션 설정
__CAPGO_KEEP_0__ 비밀 설정 .env GitHub 비밀을 복사하고
__CAPGO_KEEP_0__ 저장소 비밀에 붙여넣으세요. 다음으로 이동하세요: "Settings" > 비밀 및 변수 > 작업 > 새로운 저장소 비밀
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
이 워크플로우는 각 GitHub 태그 이후에 트리거되어야 합니다.태그를 자동화하려면, Automatic build and release with GitHub actions first.
이 작업 흐름을 실행하면 NodeJS 의 의존성들을 다운받아 설치하고 자바스크립트 앱을 빌드합니다.
매번 새로운 커밋을 보내면 테스트 플라이트에서 릴리즈가 자동으로 생성됩니다.
앱은 Ionic을 사용하지 않아도 됩니다. Capacitor의 기본 구조만 충족하면 됩니다. 오래된 Cordova 모듈을 사용해도 되지만 Capacitor의 자바스크립트 플러그인을 사용하는 것을 권장합니다.
8. 작업 흐름을 트리거하세요
커밋을 생성하세요
커밋을 만들어 보세요커밋을 생성하세요
커밋을 푸시하여 브랜치에 새로운 커밋을 보내거나
또는 작업 흐름을 트리거하세요 main 작업 흐름을 트리거하세요 development __CAPGO_KEEP_0__를 트리거합니다.

몇 분 후에 App Store Connect 대시보드에 빌드가 사용 가능합니다.

9. 로컬 머신에서 배포할 수 있나요?
가능합니다.
Xcode를 사용하여 앱을 빌드하고 서명할 수 있습니다.
관련 문서
CI/CD 설정 가이드
- Capacitor 액션을 사용한 자동 GitHub Android 빌드 - 완전한 Android CI/CD 설정
- GitHub 액션을 사용한 자동 빌드 및 릴리즈 - 전체 CI/CD pipeline 튜토리얼
- GitHub 개발 및 프로덕션 빌드 관리 - 환경 관리
- Capacitor iOS 빌드 자동화 - Fastlane Match를 사용하는 대안
Fastlane Match 대안 CI/CD 플랫폼
- GitLab CI로 빌드 - GitLab 대안
- CodeMagic으로 빌드 - CodeMagic 설정 가이드
실시간 업데이트 및 배포
- Capgo 실시간 업데이트 문서 - 앱에 OTA 업데이트를 추가하세요
- CI/CD 통합과 Capgo - pipeline에 실시간 업데이트를 통합하세요
감사합니다
다음 기사에 기반한 이 블로그입니다:
자동 IOS 빌드 Capacitor에서 GitHub 액션과 인증서를 사용하여 계속하세요
__CAPGO_KEEP_0__를 사용하는 경우 자동 IOS 빌드 Capacitor에서 GitHub 액션과 인증서를 사용하여 계속하세요 CI/CD 자동화 계획을 세우기 위해 연결하세요. Capgo CI/CD Capgo CI/CD에서 제품 워크플로우를 위해 Capgo 네이티브 빌드 Capgo 네이티브 빌드에서 제품 워크플로우를 위해 Capgo 통합 Capgo 통합에서 제품 워크플로우를 위해 CI/CD 통합 CI/CD 통합 구현 세부 사항에 대해 GitHub 액션 통합 GitHub 액션 통합 구현 세부 사항에 대해