Capacitor 앱의 CI/CD 설정은 복잡하고 시간이 많이 걸립니다. 알아야 할 내용은 다음과 같습니다.
새로운 빌드에 권장: Capgo 빌드 사용
우리는 __CAPGO_KEEP_0__ 빌드와 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__를 사용하는 것을 추천합니다. Capgo 빌드와 Capgo CLI를 사용하면 native Capgo 빌드를 만들 수 있습니다. 이 Fastlane 가이드는 기존 Capacitor 액션 PIPELINE을 유지 관리하는 팀에게 유지됩니다. 그러나 새로운 iOS 빌드는 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__를 사용하여 Fastlane, Xcode runner, certificate, provisioning profile, 및 업로드 스크립트를 유지 관리하지 않도록 하세요. 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에서 기존의 signed native iOS 빌드를 실행합니다. __CAPGO_KEEP_0__ 빌드
- 이 기능은 pipeline과 함께 작동합니다.: Capgo을 GitHub Actions, GitLab CI, Jenkins, 또는 로컬 스크립트에서 웹 빌드 후에 트리거합니다.
npx cap sync. - : CI 비밀에서 App Store Connect 키, 인증서, 배포 프로파일, 비밀번호 및 팀 ID를 유지합니다.: __CAPGO_KEEP_0__ 빌드는 macOS 러너, Xcode 이미지를 관리할 필요가 없으므로 유지 관리가 필요 없는 Apple 빌드 환경을 제공합니다.
- : QA에 서명된 아티팩트를 다운로드하거나 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__를 통해 릴리스 빌드를 제출할 수 있습니다.: Capgo Build provides maintained Apple build environments, so you do not have to manage macOS runners, Xcode images, or Fastlane lanes.
- : Capgo Builder / 네이티브 클라우드 빌드 제품 페이지. 역할: 섹션 서브 타이틀 또는 태그 라인. 페이지/영역: native-build.astro. 메시지 키 `native_build_builder_pricing_eyebrow` (네이티브 빌드 빌더 가격 정보 라인). | Capgo 마케팅 웹사이트. 역할: 가격 정보 라인 또는 링크 레이블. 페이지/영역: BlogMidArticleCta.astro. 메시지 키 `blog_mid_article_china_cta_pricing_button` (블로그 중간 게시물 중국 가격 정보 버튼). | Capgo 마케팅 웹사이트. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. 페이지/영역: site footer, site header, page pricing.astro. 메시지 키 `pricing` (가격).: Download signed artifacts for QA or submit release builds through the Capgo CLI.
: OTA 업데이트와 월 약 15개의 네이티브 빌드를 포함합니다.
- Capgo plans start at $12/month
- 페이지/영역: Capgo Builder / 네이티브 클라우드 빌드 제품 페이지. 역할: 웹사이트 복사 문장. 페이지/영역: page native-build.astro. 메시지 키 `native_build_builder_build_minutes` (네이티브 빌드 빌더 빌드 분량).
- context
수동 설정 안내서
다음과 같은 작업을 수행해야 합니다:
GitHub 액션과 Fastlane을 사용한 iOS의 지속적인 배포
사전 조건
이 튜토리얼을 계속하기 전에:
- __CAPGO_KEEP_0__이 설치되어 있는지 확인하세요. __CAPGO_KEEP_0__이 설치되어 있는지 확인하세요. __CAPGO_KEEP_0__ 액션의 가격에 대한 중요한 정보
- __CAPGO_KEEP_0__ 액션의 가격
__CAPGO_KEEP_0__ 액션의 가격

https://github.com/features/actions
이 서비스는 무료입니다. 한계에 따라 제한된 기계에 따라 달라집니다.
이 튜토리얼에서 macOS 기계를 사용하겠습니다. 스크린샷에서 가격과 제한을 확인하실 수 있습니다. (튜토리얼 작성 시점의 가격이며 미래에 변경될 수 있습니다.) 요구 사항과 가격에 대한 경고를 받은 후 계속하겠습니다. 주의: 이 포스트에서 앱이 App Store Connect에 생성되어 있다고 가정합니다. Fastlane이 중요한 정보를 복사합니다.
이 튜토리얼에서 배울 내용
이 포스트에서 따르는 단계
App Store Connect __CAPGO_KEEP_0__를 Fastlane과 함께 사용하는 방법
__CAPGO_KEEP_0__는 Capacitor의 공식 GitHub Actions입니다.
- Using App Store Connect API with Fastlane
- 요구 사항:
- 애플 스토어 연결 API 키 생성
- 애플 스토어 연결 API 키 사용
- 요구 사항:
- Fastlane 파일 복사
- GitHub 액션 구성
1. 애플 스토어 연결 API을 Fastlane과 함께 사용하는 방법
2021년 2월부터 모든 사용자가 애플 스토어 연결에 로그인하기 위해 2단계 인증 또는 2단계 인증이 필요합니다. 이 추가 보안 기능은 Apple ID에 대한 액세스를 보장하여 계정에 대한 액세스를 제한합니다.
From 애플 지원
요구 사항:
Fastlane이 애플 스토어 연결 API을 사용하여 앱을 업로드할 수 있도록 하려면 다음 세 가지가 필요합니다. 세 것들:
- 발급자 ID
- 키 ID
- 키 파일 또는 키 내용
앱 스토어 연결 API 키를 얻는 방법
키를 생성하려면 App Store Connect에서 Admin 권한이 있어야 합니다. 권한이 없다면 관련 사람에게 이 글을 알려주십시오.

3 — 통합 탭을 선택하십시오.

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

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

6 — 액세스에서 키에 대한 역할을 선택하세요. 팀 내 사용자에 대한 역할과 동일한 역할이 적용됩니다. 자세한 내용은 역할 권한을 참조하세요. App manager.
- Generate을 클릭하세요.
API 키의 액세스는 특정 앱으로 제한할 수 없습니다.
__CAPGO_KEEP_0__ 키의 이름, 키 ID, 다운로드 링크 및 기타 정보가 페이지에 나타납니다.

필요한 세 가지 정보를 모두 여기서 가져올 수 있습니다.
<1> 이슈 ID. (APPLE_ISSUER_ID 비밀)
<2> 키 ID. (APPLE_KEY_ID 비밀)
<3> "다운로드 API 키"를 클릭하여 API 개인 키를 다운로드하세요. 다운로드 링크는 개인 키가 다운로드되지 않은 경우에만 나타납니다. 애플은 개인 키의 복사본을 유지하지 않습니다. 따라서 개인 키를 한 번만 다운로드할 수 있습니다.
🔴 개인 키를 안전한 곳에 저장하세요. 키를 공유하지 마세요, 키를 code 저장소에 저장하지 마세요, 또는 code에 키를 포함하지 마세요.
애플 스토어 연결 API 키 사용
API 키 파일 (다운로드한 p8 파일), 키 ID, 발급자 ID가 JWT 토큰 인증을 위해 필요합니다. 이 정보를 Fastlane에 전달하는 방법은 여러 가지가 있습니다. Fastlane의 새로운 액션을 사용하여 선택했습니다. 다른 방법을 알아보려면 app_store_connect_api_keyFastlane 문서 Fastlane 문서. 이 방법을 보여주기 때문에 CI에서 가장 많은 곳에서 환경 변수를 설정할 수 있기 때문에 가장 쉬운 방법이라고 생각합니다.
다운로드한 p8 파일을 Base64로 변환하고 __CAPGO_KEEP_0__ 키로 저장해 주세요.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!
XCode를 열고
설정 > 계정 > Apple ID > 팀 > 그리고 팀을 선택하세요.

클릭 인증서 관리.
인증서가 아직 없다면 인증서를 생성할 수 있습니다.
클릭 + 및 선택 애플 배포

그런 다음 키 체인에 가서 인증서를 다운로드할 수 있는 파일로 변환해야 합니다. .p12 이 작업을 수행하려면 키 체인에 가서
switch를 사용하여 로그인 키체인과 그 탭 내 인증서.

그런 다음 원하는 인증서를 다운로드할 수 있습니다. (인증서의 날짜를 확인하세요)
그런 다음 인증서의 개인 키를 오른쪽 클릭하고 내보내기.
파일 형식 선택 개인 정보 교환 (.p12).
그것은 인증서를 파일로 다운로드합니다. .p12 파일을 터미널에서 열어 다음 명령어를 사용하여 Base64로 변환하세요.
__CAPGO_KEEP_0__
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
이것이 될 것입니다. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__. P12_PASSWORD 또한, 인증서의 비밀번호를 요청할 때, 비밀번호를 제공해 주세요. 이 비밀번호가 될 것입니다.
3. 프로비전 프로파일
열기 애플 개발자 그리고 올바른 팀을 선택하세요.
그런 다음 새로운 프로파일을 만들기 위해 +

그리고 앱 스토어 연결.

그런 다음 올바른 앱을 선택해야 합니다. 주의하십시오. 와일드 카드를 사용하면 서명이 실패할 것입니다.

이전에 생성한 올바른 인증서를 선택하세요 (만료일을 확인하세요. 만료일은 오늘 날짜와 월이 동일해야 합니다) 그리고 Continue.

마지막으로 프로파일의 이름을 입력하고 Generate.
이름은 Fastlane에서 프로파일을 식별하는 값으로 사용됩니다.
APPLE_PROFILE_NAME.

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

프로필을 Base64로 변환하고 비밀로 저장하십시오 (BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Fastlane 파일 복사
Fastlane은 안드로이드 스튜디오에서 일반적인 모바일 개발 작업을 자동화하기 위해 만들어진 루비 라이브러리입니다. Fastlane을 사용하면 사용자 정의 '로우'를 구성할 수 있으며, 로우 내에 '액션'을 묶어 모바일 개발 작업을 수행할 수 있습니다. Fastlane은 많은 기능을 제공하지만, 이 튜토리얼에서 사용할 핵심 액션만 사용할 것입니다.
Capacitor/아이온 프로젝트의 루트 폴더에 Fastlane 폴더를 생성하고 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 액션은 다음 단계에서 구성한 저장소 비밀을 사용합니다. 로컬 파일이 필요하지 않습니다. 로컬에서 Fastlane을 실행하거나 테스트하려면 로컬 파일이 필요합니다. .env __CAPGO_KEEP_0__
지역 테스트를 위해 생성하세요. <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를 가져오기
Developer Center로 이동하세요. 스크롤 다운하세요. 섹션을 찾으세요. Membership details APP_STORE_CONNECT_TEAM_ID는 이 값이 필요합니다. Team ID secret에 설정하세요. APP_STORE_CONNECT_TEAM_ID secret
BUNDLE IDENTIFIER를 가져오기
- Xcode를 열기
- 프로젝트 탐색기에서 더블 클릭
App그런 다음 탭을 클릭 - 값을 복사합니다. 이 값은 secret에서 설정해야 하는 값입니다.
Signing and Capabilities - Xcode에서 BUNDLE IDENTIFIER
Bundle identifier6. 빌드 처리BUNDLE_IDENTIFIERIn __CAPGO_KEEP_0__ Actions,
In __CAPGO_KEEP_0__ Actions,
In GitHub Actions, 당신은 CI/CD 워크플로우를 실행하는 데 사용한 분량에 따라 요금이 청구됩니다. 내 경험에 따르면 앱 스토어 연결에서 빌드를 처리하는 데 10-15분 정도 걸립니다. 개인 프로젝트의 경우, 추정된 빌드당 비용은 $0.08/분 x 15분 = $1.2, 또는 더 비용이 들 수 있습니다. 이는 프로젝트의 구성 및 의존성에 따라 달라집니다.
비용이 걱정된다면, 개인 프로젝트의 경우 빌드 시간을 절약하기 위해 App Store Connect가 빌드를 처리하는 것을 기다리지 않고 바로 빌드를 배포할 수 있습니다. 그러나, 이 최적화는 빌드 시간을 절약하는 데만 도움이 됩니다. 빌드 시간은 무료이기 때문에 빌드 시간을 절약할 필요가 없습니다.더 많은 정보를 얻으려면 __CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요.
__CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요. skip_waiting_for_build_processing __CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요. true__CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요.
__CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요.
GitHub의 가격 정보 페이지를 참조하세요. __CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요. __CAPGO_KEEP_0__의 가격 정보 페이지를 참조하세요.
7. GitHub 설정
GitHub 비밀 설정
파일에서 __CAPGO_KEEP_0__ 비밀을 복사하고 __CAPGO_KEEP_0__ 저장소 비밀에 붙여넣으세요. .env GitHub로 이동하세요.
설정 > 비밀 및 변수 > 작업 > 새 저장소 비밀 __CAPGO_KEEP_0__
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 워크플로 파일을 구성하세요.
Create a GitHub workflow directory.
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 태그자동화된 태그를 필요로하신다면 Automatic build and release with GitHub actions actions
먼저 읽어보세요.
그 다음으로 NodeJS 의존성을 pull 하여 설치하고 JavaScript 앱을 빌드합니다.
Your App doesn’t need to use Ionic, only Capacitor base is mandatory., it can have old Cordova module, but Capacitor JS plugin should be preferred.
앱은 Ionic을 사용하지 않아도 되며,
기본은 필수입니다. 오래된 Cordova 모듈을 사용해도 되지만,
자동화된 커밋repository에서 활성화된 워크플로우를 볼 수 있습니다.
워크플로우를 트리거하세요
브랜치에 새로운 커밋을 푸시하거나 main 또는 development 워크플로우를 트리거하세요.

몇 분 후에 App Store Connect 대시보드에서 빌드를 확인할 수 있습니다.

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