ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Github Action으로 Testflight 배포 자동화하기
    Dev 2022. 11. 8. 14:05

    안녕하세요 :)

    오늘은 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

     

    'Dev' 카테고리의 다른 글

    앱 배포 스크립트 작성하기  (0) 2023.05.12

    댓글

Designed by Tistory.