Capacitor 앱의 CI/CD 설정은 복잡하고 시간이 많이 걸립니다. 알아야 할 내용은 다음과 같습니다.
새로운 빌드에 권장: Capgo 빌드를 사용하세요.
__CAPGO_KEEP_0__ 빌드와 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__을 사용하는 것을 추천합니다. Capgo CLI을 사용하여 Capgo 앱의 네이티브 빌드를 만듭니다. 이 Fastlane 가이드는 기존 Capacitor Actions 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_KEEP_0__ 계정에 관리자 권한이 있는 계정을 만듭니다.
- A GitHub account with admin access
- iOS 개발자 프로그램 회원 가입
- App Store Connect API에 대한 접근 권한이 있는 경우
- GitHub Actions 워크플로우 이해
- Fastlane 설정에 대한 지식
- pipeline 유지 및 디버깅에 소요되는 시간
- 적절한 인증서 및 배포 프로파일
Capgo로 제공되는 전문적인 CI/CD 설정
복잡성을 피하십시오. Capgo __CAPGO_KEEP_0__는 여러분의 선호하는 플랫폼에서 CI/CD pipeline을 직접 구성합니다.:
- 플랫폼 독립성: GitHub Actions, GitLab CI, 또는 기타와 함께 작동합니다.
- 무난한 통합: 현재 프로세스와 함께 플랫폼 switch가 필요하지 않습니다.
- 맞춤형 설정: 프로젝트 요구 사항에 맞춘 커스텀 설정
- 전문가 지침: 50+ 앱에 CI/CD를 이미 설정했습니다.
가격
- 한 번의 설정 비용: $2,600
- 운영 비용: ~$300/년
- 다른 사설 솔루션과 비교: $6,000/년
- 5년 동안 $26,100을 절약하세요
설치 가이드
자신의 모든 것을 설정하고 싶다면, 다음을 수행해야 합니다:
GitHub을 사용하여 iOS에 대한 지속적인 배포를 Fastlane과 액션 및 인증서로 수행하는 방법
필수 조건
튜토리얼을 계속 진행하기 전에:
- 개발 환경에 Fastlane이 설치되어 있는지 확인하세요. iOS 개발자 프로그램 회원이되어 있는지 확인하세요. 가격에 대한 중요한 정보
- __CAPGO_KEEP_0__ 액션의 가격
https://__CAPGO_KEEP_0__.com/features/actions

https://github.com/features/actions
서비스는 ‘free’ 한계에 따라 선택한 기계에 따라 다릅니다.
우리는 macOS 기계를 사용할 것입니다. 스크린샷에는 가격과 제한을 볼 수 있습니다 (튜토리얼 생성 시 가격, 미래에 변경될 수 있음). 요구 사항과 가격에 대한 경고를 받은 후 계속하세요.
참고: 이 포스트에서 앱을 App Store Connect에 생성한 것으로 가정합니다. 중요한 정보는 Fastlane!에 복사됩니다.
이 튜토리얼에서 배울 내용
포스트에서 따르는 단계
Fastlane과 App Store Connect __CAPGO_KEEP_0__ 사용
- Using App Store Connect API with Fastlane
- 기록:
- 애플 스토어 연결 API 키 생성
- 애플 스토어 연결 API 키 사용
- 기록:
- 빠른 래인 파일 복사
- GitHub 액션 구성
1. 빠른 래인과 애플 스토어 연결 API 사용
2021년 2월 이후로 모든 사용자가 애플 스토어 연결에 로그인하기 위해 2단계 인증 또는 2단계 인증이 필요합니다. 이 추가 보안 기능은 애플 ID에 대한 보안을 강화하여 계정에 대한 액세스를 제한합니다.
애플 지원 요구 사항
빠른 래인이 애플 스토어 연결 __CAPGO_KEEP_0__을 사용하여 앱을 업로드할 수 있도록 하려면 다음을 제공해야 합니다.
In order for Fastlane to be able to use App Store Connect API to upload your app, you need to provide the following 세 가지 3
- 발행자 ID
- 키 ID
- 키 파일 또는 키 내용
API App Store Connect 키 취득
App Store Connect 키를 생성하려면 Admin 권한이 필요합니다. 권한이 없다면 해당 문서를 참조하도록 관련 사람에게 지시하세요.
-
로그인 App Store Connect.
-
선택 사용자 및 액세스.

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

