Github Action으로 Testflight 배포 자동화하기

rhkrthdud7·2023년 8월 11일
0

dev

목록 보기
1/2

안녕하세요 :)

오늘은 Github Actions으로 Testflight으로 앱을 배포하는 걸 정리해보도록 하겠습니다

제가 처음에 목표로 했던 플로우입니다
1. 태그 푸쉬
2. Github Actions workflow 트리거
3. 푸쉬된 태그에서 앱 버전 추출
4. 추출된 버전으로 빌드 생성
5. 생성된 빌드 Testflight으로 배포

작업하면서 수정된 플로우입니다
1. 태그 푸쉬
2. 환경 변수 설정
3. Git 체크아웃 (코드 체크아웃)
4. 푸쉬된 태그에서 앱 버전 추출
5. 추출된 앱 버전으로 현재 프로젝트를 앱 버전 변경
6. 키체인 초기화
7. 인증서 복호화 및 설치
8. 앱 아카이브
9. 아카이브에서 ipa 추출
10. Testflight으로 업로드

인증서 사이닝쪽이 추가되고 작은 작업들이 늘어났습니다

0. 워크플로우 파일 생성


먼저 깃헙 프로젝트 생성 후 workflow 파일을 생성합니다
이 부분인데요 신규 파일을 생성하면 template 코드가 생성됩니다

1. 태그 푸쉬

저는 해당 워크플로우를 태그가 푸쉬 될때 실행되길 원했기 때문에 이벤트를 태그 푸쉬로 설정했습니다

on:
  push:
    tags: 
      - v*

모든 태그 푸쉬를 이벤트로 설정하는 방법은 제가 못 찾아서 푸쉬된 태그중 "v" 로 시작하는 태그들이 푸쉬 되는 이벤트로 설정했습니다

2. 환경 변수 설정

env:
      XC_VERSION: ${{ '11.6' }}
      XC_WORKSPACE: ${{ 'HoneyPot.xcworkspace' }}
      XC_ARCHIVE: ${{ 'HoneyPot.xcarchive' }}
      XC_SCHEME: ${{ 'HoneyPot' }}
      KEYCHAIN: ${{ 'temporary.keychain' }}
      DECRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/cert.p12' }}
      ENCRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/cert.p12.gpg' }}
      DECRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/HoneyPotProvisioning.mobileprovision' }}
      ENCRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/HoneyPotProvisioning.mobileprovision.gpg' }}
      CERT_EXPORT_KEY: ${{ secrets.CERT_EXPORT_KEY }}
      CERT_ENCRYPTION_KEY: ${{ secrets.CERT_ENCRYPTION_KEY }}
      PROVISIONING_ENCRYPTION_KEY: ${{ secrets.PROVISIONING_ENCRYPTION_KEY }}

꼭 환경변수를 설정해야되는건 아니지만 인증서 복호화를 위한 키라던지 중요한 파일들은 환경 변수로 설정해서 안전하게 사용할 수 있도록 했습니다

secrets은 깃헙에서 설정쪽에서 설정 할 수 있습니다

3. Git 체크아웃 (코드 체크아웃)

steps:
- uses: actions/checkout@v2

Github Actions에서 기본으로 제공하는 액션입니다 사용해줍시다

4. 푸쉬된 태그에서 앱 버전 추출

- name: Get tag version
  run: echo ::set-env name=RELEASE_VERSION::$(echo ${GITHUB_REF:11})

현재 태그를 추출합니다

5. 추출된 앱 버전으로 현재 프로젝트를 앱 버전 변경

- name: Set app version
  run: sed -i .bak 's/MARKETING_VERSION = 1.0.0;/MARKETING_VERSION = ${{ env.RELEASE_VERSION }};/g' HoneyPot.xcodeproj/project.pbxproj

추출된 태그로 프로젝트 앱 버전을 설정합니다

sed 커멘드에 대해서 좀 찾아보시면 이해가 되실 꺼에요

6. 키체인 초기화

- name: Configure Keychain
  run: |
    security create-keychain -p "" "$KEYCHAIN"
    security list-keychains -s "$KEYCHAIN"
    security default-keychain -s "$KEYCHAIN"
    security unlock-keychain -p "" "$KEYCHAIN"
    security set-keychain-settings

인증서를 설치하기에 앞서 키체인을 새로 생성하고 초기화 합니다

7. 인증서 복호화 및 설치

- name : Configure Code Signing
  run: |
    gpg -d -o "$DECRYPTED_CERT_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERT_ENCRYPTION_KEY" "$ENCRYPTED_CERT_FILE_PATH"
    gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROVISIONING_ENCRYPTION_KEY" "$ENCRYPTED_PROVISION_FILE_PATH"
    security import "$DECRYPTED_CERT_FILE_PATH" -k "$KEYCHAIN" -P "$CERT_EXPORT_KEY" -A
    security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN"
    mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
      for PROVISION in `ls .github/secrets/*.mobileprovision`
      do
        UUID=`/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i ./$PROVISION)`
        cp "./$PROVISION" "$HOME/Library/MobileDevice/Provisioning Profiles/$UUID.mobileprovision"
      done

사실 7번을 진행하기에 앞서 인증서를 먼저 생성하고 gpg로 암호화 한 뒤에 깃 레포에 올려놔야되는데

이 과정은 마지막에 참고 링크로 대체하도록 하겠습니다

먼저 올려둔 인증서를 복호화 한 뒤에 키체인에 설치를 하고 Xcode가 사용할 수 있도록 Provisioning Profiles 폴더를 생성해서 인증서를 이동시킵니다

8. 앱 아카이브

- name: Archive app
  run: |
    xcodebuild archive -workspace $XC_WORKSPACE -scheme $XC_SCHEME -configuration release -archivePath $XC_ARCHIVE

Xcode 커멘드로 앱을 아카이브 합니다

9. 아카이브에서 ipa 추출

- name: Export app
  run: |
    xcodebuild -exportArchive -archivePath $XC_ARCHIVE -exportOptionsPlist Export.plist -exportPath . -allowProvisioningUpdates

마찬가지로 커멘드로 ipa를 추출합니다

이때 Export.plist 라는 파일이 필요한데 이 과정도 링크로 대체하도록 하겠습니다

10. Testflight으로 업로드

- name: Upload app to TestFlight
  uses: apple-actions/upload-testflight-build@v1
  with:
    app-path: 'HoneyPot.ipa'
    issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
    api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }}
    api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}

마지막으로 Github Actions 중에 Testflight으로 업로드 하는 액션이 있어서 관련 세팅만 해주고 사용해줍시다!

그 이후 엄청난 삽질의 결과로 성공 할 수 있었네요 마지막에 성공 했을 때 얼마나 기분이 좋았는지...

사실 자동화를 거의 처음 설정해보는거라 삽질도 많이 하고 뭔가 배운것도 많은 것 같아요 예전에 Fastlane이라는 도구를 사용해서 배포를 한적은 있었는데 Github Actions 처럼 그냥 스크립팅해보는건 처음이라 삽질을 많이 했네요

다음에는 또 다른 삽질을 정리해보도록 하겠습니다

감사합니다!

갓제드님 링크 zeddios.tistory.com/1033
따라한 링크 medium.com/@karaiskc/archive-and-export-ios-app-with-github-actions-b44f676e4bf9

profile
삽질을 좋아하는 iOS 개발자

0개의 댓글