__CAPGO_KEEP_0__ 자동 iOS 빌드에 __CAPGO_KEEP_1__ 액션으로 인증서를 사용합니다.
CI/CD

자동 Capacitor IOS 빌드 GitHub 인증서와 함께 액션

5분 이내에 GitHub Actions 및 Fastlane을 사용하여 IOS Ionic 앱의 CI/CD PIPELINE을 설정하는 방법 (2024)

마틴 도나디유

마틴 도나디유

콘텐츠 마케터

자동 Capacitor IOS 빌드 GitHub 인증서와 함께 액션

Capacitor 앱의 CI/CD 설정은 복잡하고 시간이 많이 걸립니다. 다음을 알아야 합니다.

현재 __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

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

GitHub

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

  • __CAPGO_KEEP_0__을 설치한 개발 환경에 이미 설치되어야 합니다.
  • iOS 개발자 프로그램 회원이되어야 합니다.

가격에 대한 중요한 정보

가격 GitHub Action

https://github.com/features/actions

__CAPGO_KEEP_0__은 '무료'입니다.한계에 따라 선택한 기계에 따라 __CAPGO_KEEP_0__을 사용할 것입니다.
macOS를 사용할 것입니다. __CAPGO_KEEP_0__ 스크린샷에서 가격과 제한을 확인할 수 있습니다 (가격은 튜토리얼이 작성된 시점의 가격이며 미래에 변경될 수 있습니다).

주의사항과 가격을 알았으면 이제 계속합니다.

참고: 이 포스트에서 앱을 App Store Connect에 생성한 것으로 가정합니다. Fastlane으로 중요한 정보를 복사합니다.

이 튜토리얼에서 배울 내용

이 포스트에서 따르는 단계

  1. App Store Connect API을 Fastlane과 함께 사용하는 방법
    • 요구 사항:
      • App Store Connect API 키를 생성하는 방법
      • App Store Connect API 키를 사용하는 방법
  2. Fastlane 파일 복사
  3. 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:

  1. Issuer ID
  2. Key ID
  3. Key file or Key content

App Store Connect API 키를 얻는 방법

App Store Connect에 Admin 권한이 있어야 키를 생성할 수 있습니다. 권한이 없다면 관련 사람에게 이 문서를 알려주십시오.

  1. 로그인 앱 스토어 연결.

  2. 선택 사용자 및 액세스.

앱 스토어 연결 사용자 액세스

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

앱 스토어 연결 API 통합

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

앱 스토어 연결 API 키 생성

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

앱 스토어 연결 API 키 생성 이름

6 — 액세스 아래에서 키에 적용되는 역할을 선택하세요. 키에 적용되는 역할은 팀 내 사용자에 적용되는 역할과 동일합니다. 역할 권한선택하는 것을 추천합니다. 앱 관리자.

  1. 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를 열고 설정 > 계정 > 애플 아이디 > 팀을 선택하세요.

Code 서명 식별자

클릭하여 인증서 관리.

인증서가 아직 없다면 인증서를 새로 만들 수 있습니다.

클릭하여 + 및 선택 애플 배포

애플 배포

그런 다음 인증서를 다운로드하기 위해 키 체인에 가야합니다. 인증서를 파일로 다운로드할 수 있습니다. .p12 이 작업을 수행하려면 키 체인에 가서 로그인 키 체인으로 switch하고 'My Certificates' 탭으로 이동해야합니다.

My Certificates My Certificates 그런 다음 다운로드하고 싶은 인증서를 선택할 수 있습니다. (인증서의 날짜를 확인하세요) 그런 다음 인증서의 개인 키를 오른쪽 클릭하고 '및 선택'을 선택하세요..

__CAPGO_KEEP_0__

__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_1__

__CAPGO_KEEP_2__ __CAPGO_KEEP_3__.

__CAPGO_KEEP_4__

__CAPGO_KEEP_5__

__CAPGO_KEEP_6__

__CAPGO_KEEP_7__ __CAPGO_KEEP_8__.

__CAPGO_KEEP_9__

__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 IDAPP_STORE_CONNECT_TEAM_ID 에서 설정해야 하는 값입니다.

secret.

app-store-connect-team-id

  1. BUNDLE_IDENTIFIER를 가져오기
  2. Open Xcode App Double click on the
  3. 프로젝트 탐색기에서 Signing and Capabilities
  4. Copy the value of the Bundle identifier이 값을 BUNDLE_IDENTIFIER secret.
bundle-identifier-xcode

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" &gt; 비밀 및 변수 &gt; 작업 &gt; 새로운 저장소 비밀

github-secrets

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__를 트리거합니다.

__CAPGO_KEEP_0__ 커밋으로 시작합니다.

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

Testflight 대시보드

9. 로컬 머신에서 배포할 수 있나요?

가능합니다.

Xcode를 사용하여 앱을 빌드하고 서명할 수 있습니다.

CI/CD 설정 가이드

Fastlane Match 대안 CI/CD 플랫폼

실시간 업데이트 및 배포

감사합니다

다음 기사에 기반한 이 블로그입니다:

자동 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 액션 통합 구현 세부 사항에 대해

Capacitor 앱에 대한 실시간 업데이트

웹层 버그가 활성화된 경우, 앱 스토어 승인까지 기다리지 않고 Capgo를 통해 패치를 배포하세요. 사용자는 배경에서 업데이트를 받으며, 네이티브 변경 사항은 일반적인 검토 경로를 유지합니다.

시작하기

__CAPGO_KEEP_0__

Capgo이 제공하는 Capgo는 Capgo 앱을 완벽하게 전문적으로 만들기 위해 필요한 Capgo를 제공합니다.