Skip to content

[RELEASE] v1.1.0

[RELEASE] v1.1.0 #32

name: Distribution to TestFlight
on:
pull_request:
branches: [ release/* ]
jobs:
deploy:
name: ๐Ÿš€ Distribution to TestFlight Workflow
runs-on: macos-15 # ์ตœ์‹  macOS 15 ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰
env:
# app archive ๋ฐ export ์— ์“ฐ์ผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
XC_WORKSPACE: Poppool/Poppool.xcworkspace
XC_SCHEME: Poppool
XC_ARCHIVE: Poppool.xcarchive
# certificate
ENCRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/certification.p12.gpg' }}
DECRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/certification.p12' }}
CERT_ENCRYPTION_KEY: ${{ secrets.CERT_ENCRYPTION_PWD }} # gpg๋กœ ํŒŒ์ผ ์•”ํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์•”ํ˜ธ
# provisioning
ENCRYPTED_PROVISION_FILE_PATH: '.github/secrets/PoppoolGitHubAction.mobileprovision.gpg'
DECRYPTED_PROVISION_FILE_PATH: '.github/secrets/PoppoolGitHubAction.mobileprovision'
PROVISIONING_ENCRYPTION_KEY: ${{ secrets.PROVISION_ENCRYPTION_PWD }} # gpg๋กœ ํŒŒ์ผ ์•”ํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์•”ํ˜ธ
# certification export key
CERT_EXPORT_KEY: ${{ secrets.CERT_EXPORT_PWD }}
KEYCHAIN: ${{ 'test.keychain' }}
steps:
- name: Checkout Repository # ์ €์žฅ์†Œ ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
uses: actions/checkout@v4
- name: ๐Ÿ› ๏ธ Set up Xcode # Xcode 16.2 ์„ ํƒ
run: sudo xcode-select -s /Applications/Xcode_16.2.app
- name: "#๏ธโƒฃ Set Build Number" # ์ž๋™ ๋นŒ๋“œ ๋„˜๋ฒ„ ์„ธํŒ…
run: |
BUILD_NUMBER=$(TZ=Asia/Seoul date +%y%m%d.%H%M)
cd Poppool
agvtool new-version -all "$BUILD_NUMBER"
- name: โš™๏ธ Generate xcconfig # ๋นŒ๋“œ์— ํ•„์š”ํ•œ xcconfig ์ƒ์„ฑ
run: |
echo "POPPOOL_BASE_URL=${POPPOOL_BASE_URL}" > Poppool/Poppool/Resource/Debug.xcconfig
echo "POPPOOL_S3_BASE_URL=${POPPOOL_S3_BASE_URL}" >> Poppool/Poppool/Resource/Debug.xcconfig
echo "POPPOOL_API_KEY=${POPPOOL_API_KEY}" >> Poppool/Poppool/Resource/Debug.xcconfig
echo "KAKAO_AUTH_APP_KEY=${KAKAO_AUTH_APP_KEY}" >> Poppool/Poppool/Resource/Debug.xcconfig
echo "NAVER_MAP_CLIENT_ID=${NAVER_MAP_CLIENT_ID}" >> Poppool/Poppool/Resource/Debug.xcconfig
env:
POPPOOL_BASE_URL: ${{ secrets.POPPOOL_BASE_URL }}
POPPOOL_S3_BASE_URL: ${{ secrets.POPPOOL_S3_BASE_URL }}
POPPOOL_API_KEY: ${{ secrets.POPPOOL_API_KEY }}
KAKAO_AUTH_APP_KEY: ${{ secrets.KAKAO_AUTH_APP_KEY }}
NAVER_MAP_CLIENT_ID: ${{ secrets.NAVER_MAP_CLIENT_ID }}
- 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: |
# certificate ๋ณตํ˜ธํ™”
gpg -d -o "$DECRYPTED_CERT_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERT_ENCRYPTION_KEY" "$ENCRYPTED_CERT_FILE_PATH"
# provisioning ๋ณตํ˜ธํ™”
gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROVISIONING_ENCRYPTION_KEY" "$ENCRYPTED_PROVISION_FILE_PATH"
# security๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ์™€ ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“  ํ‚ค ์ฒด์ธ์œผ๋กœ ๊ฐ€์ ธ์˜ด
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"
# Xcode์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํ•„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ํ”„๋กœ๋น„์ €๋‹ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑ
mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
# ๋””๋ฒ„๊น… ์šฉ echo ๋ช…๋ น์–ด
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 # ๋นŒ๋“œ ๋ฐ ์•„์นด์ด๋ธŒ
run: |
xcodebuild clean archive -workspace $XC_WORKSPACE -scheme $XC_SCHEME -configuration release -archivePath $XC_ARCHIVE
- name: โฌ†๏ธ Export app # export ๋ฅผ ํ†ตํ•ด ipa ํŒŒ์ผ ๋งŒ๋“ฆ
run: |
xcodebuild -exportArchive -archivePath $XC_ARCHIVE -exportOptionsPlist .github/secrets/ExportOptions.plist -exportPath . -allowProvisioningUpdates
- name: ๐Ÿš€ Upload app to TestFlight # TestFlight์— ์•„์นด์ด๋ธŒ๋œ ์•ฑ ๋“ฑ๋ก
uses: apple-actions/upload-testflight-build@v1
with:
app-path: 'Poppool.ipa'
issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }}
api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
- name: ๐Ÿ“ฃ Notify to Discord
if: success()
run: |
MARKETING_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" Poppool.xcarchive/Products/Applications/Poppool.app/Info.plist)
BUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" Poppool.xcarchive/Products/Applications/Poppool.app/Info.plist)
curl -H "Content-Type: application/json" \
-X POST \
-d "{
\"embeds\": [
{
\"title\": \"๐Ÿš€ TestFlight ๋ฐฐํฌ ์™„๋ฃŒ\",
\"description\": \"Poppool ์•ฑ์ด ์„ฑ๊ณต์ ์œผ๋กœ TestFlight์— ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!\",
\"color\": 3066993,
\"fields\": [
{
\"name\": \"๐Ÿท๏ธ ๋งˆ์ผ€ํŒ… ๋ฒ„์ „\",
\"value\": \"$MARKETING_VERSION\",
\"inline\": true
},
{
\"name\": \"๐Ÿ› ๏ธ ๋นŒ๋“œ ๋ฒˆํ˜ธ\",
\"value\": \"$BUNDLE_VERSION\",
\"inline\": true
}
],
\"footer\": {
\"text\": \"TestFlight์—์„œ ์œ„ ๋ฒ„์ „์„ ์„ค์น˜ํ•˜์„ธ์š”\"
}
}
]
}" \
${{ secrets.TESTFLIGHT_WEBHOOK_URL }}