안녕하세요 :)
오늘은 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으로 업로드
인증서 사이닝쪽이 추가되고 작은 작업들이 늘어났습니다
먼저 깃헙 프로젝트 생성 후 workflow 파일을 생성합니다
이 부분인데요 신규 파일을 생성하면 template 코드가 생성됩니다
저는 해당 워크플로우를 태그가 푸쉬 될때 실행되길 원했기 때문에 이벤트를 태그 푸쉬로 설정했습니다
on:
push:
tags:
- v*
모든 태그 푸쉬를 이벤트로 설정하는 방법은 제가 못 찾아서 푸쉬된 태그중 "v" 로 시작하는 태그들이 푸쉬 되는 이벤트로 설정했습니다
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은 깃헙에서 설정쪽에서 설정 할 수 있습니다
steps:
- uses: actions/checkout@v2
Github Actions에서 기본으로 제공하는 액션입니다 사용해줍시다
- name: Get tag version
run: echo ::set-env name=RELEASE_VERSION::$(echo ${GITHUB_REF:11})
현재 태그를 추출합니다
- 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 커멘드에 대해서 좀 찾아보시면 이해가 되실 꺼에요
- 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
인증서를 설치하기에 앞서 키체인을 새로 생성하고 초기화 합니다
- 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 폴더를 생성해서 인증서를 이동시킵니다
- name: Archive app
run: |
xcodebuild archive -workspace $XC_WORKSPACE -scheme $XC_SCHEME -configuration release -archivePath $XC_ARCHIVE
Xcode 커멘드로 앱을 아카이브 합니다
- name: Export app
run: |
xcodebuild -exportArchive -archivePath $XC_ARCHIVE -exportOptionsPlist Export.plist -exportPath . -allowProvisioningUpdates
마찬가지로 커멘드로 ipa를 추출합니다
이때 Export.plist 라는 파일이 필요한데 이 과정도 링크로 대체하도록 하겠습니다
- 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