- Click Generate API Key or the Add (+) button.

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

6 — 권한 아래, 키에 대한 역할을 선택하세요. 팀 내 사용자에 대한 역할과 동일한 역할이 키에 적용됩니다. 자세한 내용은 역할 권한권한을 제한하는 것을 추천하지 않습니다. 앱 매니저.
- Click Generate.
API 키의 앱에 대한 접근 권한은 제한할 수 없습니다.
새 키의 이름, 키 ID, 다운로드 링크, 기타 정보가 페이지에 나타납니다.

모든 필요한 정보를 여기서 가져올 수 있습니다.
<1> Issue ID. (APPLE_ISSUER_ID secret)
<2> Key ID. (APPLE_KEY_ID secret)
<3> "API" 키 다운로드"를 클릭하여 API 개인 키를 다운로드하세요. 다운로드 링크는 개인 키가 다운로드되지 않은 경우에만 나타납니다. 애플은 개인 키의 복사본을 유지하지 않습니다. 따라서 개인 키를 한 번만 다운로드할 수 있습니다.
🔴 개인 키를 안전한 곳에 저장하세요. 키를 공유하지 않도록 하며, code 저장소에 키를 저장하거나, code에 키를 포함하지 않도록 하세요.
App Store Connect API Key 사용
API Key 파일 (다운로드한 p8 파일), 키 ID, 발급자 ID는 인증을 위한 JWT 토큰을 생성하기 위해 필요합니다. 이 정보를 Fastlane에 전달하는 방법은 여러 가지가 있습니다. Fastlane의 새로운 액션을 사용하여 전달하는 방법을 선택했습니다. app_store_connect_api_key. 다른 방법을 알아보려면 Fastlane 문서. 이 방법을 보여주고 있는 이유는 CI에서 가장 쉽게 작업할 수 있는 방법이라고 생각하기 때문입니다. 환경 변수를 설정할 수 있는 CI에서 대부분이 사용할 수 있습니다.
다운로드한 p8 파일을 Base64로 변환하여 비밀로 저장하세요 (APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
Fastlane을 사용하여 API 키를 통해 App Store Connect를 관리할 수 있습니다. 좋아요!
2. 인증서
XCode를 열고 설정 > 계정 > Apple ID > 팀 __CAPGO_KEEP_0__ 서명 식별자

인증서 관리 __CAPGO_KEEP_0__.
인증서가 아직 없다면 인증서를 생성할 수 있습니다.
__CAPGO_KEEP_0__ + __CAPGO_KEEP_1__ __CAPGO_KEEP_2__

__CAPGO_KEEP_3__ .p12 __CAPGO_KEEP_4__
__CAPGO_KEEP_5__ __CAPGO_KEEP_6__ __CAPGO_KEEP_7__ __CAPGO_KEEP_8__.

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

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

그 다음 올바른 앱을 선택하세요, 주의해야 합니다. 와일드 카드 사용하면 서명이 실패합니다.

그 전에 만든 올바른 인증서를 선택하세요 (만료일을 확인하세요. 오늘 날짜와 월이 같아야 합니다.) 계속.

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

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

프로필을 Base64로 변환하고 비밀로 저장하세요 (BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Fastlane 파일 복사
Fastlane은 Ruby 라이브러리로 모바일 개발을 자동화하는 데 사용됩니다. Fastlane을 사용하면 Android Studio에서 수행하는 일반적인 작업을 수행하는 '액션'을 묶은 '로우'를 구성할 수 있습니다. Fastlane은 많은 기능을 제공하지만 이 튜토리얼에서는 핵심 액션만 사용할 것입니다.
Ionic 프로젝트의 루트에 Fastlane 폴더를 생성하고 Fastfile을 추가하세요: Capacitor
- 폴더:
<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
내부에 만들지 마십시오.
GitHub Actions uses the repository secrets you configure in the next step. You only need a local .env __CAPGO_KEEP_0__ Actions는 다음 단계에서 구성한 저장소 비밀을 사용합니다.
자신의 머신에서 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=
앱 스토어 연결 팀 ID를 가져오기
개발자 센터로 이동하세요 스크롤을 내려서 부분을 찾으세요.
Membership details 이 값은 Team ID secret. APP_STORE_CONNECT_TEAM_ID app-store-connect-team-id
Xcode를 열어보세요
- Xcode에서
- 를 더블 클릭하세요
App프로젝트 탐색기에서 - 그런 다음 탭을 클릭하세요.
Signing and Capabilities - 값의 복사본을 가져오세요.
Bundle identifier이 값은 App Store Connect에서 CI/CD 워크플로우를 실행하는 데 사용하는 분량에 따라 청구됩니다.BUNDLE_IDENTIFIERbundle-identifier-xcode
Capgo에서 __CAPGO_KEEP_0__ 액션에서
In GitHub Actions, App Store Connect에서 빌드를 처리하는 데 10-15분이 걸립니다. 개인 프로젝트의 경우, 빌드당 예상 비용은 $0.08/분 x 15분 = $1.2
6. Processing In Capgo's __CAPGO_KEEP_0__ Actions, you are billed based on the minutes you have used for running your CI/CD workflow., 또는 프로젝트의 구성 및 의존성에 따라 __CAPGO_KEEP_0__.
비공개 프로젝트에 대한 비용에 대한 걱정이라면, skip_waiting_for_build_processing 를 설정할 수 있습니다. true이 설정을 사용하면 App Store Connect가 빌드 처리를 완료하기를 기다리지 않고 빌드 분량을 절약할 수 있습니다.
그러나, 이 최적화는 빌드 분량이 비용이 들 수 있는 비공개 프로젝트에만 유용합니다. 공개/무료 프로젝트의 경우 빌드 분량은 무료이므로 이 설정을 활성화할 필요가 없습니다. __CAPGO_KEEP_0__의
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 를 참조하세요. 7. __CAPGO_KEEP_0__ 액션 설정
GitHub 비밀 설정
GitHub 비밀을 복사하고
파일의 비밀을 __CAPGO_KEEP_0__ 저장소 비밀에 붙여넣으세요. .env 7. GitHub Actions 설정
Go to 설정 > __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 워크플로 파일을 구성하십시오.
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 __CAPGO_KEEP_0__ actions Automatic build and release with GitHub actions Automatic build and release with __CAPGO_KEEP_0__ actions
그런 다음 이 워크플로가 NodeJS 의존성을 pulls, 설치하고 JavaScript 앱을 빌드할 것입니다.
매번 새로운 커밋을 보내면 테스트 플라이트에서 릴리즈가 빌드될 것입니다.
앱은 Ionic을 사용할 필요가 없습니다. Capacitor의 기본만 필수입니다. 오래된 Cordova 모듈을 사용할 수 있지만 Capacitor JS 플러그인은 선호됩니다.
8. 워크플로 트리거
커밋 만들기
커밋을 만들고 , 저장소에서 활성화된 워크플로를 볼 수 있을 것입니다.워크플로 트리거
새로운 커밋을 브랜치에 푸시하거나
워크플로를 트리거하기 위해 main 8. 워크플로를 트리거하십시오 development 커밋을 만들십시오

몇 분 후에 빌드는 App Store Connect 대시보드에 표시됩니다.

9. 로컬 머신에서 배포할 수 있나요?
네, 가능합니다. 그리고 그것은 매우 간단합니다.
Xcode를 사용하여 앱을 빌드하고 서명할 수 있습니다.
관련 문서
CI/CD 설정 가이드
- 자동 Capacitor Android 빌드와 GitHub 액션 - 완전한 Android CI/CD 설정
- 자동 빌드 및 릴리즈와 GitHub 액션 - 전체 CI/CD PIPE라인 튜토리얼
- GitHub 빌드 관리하기 - 개발 및 운영 환경 관리
- Capacitor iOS 빌드 자동화하기 - Fastlane Match를 사용하는 대안
CI/CD 플랫폼의 대안
- GitLab CI를 사용하여 빌드하기 - GitLab 대안
- CodeMagic을 사용하여 빌드하기 - CodeMagic 설정 가이드
실시간 업데이트 및 배포
- Capgo 실시간 업데이트 문서 - 앱에 OTA 업데이트 추가
- CI/CD 통합 Capgo - pipeline에 실시간 업데이트 통합
감사합니다
다음 기사에 기반한 이 블로그입니다: