본문으로 건너뛰기
CI/CD

자동 Capacitor IOS 빌드와 GitHub 액션으로 인증서

How to set up a CI/CD pipeline for your IOS Ionic app using fastlane and GitHub Actions in 5 mins (2024)

작품 저자

마틴 도나디우

작가

발레리아

리뷰어

조던

편집자

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

CI/CD를 위한 Capacitor 앱 설정은 복잡하고 시간이 많이 걸립니다. 여기서부터 시작하세요:

우리는 __CAPGO_KEEP_0__ 빌드와 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__를 사용하는 것을 추천합니다. Capgo 빌드는 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 CI/CD를 위한 빌드 Capgo

__CAPGO_KEEP_0__ 빌드 Capgo 빌드 CI/CD pipeline에서 기존의 iOS 빌드를 자동으로 생성합니다:

  • CI/CD pipeline과 함께 작동합니다: Capgo 빌드를 GitHub Actions, GitLab CI, Jenkins, 또는 로컬 스크립트에서 트리거하고 웹 빌드 후에 npx cap sync.
  • CI secret에서 서명: App Store Connect 키, 인증서, 배포 프로파일, 비밀번호, 팀 ID를 CI secret에서 관리합니다.
  • 자연어 빌드 환경 유지 관리가 필요하지 않습니다: Capgo 빌드는 macOS 빌드 환경을 유지 관리하기 위해 macOS 빌드 환경, Xcode 이미지, 또는 Fastlane 경로를 관리할 필요가 없습니다.
  • 아티팩트 및 제출: QA를 위해 다운로드한 서명된 아티팩트를 제출하거나 Capgo CLI를 통해 릴리즈 빌드를 제출할 수 있습니다.

가격

  • Capgo 서비스는 1달에 12달러부터 시작합니다.
  • Capgo 계획은 $12/월부터 시작됩니다.
  • 분당 빌드 시간은 크레딧을 통해 분당 요금으로 청구됩니다.

CI/CD에서 Capgo 빌드를 설정하세요.

수동 설정 안내서

다음과 같이 하세요:

Fastlane과 GitHub 액션을 사용하여 iOS에 대한 지속적인 배포

준비 사항

이 튜토리얼을 계속하기 전에:

  • 개발 머신에 Fastlane이 설치되어 있어야 합니다. installed 가격에 대한 중요한 정보
  • __CAPGO_KEEP_0__

__CAPGO_KEEP_0__

가격 GitHub 액션

https://github.com/features/actions

서비스는 '무료'까지 선택한 기계에 따라 제한에 따라
이 튜토리얼에서 사용하는 macOS 기계를 보실 수 있습니다. 스크린샷에 가격과 제한을 확인하실 수 있습니다. (가격은 튜토리얼이 작성된 시점의 가격으로, 미래에 변경될 수 있습니다.) macOS 주의: 이 포스트에서, 앱이 App Store Connect에 생성된 것으로 가정합니다. Fastlane이 중요한 정보를 복사합니다.

이 튜토리얼에서 배울 내용

이 포스트에서 따르는 단계

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

  1. 애플 스토어 커넥트 API를 Fastlane과 함께 사용하기
    • 요구 사항:
      • 애플 스토어 커넥트 API 키 생성
      • 애플 스토어 커넥트 API 키 사용
  2. Fastlane 파일 복사
  3. GitHub 액션 구성

1. 애플 스토어 커넥트 API를 Fastlane과 함께 사용하기

2021년 2월 이후로 모든 사용자가 애플 스토어 커넥트에 로그인하기 위해 2단계 인증 또는 2단계 인증이 필요합니다. 이 추가 보안 기능은 Apple ID에 대한 보안을 강화하여 사용자 계정에 대한 액세스를 제한합니다.
From 애플 지원

요구 사항

Fastlane이 애플 스토어 커넥트 API를 사용하여 앱을 업로드할 수 있도록 하려면 다음을 제공해야 합니다. 세 가지 것들:

  1. 발급자 ID
  2. 키 ID
  3. 키 파일 또는 키 내용

앱 스토어 연결 API 키를 얻는 방법

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

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

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

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

3 — Integration 탭을 선택하세요.

애플 스토어 연결 API 통합

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

애플 스토어 연결 API 키 생성

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

애플 스토어 연결 API 키 이름

6 — 액세스에서 키의 역할을 선택하세요. 키의 역할은 팀 내 사용자에게 적용되는 역할과 동일합니다. 자세한 내용은 역할 권한을 참조하세요. 애플리케이션 관리자.

  1. Generate을 클릭하세요.

API 키의 액세스는 특정 앱으로 제한할 수 없습니다.

새로운 키의 이름, 키 ID, 다운로드 링크 및 기타 정보가 페이지에 나타납니다.

애플 스토어 연결 다운로드 키

