-
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