์ด๋ฒ ๊ธ์์๋ Plarium Krasnodar ์คํ๋์ค๊ฐ CI/CD๋ฅผ ๋๋ฒ๊น ํ๋ ๊ณผ์ ์์ ์์์จ iOS ์ ํ๋ฆฌ์ผ์ด์ ์ ์กฐ๋ฆฝํ๊ณ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ ๊ฒฝํ์ ๊ณต์ ํฉ๋๋ค.
ํ๋ จ
์ด๋ค ์์ผ๋ก๋ Apple ์ฅ์น์ฉ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๋ ๋ชจ๋ ์ฌ๋์ ์ด๋ฏธ ๋ ผ์์ ์ฌ์ง๊ฐ ์๋ ์ธํ๋ผ์ ํธ๋ฆฌํจ์ ๋์ด ํ๊ฐํ์ต๋๋ค. ๊ฐ๋ฐ์ ํ๋กํ ๋ฉ๋ด๋ถํฐ ๋๋ฒ๊ทธ ๋ฐ ๋น๋ ๋๊ตฌ๊น์ง ๋ชจ๋ ๊ณณ์์ ์ด๋ ค์์ด ๋ฐ๊ฒฌ๋ฉ๋๋ค.
์ธํฐ๋ท์๋ "๊ธฐ๋ณธ"์ ๊ดํ ๊ธฐ์ฌ๊ฐ ๋ง์ด ์์ผ๋ฏ๋ก ์ฃผ์ ๋ด์ฉ์ ๊ฐ์กฐํ๊ฒ ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๊ณต์ ์ผ๋ก ๋น๋ํ๋ ๋ฐ ํ์ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ๋ฐ์ ๊ณ์ ;- ๋น๋ ์๋ฒ ์ญํ ์ ํ๋ macOS ๊ธฐ๋ฐ ์ฅ์น
- ์์ฑ๋จ
๊ฐ๋ฐ์ ์ธ์ฆ์ , ์ด๋ ์ ์ฒญ์์ ์๋ช ํ๋ ๋ฐ ์ถ๊ฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค. - ๊ณ ์ ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์์ต๋๋ค.
ID (์์ผ๋์นด๋ ID๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๋ จ ๋๋ฉ์ธ, ํธ์ ์๋ฆผ, Apple ๋ก๊ทธ์ธ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ฒ๋ค ์๋ณ์์ ์ค์์ฑ์ ์ ์ํด์ผ ํฉ๋๋ค.) ํ๋กํ ์์ฉ ํ๋ก๊ทธ๋จ ์๋ช .
๊ฐ๋ฐ์ ์ธ์ฆ์๋ ๋ชจ๋ macOS ์ฅ์น์์ ํค์ฒด์ธ์ ํตํด ์์ฑ๋์ด์ผ ํฉ๋๋ค. ์ธ์ฆ์ ์ ํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ(๊ฐ๋ฐ, QA, ์คํ ์ด์ง, ํ๋ก๋์ )์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์๋ช ํ๋กํ ์ ํ๋ ๋ฌ๋ผ์ง๋ฉฐ(๊ฐ๋ฐ ๋๋ ๋ฐฐํฌ)๋ ๋ฌ๋ผ์ง๋๋ค.
์ฃผ์ ํ๋กํ ์ ํ:
- ๊ฐ๋ฐ - ๊ฐ๋ฐํ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ช ์ ์ํด ๊ฐ๋ฐ ์ธ์ฆ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค(์ ํ ์ด๋ฆ iPhone ๊ฐ๋ฐ์: XXXXX).
- ์์ - ํ ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์๋ช ๋ฐ QA ๋ถ์์ ๋ด๋ถ ํ์ธ์ ์ํด ๊ฐ๋ฐ์์ ๋ฐฐํฌ ์ธ์ฆ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค(์ ํ ์ด๋ฆ iPhone ๋ฐฐํฌ: XXXXX).
- App Store - TestFlight๋ฅผ ํตํ ์ธ๋ถ ํ ์คํธ ๋ฐ App Store์ ์ ๋ก๋๋ฅผ ์ํ ๋ฆด๋ฆฌ์ค ๋น๋, ๊ฐ๋ฐ์์ ๋ฐฐํฌ ์ธ์ฆ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ๋ฐ ๋ฐ ์์ ํ๋กํ์ ์์ฑํ ๋์๋ ํ์๋ฉ๋๋ค.
๋ช ํ์ฑ์ ์ํด ๊ฐ๋ฐ์ ํ๋กํ์ ์๋ ํ ํ์์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์กฐ๋ฆฝ์ ํ์ํ ๋งค๊ฐ๋ณ์์ ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ด๋์ ๊ฐ์ ธ์ฌ ์ ์๋์ง ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
์กฐ๋ฆฝ
ํ๋ก์ ํธ ๋ฐ ํ๊ฒฝ๋ณ๋ก ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ถ๋ฆฌํ ์ ์๋๋ก ๋ค์๊ณผ ๊ฐ์ ํ๋กํ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ${ProjectName}_${Instance}
, ์ฆ ํ๋ก์ ํธ ์ด๋ฆ + ์ธ์คํด์ค(์ ํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฆ: Dev, QA, GD, Staging, Live ๋ฑ)
๋น๋ ์๋ฒ๋ก ๊ฐ์ ธ์ค๋ฉด ํ๋กํ ์ด๋ฆ์ด ๊ณ ์ ID๋ก ๋ณ๊ฒฝ๋๊ณ ํด๋น ํด๋๋ก ์ด๋๋ฉ๋๋ค. /Users/$Username/Library/MobileDevice/Provisioning Profiles
(์ด๋ $Username
๋น๋ ์๋ฒ์ ์ฌ์ฉ์ ๊ณ์ ์ด๋ฆ์ ํด๋นํฉ๋๋ค).
*.ipa ํ์ผ์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฑฐ์(PackageApplication)์ ์ต์ (XcAchive ์์ฑ ๋ฐ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํตํด)์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ฒ์ 8.3๋ถํฐ ์ฑ ํ์ผ ํจํค์ง ๋ชจ๋์ด Xcode ๋ฐฐํฌํ์์ ์ ๊ฑฐ๋์๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด์ Xcode(๋ฒ์ 8.2 ์ดํ)์ ๋ชจ๋์ ๋ค์ ํด๋์ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
๊ทธ๋ฐ ๋ค์ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*
๋ค์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ *.app ํ์ผ์ ์์งํด์ผ ํฉ๋๋ค.
xcodebuild
-workspace $ProjectDir/$ProjectName.xcworkspace
-scheme $SchemeName
-sdk iphoneos
build
-configuration Release
-derivedDataPath build
CODE_SIGN_IDENTITY=โ$DevAccNameโ
PROVISIONING_PROFILE=โ$ProfileIdโ
DEPLOYMENT_POSTPROCESSING=YES
SKIP_INSTALL=YES
ENABLE_BITCODE=NO
์ฅ์ :
-workspace
โ ํ๋ก์ ํธ ํ์ผ์ ๊ฒฝ๋ก์
๋๋ค.
-scheme
โ ํ๋ก์ ํธ์ ์ง์ ๋ ์ฌ์ฉ๋ ๊ตฌ์ฑํ.
-derivedDataPath
โ ์กฐ๋ฆฝ๋ ์ ํ๋ฆฌ์ผ์ด์
(*.app)์ ๋ค์ด๋ก๋ํ๊ธฐ ์ํ ๊ฒฝ๋ก์
๋๋ค.
CODE_SIGN_IDENTITY
โ ํค์ฒด์ธ์์ ํ์ธํ ์ ์๋ ๊ฐ๋ฐ์ ๊ณ์ ์ ์ด๋ฆ(iPhone ๊ฐ๋ฐ์: XXXX XXXXXXX, ๊ดํธ ์์ TeamID ์์).
PROVISIONING_PROFILE
โ ๋ค์ ๋ช
๋ น์ผ๋ก ์ป์ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ช
์ฉ ํ๋กํ ID์
๋๋ค.
cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'
์ ํ๋ฆฌ์ผ์ด์
์ด ์ถ๊ฐ ํ๋กํ(์: ํธ์ ์๋ฆผ์ฉ)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋์ PROVISIONING_PROFILE
๋ํ๋ด๋ค:
APP_PROFILE=โ$AppProfileโ
EXTENSION_PROFILE=โ$ExtProfileโ
๋ค์์ผ๋ก ๊ฒฐ๊ณผ *.app ํ์ผ์ *.ipa๋ก ํจํค์งํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
/usr/bin/xcrun --sdk iphoneos PackageApplication
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app")
-o "$ProjectDir/$ProjectName_$Instance.ipa"
๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ์ Apple์ ๊ด์ ์์ ๋ณผ ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์นด์ด๋ธ์์ ๋ด๋ณด๋ด์ด *.ipa๋ฅผ ์ป๋ ๊ฒ์ด ๊ด๋ จ๋ฉ๋๋ค.
๋จผ์ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์์นด์ด๋ธ๋ฅผ ์์งํด์ผ ํฉ๋๋ค.
xcodebuild
-workspace $ProjectDir/$ProjectName.xcworkspace
-scheme $SchemeName
-sdk iphoneos
-configuration Release
archive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
CODE_SIGN_IDENTITY=โ$DevAccNameโ
PROVISIONING_PROFILE=โ$ProfileIdโ
ENABLE_BITCODE=NO
SYNCHRONOUS_SYMBOL_PROCESSING=FALSE
์ฐจ์ด์ ์ ์กฐ๋ฆฝ๋ฐฉ๋ฒ๊ณผ ์ต์
์ ์์ต๋๋ค SYNCHRONOUS_SYMBOL_PROCESSING
, ๋น๋ ์ ๊ธฐํธ ์ธ๋ก๋๋ฅผ ๋นํ์ฑํํฉ๋๋ค.
๋ค์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ ์ค์ ์ด ํฌํจ๋ ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค.
ExportSettings="$ProjectDir/exportOptions.plist"
cat << EOF > $ExportSettings
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<false/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
<key>method</key>
<string>$Method</string>
<key>provisioningProfiles</key>
<dict>
<key>$BundleID</key>
<string>$ProfileId</string>
</dict>
<key>signingCertificate</key>
<string>$DevAccName</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>$TeamID</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
EOF
์ฅ์ :
$Method
โ ์ ๋ฌ ๋ฐฉ๋ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ ์๋ช
ํ๋กํ ์ ํ์ ํด๋นํฉ๋๋ค. ์ฆ, Development์ ๊ฒฝ์ฐ ๊ฐ์ development์ด๊ณ Ad Hoc์ ๊ฒฝ์ฐ ์์, App Store์ ๊ฒฝ์ฐ app-store์
๋๋ค.
$BundleID
โ ์ ํ๋ฆฌ์ผ์ด์
์ค์ ์ ์ง์ ๋ ์ ํ๋ฆฌ์ผ์ด์
ID์
๋๋ค. ๋ค์ ๋ช
๋ น์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
defaults read $ProjectDir/Info CFBundleIdentifier
$DevAccName ะธ $ProfileId
โ ์ด์ ์ ์ฌ์ฉ๋ ๊ฐ๋ฐ์ ์ด๋ฆ ๋ฐ ์๋ช
ํ๋กํ ID ์ค์ ์ ๋ด๋ณด๋ด๊ธฐ ์ค์ ์ ๊ฐ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
$TeamID
โ ๊ฐ๋ฐ์ ์ด๋ฆ ๋ค ๊ดํธ ์์ XNUMX์๋ฆฌ ID, ์: iPhone ๊ฐ๋ฐ์: โฆโฆ (XXXXXXXXX); ํค์ฒด์ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๋ค์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ํ *.ipa ํ์ผ์ ์ป์ต๋๋ค.
xcodebuild
-exportArchive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
-exportPath $ProjectDir
-exportOptionsPlist $ExportSettings
๋ฐฐ๋ฌ
์ด์ ์์ง๋ ํ์ผ์ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ฆ, ์ฅ์น์ ์ค์นํด์ผ ํฉ๋๋ค.
HockeyApp, AppBlade ๋ฑ ๊ฐ๋ฐ ๋ฐ Ad Hoc ๋น๋ ๋ฐฐํฌ๋ฅผ ์ํ ๋ง์ ์๋น์ค๊ฐ ์์ง๋ง ์ด ๊ธฐ์ฌ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ์ํ ๋ ๋ฆฝ ์คํํ ์๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
iOS์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ค์น๋ 2๋จ๊ณ๋ก ์งํ๋ฉ๋๋ค.
- ํญ๋ชฉ ์๋น์ค๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ค์น ๋งค๋ํ์คํธ๋ฅผ ์์ ํฉ๋๋ค.
- HTTPS๋ฅผ ํตํด ๋งค๋ํ์คํธ์ ์ง์ ๋ ์ ๋ณด์ ๋ฐ๋ผ *.ipa ํ์ผ์ ์ค์นํฉ๋๋ค.
๋ฐ๋ผ์ ๋จผ์ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ค์น ๋งค๋ํ์คํธ(ํ์ผ ํ์ *.plist)๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
cat << EOF > $manifest
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>$ipaUrl</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>$BundleID</string>
<key>bundle-version</key>
<string>$AppVersion</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$ProjectName_$Instance</string>
<key>subtitle</key>
<string>$Instance</string>
</dict>
</dict>
</array>
</dict>
</plist>
EOF
๋ณด์๋ค์ํผ ๋งค๋ํ์คํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ๊ณผ ๊ด๋ จ๋ ๊ฑฐ์ ๋ชจ๋ ๋งค๊ฐ ๋ณ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
๋ฒ์ ($AppVersion
)๋ ๋ค์ ๋ช
๋ น์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
defaults read $ProjectDir/Info CFBundleVersion
๋งค๊ฐ ๋ณ์ $ipaUrl
*.ipa ํ์ผ์ ๋ค์ด๋ก๋ํ ์ ์๋ ์ง์ ๋งํฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. iOS XNUMX ๋ฒ์ ๋ถํฐ๋ HTTPS๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์นํด์ผ ํฉ๋๋ค. ์ฌ๋ ๋ฒ์งธ ๋ฒ์ ์์๋ ๋งค๋ํ์คํธ์ ํ์์ด ์ฝ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์์ด์ฝ์ ๋ํ ์ค์ ์ด ํฌํจ๋ ๋ธ๋ก์
๋๋ค.
<images>
<image>...</image>
</images>
๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์นํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋งํฌ๊ฐ ํฌํจ๋ ๊ฐ๋จํ HTML ํ์ด์ง์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.
itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plist
๊ฐ๋ฐ ๋ฐ ํ ์คํธ ๋ถ์์ ์๊ตฌ์ ๋ง์ถฐ Plarium์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์์ฒด ๋น๋ ์ค์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์์ต๋๋ค.
- ์์จ์ฑ๊ณผ ๋ ๋ฆฝ์ฑ,
- ๋์ ์ผ๋ก ์์ฑ๋ "์์" ๋งํฌ๋ฅผ ํตํ ์ก์ธ์ค ์ ์ด ์ค์ํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์ ์ค์น,
- ํ์ฅ ๊ฐ๋ฅํ ๊ธฐ๋ฅ(์ฆ, ํ์ํ ๊ฒฝ์ฐ ๊ฐ๋ฐ ํ์ด ๋๋ฝ๋ ๊ธฐ๋ฅ์ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ ์ ์์)
ํ ์คํธ
์ด์ ์ฐ๋ฆฌ๋ ๋ค์์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ถ์ ์ ํ
์คํธ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
๋ค์ด๋ก๋๋ฅผ ์ํ ํ์ ์กฐ๊ฑด์ App Store ์๋ช ํ๋กํ ์ ํ๊ณผ ์์ฑ๋ API ํค์ ์กด์ฌ ์ฌ๋ถ์ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ด๋ก๋ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- Xcode(์ฃผ์ต์)๋ฅผ ํตํด,
- ์ํด์ ํตํด,
- ์ด์ ๋ฒ์ ์ Xcode(ํ์ฌ Transporter)์ฉ Application Loader๋ฅผ ํตํด.
์๋ ๋ค์ด๋ก๋์๋ ๋ ๊ฐ์ง ์ธ์ฆ ๋ฐฉ๋ฒ์ด ์๋ altool์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฑ๋ณ ๋น๋ฐ๋ฒํธ,
- API ํค.
API Key๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ด๋ก๋ํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
API ํค๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์์ผ๋ก ์ด๋ํ์ธ์.
๊ทธ๋ฐ ๋ค์ ๋ค์ด๋ก๋ํ ํค๋ฅผ ๋น๋ ์๋ฒ๋ก ๊ฐ์ ธ์ต๋๋ค.
mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/
TestFlight์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ก๋ํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํจ์ฑ์ ๊ฒ์ฌํด์ผ ํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค.
xcrun altool
--validate-app
-t ios
-f $(find "$ProjectDir" -name "*.ipa")
--apiKey โ$KeyIDโ
--apiIssuer โ$IssuerIDโ
ะะดะต apiKey
ะธ apiIssuer
API ํค ์์ฑ ํ์ด์ง์ ํ๋ ๊ฐ์ด ์์ต๋๋ค.
๋ค์์ผ๋ก ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก๋ํฉ๋๋ค. --upload-app
๋์ผํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ XNUMX~XNUMX์ผ ์ด๋ด์ Apple์์ ํ ์คํธํ ํ ์ธ๋ถ ํ ์คํฐ์๊ฒ ์ ๊ณต๋ฉ๋๋ค. ์ค์น ๋งํฌ๊ฐ ์ด๋ฉ์ผ๋ก ์ ์ก๋ฉ๋๋ค.
altool์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ด๋ก๋ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ App-Specific Password๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ฑ๋ณ ๋น๋ฐ๋ฒํธ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์์ผ๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
๋ค์์ผ๋ก ์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ํค์ฒด์ธ์ ๋น๋ ์๋ฒ ๊ธฐ๋ก์ ์์ฑํด์ผ ํฉ๋๋ค. Xcode ๋ฒ์ 11๋ถํฐ๋ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ด ์์
์ ์ํํ ์ ์์ต๋๋ค.
xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd
์ฅ์ :
$DeveloperName
โ Apple ์๋น์ค์ ๋ก๊ทธ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ iOS ๊ฐ๋ฐ์ ๊ณ์ ์ ์ด๋ฆ์
๋๋ค.
$AppPswd
โ ์์ฑ๋ ์ฑ๋ณ ๋น๋ฐ๋ฒํธ.
๋ค์์ผ๋ก asc-provider ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ ๊ฐ์ ธ์ค๊ธฐ ์ฑ๊ณต์ ํ์ธํฉ๋๋ค.
xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"
์ฐ๋ฆฌ๋ ์ถ๋ ฅ์ ์ป์ต๋๋ค:
Provider listing:
- Long Name - - Short Name -
XXXXXXX XXXXXXXXX
๋ณด์๋ค์ํผ, ํ์ ์งง์ ์ด๋ฆ ๊ฐ(asc-provider)์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ์ฌ์ฉํ $TeamID ๋งค๊ฐ๋ณ์์ ์ผ์นํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒ์ฆํ๊ณ TestFlight์ ๋ก๋ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค.
xcrun altool
--(validate|upload)-app
-f $(find "$ProjectDir" -name "*.ipa")
-u "$DeveloperName"
-p "@keychain:Altool"
๋งค๊ฐ๋ณ์ ๊ฐ์ผ๋ก -p
๋น์ ์ ๊ฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค $AppPswd
์ํธํ๋์ง ์์(๋ช
์์ ) ํ์์
๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ์ฑ๋ฅ ๊ด์ ์์ ๋ณผ ๋ altool ์ธ์ฆ์๋ API ํค๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. Xcode์ ๋ค๋ฅธ ๋ฒ์ ์๋ ํน์ ๋ฌธ์ (ํค์ฒด์ธ์ด "๋ณด์ด์ง ์์", ์ ๋ก๋ ์ค ์ธ์ฆ ์ค๋ฅ ๋ฑ)๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค์ ๋ก ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค. ๊ด๋ จ๋ ๋ชจ๋ ๋ถ๋ค์ด App Store์์ ์ฑ๊ณต์ ์ธ ๋น๋์ ๋ฌธ์ ์๋ ์ถ์๋ฅผ ๊ธฐ์ํฉ๋๋ค.
์ถ์ฒ : habr.com