필요한 세 가지 정보를 모두 여기서 가져올 수 있습니다.
1. 이슈 ID. (APPLE_ISSUER_ID secret)
2. 키 ID. (APPLE_KEY_ID secret)
3. "다운로드 API 키"를 클릭하여 API 개인 키를 다운로드하세요. 다운로드 링크는 개인 키가 다운로드되지 않은 경우에만 나타납니다. 애플은 개인 키의 복사본을 유지하지 않습니다. 따라서 개인 키를 한번만 다운로드할 수 있습니다.

🔴 개인 키를 안전한 곳에 저장하세요. 키를 공유하지 마세요, 키를 code 저장소에 저장하지 마세요, 또는 code에 키를 포함하지 마세요.

애플 스토어 연결 API 키 사용

다운로드한 API 키 파일(p8 파일), 키 ID, 발급자 ID가 JWT 토큰 인증을 위해 필요합니다. 이 정보를 Fastlane에 전달하는 방법은 여러 가지가 있습니다. Fastlane의 새로운 액션을 사용하여 선택했습니다. 다른 방법을 알아보세요. app_store_connect_api_keyApp Store Connect download keys 빠른 빌드. CI에서 환경 변수를 설정할 수 있는 곳에서 가장 쉽게 작업할 수 있는 방법이라고 생각하기 때문에 이 방법을 보여줍니다.

다운로드한 p8 파일을 Base64로 변환하고 __CAPGO_KEEP_0__ 키를 사용하여 Secret로 저장하세요.APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

앱 스토어 연결을 관리하는 Fastlane을 사용하여 API 키를 사용할 수 있습니다.

XCode를 열고

설정 > 계정 Apple ID 계정 Fastlane 문서 계정 팀 그리고 팀을 선택하세요.

Code 서명 식별자

클릭하여 인증서 관리.

인증서가 아직 생성되지 않았다면 새 인증서를 생성할 수 있습니다.

클릭하여 + 그리고 선택하세요. 애플 배포

애플 배포

그런 다음 키 체인에 가서 인증서를 파일로 다운로드해야 합니다. .p12 다운로드

이를 하려면 키 체인으로 이동하여 로그인 키 체인 탭으로 이동하여 내 인증서.

내 인증서

그런 다음 원하는 인증서를 다운로드할 수 있습니다. (인증서의 날짜를 확인하세요)

그 다음 인증서의 개인 키를 오른쪽 클릭하여 내보내기.

파일 형식을 선택하세요 개인 정보 교환 (.p12).

이는 인증서를 파일로 다운로드합니다. .p12 file.

파일을 터미널에서 열어 Base64로 변환하기 위해 다음 명령어를 사용하세요:

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

이것이 당신의 BUILD_CERTIFICATE_BASE64 비밀입니다. 또한, 인증서의 비밀번호를 요청할 때, 비밀번호를 제공해 주세요. 이 비밀번호가 당신의 P12_PASSWORD 비밀입니다.

3. 프로비전 프로파일

열기 애플 개발자 올바른 팀을 선택하세요.

그 다음, 새로운 프로파일을 만들기 위해 +

새로운 프로파일 만들기

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

애플 스토어 연결 선택

그 다음에 올바른 앱을 선택해야 합니다. 와일드 카드 사용 시 서명이 실패할 수 있으니 주의하세요.

올바른 앱 선택

앞서 생성한 올바른 인증서를 선택하세요. 만료일을 확인하세요. 오늘 날짜와 월이 일치해야 합니다. 계속.

올바른 인증서 선택

마지막으로 프로파일 이름을 입력하고 생성.

생성된 프로파일 이름은 Fastlane에서 프로파일을 식별하는 값으로 사용됩니다. APPLE_PROFILE_NAME.

프로파일 생성

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

다운로드 프로필

프로필을 Base64로 변환하고 비밀로 저장하십시오 (BUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Fastlane 파일 복사

Fastlane은 안드로이드 스튜디오를 자동화하기 위해 Ruby 라이브러리를 만든 것입니다. 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 Actions은 다음 단계에서 구성한 저장소 비밀을 사용합니다. .env 파일을 원한다면 로컬 머신에서 Fastlane을 실행하거나 테스트하고 싶다면

로컬 테스트를 위해 생성하세요 <project-root>/fastlane/.env 다음에 FastfileCapacitor iOS 빌드 GitHub 액션 fastlane/.env .fastlane 폴더 .gitignore Commit하지 마세요. 이 파일을

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를 가져오기 로컬 머신에서 Membership details Developer Center Team ID 자동 빌드에 필요한 값입니다. APP_STORE_CONNECT_TEAM_ID 비밀입니다.

애플 스토어 연결 팀 ID

BUNDLE IDENTIFIER를 가져오기

  1. Xcode 열기
  2. 프로젝트 탐색기에서 이 아이콘을 두 번 클릭하세요. App 그런 다음 탭을 클릭하세요.
  3. 이 값의 복사본을 클릭하세요. Signing and Capabilities
  4. 이 값은 앱의 BUNDLE IDENTIFIER입니다. 이 값을 bundle-identifier-xcode에 설정해야 합니다. Bundle identifier6. 빌드 처리 BUNDLE_IDENTIFIER 비밀입니다.
6. 빌드 처리

6. 빌드 처리

In GitHub 액션에서 분당 요금으로 청구됩니다. 개인 프로젝트의 경우, 예상 비용은 $0.08/분 x 15분 = $1.2 또는 그 이상으로, 프로젝트의 구성 및 의존성에 따라 달라집니다.

개인 프로젝트의 비용에 대한 걱정에 대한 걱정이라면, App Store Connect에서 빌드가 완료될 때까지 기다리지 않고 빌드 분수를 절약할 수 있습니다. 그러나, 이 최적화는 빌드 분수를 절약하는 대신, 사용자에게 배포하기 전에 앱의 준수 정보를 수동으로 업데이트해야 합니다.프로젝트의 설정과 의존성에 따라 여러 개가 될 수 있습니다.

__CAPGO_KEEP_0__ 액션에서 skip_waiting_for_build_processing to true개인 프로젝트의 경우, 예상 비용은 $0.08/분 x 15분 = $1.2 또는 그 이상으로, 프로젝트의 구성 및 의존성에 따라 달라집니다.

개인 프로젝트의 비용에 대한 걱정이라면, 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. GitHub 액션을 설정하세요.

GitHub 비밀을 설정하세요.

파일에서 비밀을 복사하고 __CAPGO_KEEP_0__ 저장소 비밀에 붙여넣으세요. .env 파일과 그들을 GitHub 저장소 비밀에 붙여넣으세요.

설정 &gt; 변수 및 액션 기능 변수 및 액션 Actions 변수 및 액션 새로운 저장소 비밀

github-비밀

2. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__-인증서(Base64 인코딩)

3. BUILD_PROVISION_PROFILE_BASE64 __CAPGO_KEEP_0__-배포 프로파일(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 폴더를 만들고, 이름을 __CAPGO_KEEP_0__으로 하는 파일을 생성하세요. 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 후에 트리거되어야 합니다. 태그자동화된 태그를 필요로 하실 경우, 자동화된 태그를 생성하는 방법에 대한 설명을 참조해 주세요. 자동 빌드 및 릴리즈와 함께 GitHub 작업 첫 번째.

노드 JS 의존성을 pulls 하여 설치하고 자바 스크립트 앱을 빌드합니다.

새로운 커밋을 보내면 매번 테스트 플라이트에서 릴리즈가 빌드됩니다.

애플리케이션은 Ionic을 사용할 필요가 없습니다. Capacitor의 기본 버전만 필수적이며, 오래된 Cordova 모듈을 사용할 수 있지만 Capacitor JS 플러그인은 선호됩니다.

8. 워크플로우를 트리거하세요.

자동으로 iOS 빌드

Make a 커밋, 저장소에서 활성 워크플로우를 볼 수 있습니다.

워크플로우를 트리거

브랜치에 새로운 커밋을 푸시하거나 main 또는 development HTML 텍스트 프래그먼트입니다. (parent key `alternatives_cta_questions`).

워크플로우를 트리거

브랜치에 새로운 커밋을 푸시하거나

또는

자동으로 iOS 빌드

네, 가능합니다. 그리고 그것은 매우 쉬워요.

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

CI/CD 설정 가이드

CI/CD 플랫폼 대안

실시간 업데이트 및 배포

감사합니다

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

Capacitor iOS 빌드 자동화와 GitHub 액션으로 계속 진행

만약에 Capacitor iOS 빌드 자동화와 GitHub 액션으로 계속 진행 자동화된 CI/CD를 계획하고 __CAPGO_KEEP_0__ CI/CD와 연결 Capgo CI/CD Capgo CI/CD Capgo 네이티브 빌드 Capgo 네이티브 빌드 Capgo 통합 Capgo 통합을 위한 제품 워크플로우 CI/CD 통합 __CAPGO_KEEP_0__ 액션 통합 GitHub 액션 통합을 위한 implementation detail GitHub 액션 통합 구현 세부 사항을 위해.

라이브 업데이트 Capacitor 앱

웹层 버그가 라이브일 때, 앱 스토어 승인 대기 없이 Capgo를 통해 패치를 배포하세요. 사용자는 배경에서 업데이트를 받으며 네이티브 변경은 일반적인 검토 경로를 유지합니다.

마틴의 인간 지원

시작하기

최신 블로그 기사

Capgo은 전문적인 모바일 앱을 만들기 위해 필요한 최고의 통찰력을 제공합니다.