|
| 1 | +name: Distribution to TestFlight |
| 2 | + |
| 3 | +on: |
| 4 | + pull_request: |
| 5 | + branches: [ release/* ] |
| 6 | + |
| 7 | +jobs: |
| 8 | + deploy: |
| 9 | + name: ๐ Distribution to TestFlight Workflow |
| 10 | + runs-on: macos-15 # ์ต์ macOS 15 ํ๊ฒฝ์์ ์คํ |
| 11 | + env: |
| 12 | + ## ํ๋ก์ ํธ ์ด๋ฆ์ ๋ณ์๋ก ์ค์ |
| 13 | + PROJECT_NAME: Poppool |
| 14 | + |
| 15 | + # app archive ๋ฐ export ์ ์ฐ์ผ ํ๊ฒฝ ๋ณ์ ์ค์ |
| 16 | + XC_PROJECT: ${{ env.PROJECT_NAME }}/${{ env.PROJECT_NAME }}.xcodeproj |
| 17 | + XC_SCHEME: ${{ env.PROJECT_NAME }} |
| 18 | + XC_ARCHIVE: ${{ env.PROJECT_NAME }}.xcarchive |
| 19 | + |
| 20 | + # certificate |
| 21 | + ENCRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/certification.p12.gpg' }} |
| 22 | + DECRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/certification.p12' }} |
| 23 | + CERT_ENCRYPTION_KEY: ${{ secrets.CERT_ENCRYPTION_PWD }} # gpg๋ก ํ์ผ ์ํธํํ ๋ ์ฌ์ฉํ ์ํธ |
| 24 | + |
| 25 | + # provisioning |
| 26 | + ENCRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/' }}${{ env.PROJECT_NAME }}GithubActions.mobileprovision.gpg |
| 27 | + DECRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/' }}${{ env.PROJECT_NAME }}GithubActions.mobileprovision |
| 28 | + PROVISIONING_ENCRYPTION_KEY: ${{ secrets.PROVISION_ENCRYPTION_PWD }} # gpg๋ก ํ์ผ ์ํธํํ ๋ ์ฌ์ฉํ ์ํธ |
| 29 | + |
| 30 | + # certification export key |
| 31 | + CERT_EXPORT_KEY: ${{ secrets.CERT_EXPORT_PWD }} |
| 32 | + |
| 33 | + KEYCHAIN: ${{ 'test.keychain' }} |
| 34 | + |
| 35 | + steps: |
| 36 | + - name: Checkout Repository # ์ ์ฅ์ ์ฝ๋ ์ฒดํฌ์์ |
| 37 | + uses: actions/checkout@v4 |
| 38 | + |
| 39 | + - name: ๐ ๏ธ Set up Xcode # Xcode 16.2 ์ ํ |
| 40 | + run: sudo xcode-select -s /Applications/Xcode_16.2.app |
| 41 | + |
| 42 | + - name: ๐ Configure Keychain # ํค์ฒด์ธ ์ด๊ธฐํ -> ์์ ํค์ฒด์ธ ์์ฑ |
| 43 | + run: | |
| 44 | + security create-keychain -p "" "$KEYCHAIN" |
| 45 | + security list-keychains -s "$KEYCHAIN" |
| 46 | + security default-keychain -s "$KEYCHAIN" |
| 47 | + security unlock-keychain -p "" "$KEYCHAIN" |
| 48 | + security set-keychain-settings |
| 49 | +
|
| 50 | + - name : ยฉ๏ธ Configure Code Signing |
| 51 | + run: | |
| 52 | + # certificate ๋ณตํธํ |
| 53 | + gpg -d -o "$DECRYPTED_CERT_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERT_ENCRYPTION_KEY" "$ENCRYPTED_CERT_FILE_PATH" |
| 54 | + |
| 55 | + # provisioning ๋ณตํธํ |
| 56 | + gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROVISIONING_ENCRYPTION_KEY" "$ENCRYPTED_PROVISION_FILE_PATH" |
| 57 | + |
| 58 | + # security๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์์ ๊ฐ์ธ ํค๋ฅผ ์๋ก ๋ง๋ ํค ์ฒด์ธ์ผ๋ก ๊ฐ์ ธ์ด |
| 59 | + security import "$DECRYPTED_CERT_FILE_PATH" -k "$KEYCHAIN" -P "$CERT_EXPORT_KEY" -A |
| 60 | + security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN" |
| 61 | + |
| 62 | + # Xcode์์ ์ฐพ์ ์ ์๋ ํ๋ก๋น์ ๋ ํ๋กํ ์ค์นํ๊ธฐ ์ํด ์ฐ์ ํ๋ก๋น์ ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑ |
| 63 | + mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles" |
| 64 | + |
| 65 | + # ๋๋ฒ๊น
์ฉ echo ๋ช
๋ น์ด |
| 66 | + echo `ls .github/secrets/*.mobileprovision` |
| 67 | + # ๋ชจ๋ ํ๋ก๋น์ ๋ ํ๋กํ์ผ์ rename ํ๊ณ ์์์ ๋ง๋ ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌํ๋ ๊ณผ์ |
| 68 | + for PROVISION in `ls .github/secrets/*.mobileprovision` |
| 69 | + do |
| 70 | + UUID=`/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i ./$PROVISION)` |
| 71 | + cp "./$PROVISION" "$HOME/Library/MobileDevice/Provisioning Profiles/$UUID.mobileprovision" |
| 72 | + done |
| 73 | + |
| 74 | + - name: โฌ๏ธ Archive app # ๋น๋ ๋ฐ ์์นด์ด๋ธ |
| 75 | + run: | |
| 76 | + xcodebuild clean archive -project $XC_PROJECT -scheme $XC_SCHEME -configuration release -archivePath $XC_ARCHIVE |
| 77 | + |
| 78 | + - name: โฌ๏ธ Export app # export ๋ฅผ ํตํด ipa ํ์ผ ๋ง๋ฆ |
| 79 | + run: | |
| 80 | + xcodebuild -exportArchive -archivePath $XC_ARCHIVE -exportOptionsPlist ExportOptions.plist -exportPath . -allowProvisioningUpdates |
| 81 | + |
| 82 | + - name: ๐ Upload app to TestFlight # TestFlight์ ์์นด์ด๋ธ๋ ์ฑ ๋ฑ๋ก |
| 83 | + uses: apple-actions/upload-testflight-build@v1 |
| 84 | + with: |
| 85 | + app-path: '${{ env.PROJECT_NAME }}.ipa' |
| 86 | + issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }} |
| 87 | + api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }} |
| 88 | + api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }} |
0 commit comments