์๋ ํ์ธ์~
์ค๋์ Github Action์ผ๋ก TestFlight์ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ง๋ฌด๋ฆฌ ํฌ์คํ ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค : )
[ ์ผ๋จ ์ง๋ ํฌ์คํ - ์ฌ์ ์ค๋น ]
yml ํ์ผ ์์
- Github ๋ด์์ ์์ ์ ํ์ ๋ ๋๊ณ .github/workflows์ ๊ฐ์๋ฉด [์ ํ์ จ๋ ์ด๋ฆ].yml ๊ณผ ๊ฐ์ด ํด๋น ํ์ผ์ด ์กด์ฌํ๋ ์์ ํ์๋ฉด ๋ฉ๋๋ค.
- ๊ธฐ์กด์ ์์ฑํ์ จ๋ yml ํ์ผ์ด ์ ํฌ์คํ ์ ๋ณด์ จ๋ค๋ฉด ์ด๋ ๊ฒ ์ ๋ฆฌ๋์ด ์์ ๊ฑฐ์์.
# Actions ํญ์ ํ์๋ Workflow ์ด๋ฆ
name: CI
# Workflow๋ฅผ ์คํ์ํค๊ธฐ ์ํ Event ๋ชฉ๋ก
on: # ํธ๋ฆฌ๊ฑฐ
# ํ๋จ ์ฝ๋์ ๋ฐ๋ผ develop ๋ธ๋์น์ Push ๋๋ Pull Request ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์ Workflow๊ฐ ์คํ
push:
branches: [main]
# ํน์ ํ Branch์ ํธ์ฌ๋์์ ๋ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ๋ น feature/*๋ก ์์ฑํ๋ฉด ๋จ
pull_request:
branches: [main]
# ํด๋น ์ต์
์ ํตํด Actions ํญ์์ Workflow๋ฅผ ์คํ
workflow_dispatch:
# Workflow์ ํ๋ ์ด์์ Job
jobs:
# Job ์ด๋ฆ์ผ๋ก, build๋ผ๋ ์ด๋ฆ์ผ๋ก Job์ด ํ์
build:
# Runner๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์ ์
runs-on: macos-latest # iOS์ ๊ฒฝ์ฐ, ๋น์ฐํ macOS์์ ์คํํด์ผ๊ฒ ์ฅฌ~
# build Job ๋ด์ step ๋ชฉ๋ก
steps:
# uses ํค์๋๋ฅผ ํตํด Action์ ๋ถ๋ฌ์ด
# ์ฌ๊ธฐ์์๋ ํด๋น ๋ ํฌ์งํ ๋ฆฌ๋ก check-out ๋ฐ ๋ ํฌ์งํ ๋ฆฌ์ ์ ๊ทผํ ์ ์๋ Action์ ๋ถ๋ฌ์ด.
- uses: actions/checkout@v2
# ์คํ๋๋ ์ปค๋งจ๋์ ๋ํ ์ค๋ช
์ผ๋ก, Workflow์ ํ์
- name: Build
run: echo Hello, world!
# ํ๋์ ์ปค๋งจ๋๊ฐ ์๋ ์ฌ๋ฌ ์ปค๋งจ๋๋ ์คํ ๊ฐ๋ฅ
- name: Run tests
run: |
# Xcodebuild๋ฅผ ํตํด์ ํด๋น ํ๋ก์ ํธ๋ฅผ ํ
์คํธ ํ ์ ์์ต๋๋ค!
xcodebuild test -project "$XC_PROJECT" -scheme "$XC_SCHEME" -destination 'platform=iOS Simulator,name=iPhone 13'
# uses: Repository์ ์ฝ๋ ๋ณต์ฌ๋ณธ์ ๋ง๋๋ ๋ช
๋ น์ด
# name: ์์
์ ์ด๋ฆ
# run: ์ปดํ์ผ๋ฌ๋ก ๋น๋ํ๋ ๋ช
๋ น์ด
์ด์ ์ง๋ ํฌ์คํ ์์ ์ค๋นํ๋ ํ์ผ๋ค์ ์คํฌ๋ฆฝํธ ์์ ๋ฃ์ด์ฃผ๋ฉด ๋ง๋ฌด๋ฆฌ๊ฐ ๋ฉ๋๋ค.
์ ํฌ๊ฐ ์ค๋นํ๋ ํ์ผ๋ค์๋
DistributionCertificate, Distribution Provisioning Profile ์ด ์๊ณ
Password๊ฐ ์ ์ฅ๋ ํ๊ฒฝ ๋ณ์๋ค ( secrets ) ์ด ์์์ฃ .
1. ๊ธฐ๋ณธ ์ธํ
name: TID Automation release
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: macos-latest
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋์ ๋๋ค.
๊ฐ๋จํ๊ฒ ์์๋ณด๊ณ ์ง๋๊ฐ๋ณผ๊ฒ์.
ํด๋น Action์ ์ด๋ฆ์ ์ ํ๊ณ
on ์ ํธ๋ฆฌ๊ฑฐ ์ญํ ์ ํ๋ค๊ณ ํ์์ฃ ?
๋ฐ๋ผ์ main์ด๋ผ๋ branch์ Push ๋์์ ๋
ํน์ main์ด๋ผ๋ branch์ PR์ด ์์ ๋
๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ํด๋น Action์ด ์คํ๋๋ค๋ ๋ป์ ๋๋ค.
๊ฐ์ธ ์ฑ์์๋ ํ์ฌ [main] branch๋ฅผ release๋ก ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋์ต๋๋ค.
์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๊ณ ๊ณ์๋ ๋ฐฐํฌ์ฉ ๋ธ๋์น์ ์ ์ฉํ์๋ฉด ๋ ๊ฒ ๊ฐ๋ค์ : )
2. ๊ฐ์ ํ๊ฒฝ ์ค์
env: # ๊ฐ์ํ๊ฒฝ
XC_VERSION: ${{ '13.1' }}
XC_PROJECT: ${{ 'usket_TID.xcodeproj' }}
XC_SCHEME: ${{ 'usket_TID' }}
XC_ARCHIVE_PATH: ${{ 'usket_TID.xcarchive' }}
KEYCHAIN: ${{ 'usket.keychain' }}
ENCRYPTED_CERTS_FILE_PATH: ${{ '.github/secrets/GithubActionKey.p12.gpg' }}
DECRYPTED_CERTS_FILE_PATH: ${{ '.github/secrets/GithubActionKey.p12' }} # ์ด๋์ ๋ณตํธํ ํ ๊ฒ์ธ์ง ๋ช
์
ENCRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/GithubAction.mobileprovision.gpg' }}
DECRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/GithubAction.mobileprovision' }} # ์ด๋์ ๋ณตํธํ ํ ๊ฒ์ธ์ง ๋ช
์
CERTS_EXPORT_PWD: ${{ secrets.CERTS_EXPORT_PWD }}
CERTS_ENCRYPTION_PWD: ${{ secrets.CERTS_ENCRYPTO_PWD }}
PROFILES_ENCRYPTO_PWD: ${{ secrets.PROFILES_ENCRYPTO_PWD }}
์ฌ๊ธฐ์๋ ๊ฐ์ ๋จธ์ ์์ ์คํํ ๋ ํ์ํ Xcode ๋ฐ ๊ธฐ์กด์ ์์ฑํ๋ ํค์ฒด์ธ๊ณผ ํ๊ฒฝ๋ณ์ ๋ฑ์ ์ค์ ํด ์ค๋๋ค.
XC๋ก ์์ํ๋ Xcode์ ๊ดํ ์ค์ ๋ค์ด ์๊ณ
KEYCHAIN๊ณผ ๊ธฐ์กด์ ์ํธํํด ๋์๋ ํจ์ค์๋๋ค์ ๋ฑ๋กํ๋ ๋จ๊ณ์ ๋๋ค.
3. Step ( ๊ฐ์ ํ๊ฒฝ์์ ๋์ )
์ผ๋จ ์ฝ๋ ์ ๋ฌธ๋ถํฐ ๋ณด์ฌ๋๋ฆฌ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
steps:
- name: Setting checkout
uses: actions/checkout@v3
- name: Select Xcode Version
run: "sudo xcode-select -s /Applications/Xcode_$XC_VERSION.app"
- 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 -lut 1200
security list-keychains
- name : Configure Code Signing
run: |
gpg -d -o "$DECRYPTED_CERTS_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERTS_ENCRYPTION_PWD" "$ENCRYPTED_CERTS_FILE_PATH"
gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROFILES_ENCRYPTO_PWD" "$ENCRYPTED_PROVISION_FILE_PATH"
security import "$DECRYPTED_CERTS_FILE_PATH" -k "$KEYCHAIN" -P "$CERTS_EXPORT_PWD" -A
security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN"
mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
echo `ls .github/secrets/*.mobileprovision`
# ํ๋กํ์ผ๋ค์ renameํ๊ณ ์๋ก๋ง๋ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌ
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
- name: Archive App
working-directory: usket_TID
run: |
xcodebuild clean archive -project "$XC_PROJECT" -scheme "$XC_SCHEME" -configuration release -archivePath "$XC_ARCHIVE_PATH"
- name: Export App
working-directory: usket_TID
run: |
xcodebuild -exportArchive -archivePath "$XC_ARCHIVE_PATH" -exportOptionsPlist ExportOptions.plist -exportPath . -allowProvisioningUpdates
ls
# ์๋ ์ฌ์ฉํด์ผํ๋ Github Action ์คํ์์ค
# - name: Upload app to TestFlight
# uses: apple-actions/upload-testflight-build@v1
# with:
# app-path: 'usket_TID.ipa'
# issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
# api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }}
# api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
- name: Install private API key P8
env:
APPSTORE_API_PRIVATE_KEY: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
APPSTORE_API_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }}
run: |
mkdir -p ~/private_keys
echo -n "$APPSTORE_API_PRIVATE_KEY" | base64 --decode --output ~/private_keys/AuthKey_$APPSTORE_API_KEY_ID.p8
ls
- name: Upload app to TestFlight
env:
APPSTORE_API_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }}
run: |
cd usket_TID
ls
xcrun altool --output-format xml --upload-app -f usket_TID.ipa -t ios --apiKey $APPSTORE_API_KEY_ID --apiIssuer ${{ secrets.APPSTORE_ISSUER_ID }}
์ด์ ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(1) Github Action - checkout
- name: Setting checkout
uses: actions/checkout@v3
Github Action์์ ์ ๊ณตํ๋ checkout์ ์ด์ฉํด ํ์ ์์ ๋ค์ ์งํํ ์์ ์ด๊ธฐ ๋๋ฌธ์ ํ์์ ์ผ๋ก ๋ค์ด๊ฐ์ผ ํฉ๋๋ค.
(2) Xcode ์ค์
- name: Select Xcode Version
run: "sudo xcode-select -s /Applications/Xcode_$XC_VERSION.app"
์์ ๋ง๋ค์ด๋๋ ๋ณ์๋ฅผ ๋ฃ์ด ํด๋น ๋ฒ์ ์ Xcode๋ฅผ ์ ํํฉ๋๋ค.
(3) ํค์ฒด์ธ ์ค์
- 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 -lut 1200
security list-keychains
ํค์ฒด์ธ์ ์์ฑํ๊ณ ๊ธฐ์กด์ ๋ณ์์ ๋ฃ์ด์ฃผ๋ ์์ ์ ๋๋ค.
์ฌ๊ธฐ์ security set-keychain-settings -lut 1200
์ด ์ปค๋งจ๋๋ ํค์ฒด์ธ์ ์ ํ์๊ฐ์ ๋งํ๋๋ฐ ์ ๋ 1200์ด๋ก ์ค์ ํด ๋์์ต๋๋ค.
์ฌ๋ฌ๋ถ๋ค๋ ์ผ๋จ ์งํํด ๋ณด๊ณ ํ์์์์ด ๋๋ค๋ฉด ์ํ๋ ์๊ฐ๋งํผ ์ ํ์๊ฐ์ ๋๋ ค์ฃผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
(4) Signing
- name : Configure Code Signing
run: |
gpg -d -o "$DECRYPTED_CERTS_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERTS_ENCRYPTION_PWD" "$ENCRYPTED_CERTS_FILE_PATH"
gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROFILES_ENCRYPTO_PWD" "$ENCRYPTED_PROVISION_FILE_PATH"
security import "$DECRYPTED_CERTS_FILE_PATH" -k "$KEYCHAIN" -P "$CERTS_EXPORT_PWD" -A
security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN"
mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
echo `ls .github/secrets/*.mobileprovision`
# ํ๋กํ์ผ๋ค์ renameํ๊ณ ์๋ก๋ง๋ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌ
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
๊ธฐ์กด์ GnuGP ๋ณด์ ์ค๋ฃจ์ ์ ์ด์ฉํด gpg๋ผ๋ ์ปค๋งจ๋๋ก ์ํธํํ๋ ๊ฒ ๊ธฐ์ตํ์๋์?
gpg -d๋ dectypt๋ก ์ ํฌ๊ฐ ์ค์ ํด ๋ Path๋ก๋ถํฐ ์ํธ๋ฅผ ๋ฐ์ ๋์ฝ๋ํ์ฌ ์ ์ฉํด ์ค๋๋ค.
๋๋จธ์ง ๋ถ๋ถ์ ์์ ์ํธ๋ค์ ์ด์ฉํด ํค์ฒด์ธ์ ์์ฑํ๊ณ ๋๋ ํฐ๋ฆฌ์ ๋ณต์ฌํด ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
(5) ์์นด์ด๋ธ ๋ฐ ipaํ์ผ ๋ง๋ค๊ธฐ
โป ipa๋ iOS ์ฑ ํ์ผ์ ๋งํฉ๋๋ค.
- name: Archive App
working-directory: usket_TID
run: |
xcodebuild clean archive -project "$XC_PROJECT" -scheme "$XC_SCHEME" -configuration release -archivePath "$XC_ARCHIVE_PATH"
- name: Export App
working-directory: usket_TID
run: |
xcodebuild -exportArchive -archivePath "$XC_ARCHIVE_PATH" -exportOptionsPlist ExportOptions.plist -exportPath . -allowProvisioningUpdates
ls
์ฌ๊ธฐ์ ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ working-directory๋ฅผ ์ ์ด์คฌ๋๋ฐ
Github์ ํ๋ก์ ํธ ํด๋์ ์์ ํด๋์ git์ ์ด๊ธฐํํ๋ ์ค์ ๋๋ฌธ์ ์ ์ด์คฌ์ต๋๋ค.
์ด ๋ถ๋ถ์ ์ ์ง ์์๋ ๊ด์ฐฎ์์ : )
์ด์ ์์นด์ด๋น์ ์งํํ๊ณ ์์นด์ด๋ธ์์ ipaํ์ผ์ ExportOptions.plist๋ฅผ ์ด์ฉํด ๋ง๋ค์ด์ค๋๋ค.
(6) TestFlight
์ ๋ ์ด ๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ๋์ 130๋ฒ ์ ๋ Action์ ๋๋ ค๊ฐ๋ฉด์ ์ค๋ฅ๋ฅผ ์ฐพ๊ณ ํด๊ฒฐํ์ต๋๋ค : (
์ผ๋จ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ณด์๊ณ ์๋๋ค ์ถ๊ฑฐ๋ ์ ์ ๊ฐ์ ์ค๋ฅ๊ฐ ์๋ค๋ฉด ์ฌ์ฉํด ๋ณด์ธ์!
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ, Github Action ์คํ์์ค ์ฌ์ฉํ๊ธฐ
์ฝ๋ ์ ๋ฌธ์ ๋ณด๋ฉด ์ฃผ์ ์ฒ๋ฆฌ๋ ๋ถ๋ถ์ด ์๋ ๊ฒ์ ํ์ธํ์ จ์ ํ ๋ฐ
๋ฐ๋ก ๊ทธ ์ฃผ์ ๋ถ๋ถ์ ์ฌ์ฉํ๋ ๊ฒ๋๋ค.
- name: Upload app to TestFlight
uses: apple-actions/upload-testflight-build@v1
with:
app-path: 'usket_TID.ipa'
issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }}
api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
๋ง๋ค์ด๋ ipaํ์ผ์ ๊ฒฝ๋ก ๋ฐ ์ ์ ํจ๊ป ์ค์ ํ๋ ๋ณ์๋ฅผ ์ง์ ํด์ ๋๋ ค์ฃผ๋ฉด ๋ฐ๋ก ๋ฑ๋ก์ด ๋์ค ๊ฑฐ์์.
๋ง์ฝ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋์จ๋ค๋ฉด
The file 'AuthKey_***.p8' could not be found in any of these locations
์ ๊ฐ ๊ฒช์๋ ์ค๋ฅ๋ ๊ฐ์ ์ค๋ฅ์ ๋๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ, ์ ๊ฐ ๋ง๋ค๊ฒ์.
์ด๊ธฐ์ ์ค๋ฅ ๋ฉ์ธ์ง์ ๊ด๋ จ๋ ๋ด์ฉ์ ํ์ํ๋ค ๋ณด๋
Xcode 13 ์ด์๋ถํฐ ๋ฐ๊ฒฌ๋๋ ์ด์์ธ ๊ฒ ๊ฐ๋ค๋ ๋ด์ฉ์ด ์์ด
Xcode์ ๋ฒ์ ์ ๋ณ๊ฒฝํด๋ดค์ง๋ง ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก Action ์์ฒด์ ๋น๋ ๋ฒ์ ์ ๋ฌธ์ ์์์๋ ์๋ค๋ ๊ธ์ด ์์ด
๋ฒ์ ์ ๋ณ๊ฒฝํด๊ฐ๋ฉฐ ์๋ํ์ง๋ง ์์ฝ๊ฒ๋ ์ด๋ํ ๋์ํ์ง ์์์ต๋๋ค.
p8์ด ๋ญ์ง๋ถํฐ ๋ค์ ์์๋ดค์ต๋๋ค.
p8์ ์ ํ ๊ฐ๋ฐ์ ๊ณ์ ์์ ๋ค์ด๋ก๋ํด ์จ ๋น๊ณต๊ฐ ํค๋ฅผ ๋งํ๋ ๊ฒ์ด์๊ณ
action์์๋ ์ด๋ฅผ ์ด์ฉํด ๊ฐ์ํ๊ฒฝ์์ ์ฑ์คํ ์ด ์ปค๋ฅํธ API๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
์ฆ, ์ ๋ ฅํ๋ ํ๊ฒฝ๋ณ์๊ฐ ์๋ชป๋์์ ๊ฐ๋ฅ์ฑ์ด ์์์ต๋๋ค. (APPSTORE_API_PRIVATE_KEY)
์ด๋ฐ ์ ๋ฐ ํ๋ฐ์ง ๋์ค
์ฐธ๊ณ ํ๋ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ์์ ์งํํ๋ base64 ์ธ์ฝ๋ฉ์ด ๊ธฐ์ต์ด ๋ฌ๊ณ
์ด๊ฒ์ด ๋ฌธ์ ์ ์์ธ์ผ ๊ฒ์ด๋ผ๋ ํ์ ์ด ๋ค์์ต๋๋ค.
์ธ์ฝ๋ฉ๋ ํค๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ์์์ผ๋ฉฐ ๊ฒฝ๋ก๋ ์์ฑํ์ง ์์๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค.
๊ฒฐ๊ตญ ์ถ๊ฐ์ ์ธ ์คํฌ๋ฆฝํธ ์์ฑ์ด ํ์ํ์ต๋๋ค.
์ถ๊ฐํ ์คํฌ๋ฆฝํธ๋ ์๋์ ๊ฐ์ต๋๋ค.
- name: Install private API key P8
env:
APPSTORE_API_PRIVATE_KEY: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
APPSTORE_API_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }}
run: |
mkdir -p ~/private_keys
echo -n "$APPSTORE_API_PRIVATE_KEY" | base64 --decode --output ~/private_keys/AuthKey_$APPSTORE_API_KEY_ID.p8
- name: Upload app to TestFlight
env:
APPSTORE_API_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }}
run: |
cd usket_TID
xcrun altool --output-format xml --upload-app -f usket_TID.ipa -t ios --apiKey $APPSTORE_API_KEY_ID --apiIssuer ${{ secrets.APPSTORE_ISSUER_ID }}
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ base64๋ก ๋์ฝ๋ฉํ์ฌ ์ ์ฅํ ์ดํ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๊ณผ์ ์ ์งํํ๊ณ ๋๋ ๋๋์ด TestFlight์ ์ฑ๊ณต์ ์ผ๋ก ์ ๋ก๋๊ฐ ๋์์ต๋๋ค : - )
์ถํ์๋ ํ ์คํธ๊น์ง ์งํํ๋ ํฌ์คํ ์ผ๋ก ์ฐพ์๋ต๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป ๐๐ป