๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ”น build

๐Ÿ—๏ธ Capgo Cloud๋ฅผ ํ†ตํ•ด iOS/Android Native Build๋ฅผ ๊ด€๋ฆฌํ•˜์„ธ์š”.

๋นŒ๋“œ ์•ก์„ธ์Šค ๋ฐ ์ถœ๋ ฅ

โ€œ๋นŒ๋“œ ์•ก์„ธ์Šค ๋ฐ ์ถœ๋ ฅโ€ ์„น์…˜

Native cloud builds๋Š” ๋ชจ๋“  Capgo ํ”Œ๋žœ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ธ์ฆ ์ •๋ณด๋Š” Capgo ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋นŒ๋“œ ์‹œ์—๋งŒ ์‚ฌ์šฉ๋œ ํ›„ ์ฆ‰์‹œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ ์„ ํƒ์ ์œผ๋กœ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์žˆ๋Š” ๋‹ค์šด๋กœ๋“œ ๋งํฌ์™€ ํ•จ๊ป˜ uploadํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ ์ •๋ณด ์šฐ์„  ์ €์žฅ

โ€œ์ธ์ฆ ์ •๋ณด ์šฐ์„  ์ €์žฅโ€ ์„น์…˜
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli build credentials save --appId YOUR_APP_ID --platform ios
npx @capgo/cli build credentials save --appId YOUR_APP_ID --platform android

CI์—์„œ ์ถœ๋ ฅ URL ์บก์ฒ˜ํ•˜๊ธฐ

โ€œCI์—์„œ ์ถœ๋ ฅ URL ์บก์ฒ˜ํ•˜๊ธฐโ€ ์„น์…˜

ํ†ต๊ณผ --output-record ๋‹ค์šด๋กœ๋“œ URL๊ณผ QR code์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”: build last-output ์ฝ์œผ๋ ค๋ฉด:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli build request APP_ID --platform android --output-upload --output-record /tmp/build.json
npx @capgo/cli build last-output --path /tmp/build.json --field outputUrl
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build needed

๐Ÿงญ Native Build๊ฐ€ ํ•„์š”ํ•˜๋ฉด โ€œyesโ€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  code 1๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด โ€œnoโ€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  code 0์œผ๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ด ์‹คํŒจํ•˜๋ฉด code 2๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build needed com.example.app --channel production --verbose

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
-astring๊ณ„์ • ์—ฐ๊ฒฐ์„ ์œ„ํ•œ API ํ‚ค
-cstring๋น„๊ต ๋Œ€์ƒ ์ฑ„๋„. ๊ธฐ๋ณธ๊ฐ’์€ CapacitorUpdater.defaultChannel ๋˜๋Š” ๊ณต๊ฐœ ๊ธฐ๋ณธ ์ฑ„๋„์ž…๋‹ˆ๋‹ค.
โ€”package-jsonstring๋ชจ๋…ธ๋ ˆํฌ์šฉ package.json ํŒŒ์ผ ๊ฒฝ๋กœ (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)
โ€”node-modulesstring๋ชจ๋…ธ๋ ˆํฌ์šฉ node_modules ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)
--verboseboolean์ƒ์„ธ ๋กœ๊ทธ๊ฐ€ ํฌํ•จ๋œ verbose ์ถœ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค
--supa-hoststring์ปค์Šคํ…€ Supabase host URL (self-hosting ๋˜๋Š” Capgo ๊ฐœ๋ฐœ์šฉ)
--supa-anonstring์ปค์Šคํ…€ Supabase anon key (self-hosting์šฉ)

๐Ÿš€ Init

๐Ÿš€ Init

๋ณ„์นญ: onboarding

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build init

๋นŒ๋“œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋Œ€ํ™”ํ˜•์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค (iOS: ์ธ์ฆ์„œ ๋ฐ ํ”„๋กœํ•„ ์ž๋™ํ™”; Android: keystore + Google OAuth๋ฅผ ํ†ตํ•ด GCP ์„œ๋น„์Šค ๊ณ„์ • ๋ฐ Play Console ์ดˆ๋Œ€ ๊ถŒํ•œ ๋ถ€์—ฌ)

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
-astring๊ณ„์ • ์—ฐ๊ฒฐ์„ ์œ„ํ•œ API ํ‚ค
-pstring์˜จ๋ณด๋”ฉํ•  ํ”Œ๋žซํผ(ios ๋˜๋Š” android). ์ƒ๋žตํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ํด๋”๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ ์ž๋™ ๊ฐ์ง€ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป์Šต๋‹ˆ๋‹ค.
--supa-hoststring์ปค์Šคํ…€ Supabase host URL (self-hosting ๋˜๋Š” Capgo ๊ฐœ๋ฐœ์šฉ)
โ€”no-analyticsboolean์ด๋ฒˆ ์‹คํ–‰์—์„œ build onboarding analytics์™€ terminal replay๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์š”์ฒญ

๐Ÿ”น Request ์„น์…˜
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build request

Capgo Cloud์— Native Build๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ zip ํŒŒ์ผ๋กœ ์••์ถ•ํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด Capgo์— uploadํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•ฑ ์Šคํ† ์–ด๋กœ ์ง์ ‘ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์ •๋ณด๋Š” Capgo ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋นŒ๋“œ ํ›„ ์ฆ‰์‹œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „์— ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‘์„ธ์š”:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli build credentials save --appId APP_ID --platform ios

์˜ˆ์‹œ:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build request com.example.app --platform ios --path .

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”pathstring๋นŒ๋“œํ•  ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (๊ธฐ๋ณธ๊ฐ’: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ)
โ€”node-modulesstring๋ชจ๋…ธ๋ ˆํฌ์šฉ node_modules ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)
โ€”platformstring๋Œ€์ƒ ํ”Œ๋žซํผ: ios ๋˜๋Š” android (ํ•„์ˆ˜)
โ€”build-modestring๋นŒ๋“œ ๋ชจ๋“œ: debug ๋˜๋Š” release (๊ธฐ๋ณธ๊ฐ’: release)
โ€”build-certificate-base64stringiOS: Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ .p12 ์ธ์ฆ์„œ
โ€”p12-passwordstringiOS: ์ธ์ฆ์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ (์ธ์ฆ์„œ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅ)
โ€”apple-idstringiOS: ์•ฑ ์ „์šฉ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ Apple ID ์ด๋ฉ”์ผ (API ํ‚ค ๋Œ€์‹  ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
โ€”apple-app-specific-passwordstringiOS: TestFlight ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์•ฑ ์ „์šฉ ๋น„๋ฐ€๋ฒˆํ˜ธ (xxxx-xxxx-xxxx-xxxx)
โ€”apple-app-idstringiOS: App Store Connect ์•ฑ ์ˆซ์ž ID (__apple-id__ ๋ฐ __apple-app-specific-password__์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ํ•„์ˆ˜)
โ€”apple-key-idstringiOS: App Store Connect API Key ID
โ€”apple-issuer-idstringiOS: App Store Connect Issuer ID
โ€”apple-key-contentstringiOS: Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ App Store Connect API ํ‚ค (.p8)
โ€”app-store-connect-team-idstringiOS: App Store Connect Team ID
โ€”ios-schemestringiOS: ๋นŒ๋“œํ•  Xcode scheme (๊ธฐ๋ณธ๊ฐ’: App)
โ€”ios-targetstringiOS: ๋นŒ๋“œ ์„ค์ •์„ ์ฝ์–ด์˜ฌ Xcode target (๊ธฐ๋ณธ๊ฐ’: scheme๊ณผ ๋™์ผ)
โ€”xcode-versionstringiOS: ์ง€์ •ํ•œ Xcode ๋ฒ„์ „์ด ์„ค์น˜๋œ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ (์˜ˆ: 26, 26.0.1, 27). ๋ฉ”์ด์ € ๋ฒ„์ „ ์ง€์ • ์‹œ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์€ ๋ฌด๊ด€ํ•จ. ๊ธฐ๋ณธ๊ฐ’: ๋ชจ๋“  ํ™˜๊ฒฝ. ์šฐ์„ ์ˆœ์œ„: CLI > ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (CAPGO_IOS_XCODE_VERSION) > ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…
โ€”ios-distributionstringiOS: Distribution ๋ชจ๋“œ
โ€”ios-provisioning-profilestringiOS: ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํŒŒ์ผ ๊ฒฝ๋กœ ๋˜๋Š” bundleId=path ๋งคํ•‘ (์ค‘๋ณต ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
โ€”android-keystore-filestringAndroid: Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ keystore ํŒŒ์ผ
โ€”keystore-key-aliasstringAndroid: Keystore ํ‚ค ๋ณ„์นญ(alias)
โ€”keystore-key-passwordstringAndroid: Keystore ํ‚ค ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”keystore-store-passwordstringAndroid: Keystore ์ €์žฅ์†Œ ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”play-config-jsonstringAndroid: Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ Google Play ์„œ๋น„์Šค ๊ณ„์ • JSON
--android-flavorstringAndroid: ๋นŒ๋“œํ•  Product flavor (์˜ˆ: production). ํ”„๋กœ์ ํŠธ์— ์—ฌ๋Ÿฌ flavor๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
--android-trackstringAndroid: ์ด๋ฒˆ upload์— ์ ์šฉํ•  Google Play ํŠธ๋ž™ (internal, alpha, beta, production). --submit-to-store-review ๋ฏธ์‚ฌ์šฉ ์‹œ ๊ธฐ๋ณธ๊ฐ’: internal. --submit-to-store-review ์‚ฌ์šฉ ์‹œ ํŠธ๋ž™ ๋ฏธ์ง€์ • ์‹œ: production. ์šฐ์„ ์ˆœ์œ„: CLI > env > ์ €์žฅ๋œ credentials
--android-release-statusstringAndroid: Google Play ์ถœ์‹œ ์ƒํƒœ (draft, completed, inProgress, halted). โ€”submit-to-store-review๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’: draft. โ€”submit-to-store-review ์‚ฌ์šฉ ์‹œ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด: completed. ์šฐ์„ ์ˆœ์œ„: CLI > env > ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…
--in-app-update-prioritystringAndroid: ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์˜ Google Play ์ธ์•ฑ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ (์ •์ˆ˜ 0โ€“5; ๋†’์„์ˆ˜๋ก ๋” ๊ธด๊ธ‰). ์ฐธ๊ณ : https://developer.android.com/guide/playcore/in-app-updates. ์šฐ์„ ์ˆœ์œ„: CLI > env > ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…
--no-playstore-uploadboolean์ด๋ฒˆ ๋นŒ๋“œ์˜ Play Store ์—…๋กœ๋“œ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค (์ €์žฅ๋œ play ์„ค์ •์„ null๋กœ ์ฒ˜๋ฆฌ). โ€”output-upload๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
โ€”submit-to-store-reviewboolean์—…๋กœ๋“œ ํ›„ ๋นŒ๋“œ๋ฅผ draft/๋น„ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋‘์ง€ ์•Š๊ณ , ์Šคํ† ์–ด ์ถœ์‹œ๋ฅผ ๋ฆฌ๋ทฐ์— ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค. Android์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ release_status๊ฐ€ completed์ธ production ํŠธ๋ž™์œผ๋กœ ์ œ์ถœ๋ฉ๋‹ˆ๋‹ค (โ€”android-track / PLAY_STORE_TRACK ๋ฐ โ€”android-release-status / PLAY_STORE_RELEASE_STATUS๋กœ ์žฌ์ •์˜ ๊ฐ€๋Šฅ). iOS์—์„œ๋Š” ์ฒ˜๋ฆฌ๋œ TestFlight ๋นŒ๋“œ๋ฅผ App Store ๋ฆฌ๋ทฐ์— ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.
โ€”store-release-namestring์Šคํ† ์–ด ์ถœ์‹œ ์ด๋ฆ„/๋ฒ„์ „ ๋ผ๋ฒจ. Android๋Š” ์ด๋ฅผ Google Play์˜ version_name์œผ๋กœ ์ „์†กํ•˜๋ฉฐ, iOS๋Š” ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•  ๋•Œ App Store ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ€”store-release-notesstring๊ธฐ๋ณธ ์Šคํ† ์–ด ์ถœ์‹œ ๋…ธํŠธ์ž…๋‹ˆ๋‹ค. Android์—์„œ๋Š” Play ์Šคํ† ์–ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, iOS์—์„œ๋Š” App Store์˜ '์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ' ํ…์ŠคํŠธ์˜ ๋Œ€์ฒด๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€”store-release-notes-localestring์–ธ์–ด๋ณ„ ์Šคํ† ์–ด ์ถœ์‹œ ๋…ธํŠธ(์ค‘๋ณต ์‚ฌ์šฉ ๊ฐ€๋Šฅ). ์˜ˆ: โ€”store-release-notes-locale en-US="Bug fixes" โ€”store-release-notes-locale ko-KR="๋ฒ„๊ทธ ์ˆ˜์ •".
โ€”ios-testflight-groupsstringiOS: ์™ธ๋ถ€ ๋ฒ ํƒ€ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ TestFlight ์™ธ๋ถ€ ๊ทธ๋ฃน ์ด๋ฆ„ ๋˜๋Š” ID๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(์„ ํƒ ์‚ฌํ•ญ).
โ€”ios-automatic-releasebooleaniOS: Apple ์Šน์ธ ํ›„ App Store ๋ฒ„์ „์„ ์ž๋™์œผ๋กœ ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์ˆ˜๋™ ์ถœ์‹œ์ž…๋‹ˆ๋‹ค.
โ€”no-ios-automatic-releasebooleaniOS: Apple ์Šน์ธ ํ›„ App Store ๋ฒ„์ „์„ ์ˆ˜๋™ ์ถœ์‹œ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
โ€”output-uploadboolean์ด๋ฒˆ ๋นŒ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฐ๊ณผ๋ฌผ ์—…๋กœ๋“œ ๋™์ž‘์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค (ํ™œ์„ฑํ™”). ์šฐ์„ ์ˆœ์œ„: CLI > env > ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…
โ€”no-output-uploadboolean์ด๋ฒˆ ๋นŒ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฐ๊ณผ๋ฌผ ์—…๋กœ๋“œ ๋™์ž‘์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค (๋น„ํ™œ์„ฑํ™”). ์šฐ์„ ์ˆœ์œ„: CLI > env > ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…
โ€”output-retentionstring์ด๋ฒˆ ๋นŒ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฐ๊ณผ๋ฌผ ๋งํฌ TTL์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค (1h ~ 7d). ์˜ˆ์‹œ: 1h, 6h, 2d. ์šฐ์„ ์ˆœ์œ„: CLI > env > ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…
โ€”output-recordstring๋นŒ๋“œ ์„ฑ๊ณต ํ›„, ์ง€์ •๋œ ๊ฒฝ๋กœ์— JSON ๋ ˆ์ฝ”๋“œ(jobId, status, outputUrl, qrCodeAscii, qrCodePngPath, finishedAt)๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๊ฒฝ๋กœ์— code ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋ถ™์€ PNG QR ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. .qr.png ๊ธฐ๋ก๋œ ํ•„๋“œ๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋‹ค์‹œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: build last-output.
โ€”no-cacheboolean๋นŒ๋“œ ์บ์‹œ ๋ณต์› ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋ฐ ์ด๋ฒˆ ๋นŒ๋“œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์บ์‹œ ํ•ญ๋ชฉ์„ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์บ์‹œ๋Š” ์•ฑ๋ณ„๋กœ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€”cache-keystringํ™˜๊ฒฝ, ๋ธŒ๋žœ์น˜ ๋˜๋Š” Android flavor๋ณ„๋กœ ๋นŒ๋“œ ์บ์‹œ๋ฅผ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: prod, staging). ์•ฑ๋‹น ํ•˜๋‚˜์˜ ๊ณต์šฉ ๊ธฐ๋ณธ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ƒ๋žตํ•˜์„ธ์š”.
โ€”no-skip-build-number-bumpboolean์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ฌด์‹œํ•˜๊ณ  ์ด๋ฒˆ ๋นŒ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๋นŒ๋“œ ๋ฒˆํ˜ธ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
โ€”skip-marketing-version-bumpboolean์•ฑ์ด ์ด๋ฏธ ์ถœ์‹œ๋œ ๊ฒฝ์šฐ ๋งˆ์ผ€ํŒ… ๋ฒ„์ „(CFBundleShortVersionString / versionName)์˜ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
โ€”sync-ios-versionbooleaniOS: ํ”„๋กœ์ ํŠธ๋ฅผ ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— package.json์˜ Xcode MARKETING_VERSION์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
โ€”ai-analyticsboolean๋นŒ๋“œ ์‹คํŒจ ์‹œ ๋กœ๊ทธ๋ฅผ Capgo AI๋กœ ์ „์†กํ•˜์—ฌ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ํ„ฐ๋ฏธ๋„์—์„œ๋Š” ์‚ฌ์ „ ํ™•์ธ ์ ˆ์ฐจ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ, CI ํ™˜๊ฒฝ์—์„œ๋Š” ์ž๋™์œผ๋กœ ์—…๋กœ๋“œํ•œ ๋’ค ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ stderr์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
โ€”no-prescanboolean์ž๋™ ๋นŒ๋“œ ์ „ ์Šค์บ”์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค
โ€”prescan-ignore-fatalbooleanpre-build ์Šค์บ”์„ ์‹คํ–‰ํ•˜๋˜ ๋นŒ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค (๋ฆฌํฌํŠธ๋งŒ)
โ€”prescan-skipstringid๋กœ ํŠน์ • prescan ์ฒดํฌ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค (๋ฐ˜๋ณต ์ง€์ • ๋˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„). ๋‹ค๋ฅธ ์ฒดํฌ๋Š” ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
โ€”prescan-warnstringid๋กœ ํŠน์ • prescan ์ฒดํฌ๋ฅผ ๊ฒฝ๊ณ ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค (๋ฐ˜๋ณต ์ง€์ • ๋˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„). ์ฒดํฌ๋Š” ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
โ€”fail-on-warningsbooleanprescan ๊ฒฝ๊ณ ๋ฅผ fatal๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค
โ€”send-logs-to-supportbooleanCI/CD ๋นŒ๋“œ ์‹คํŒจ ์‹œ ๋นŒ๋“œ ๋กœ๊ทธ๋ฅผ Capgo ์ง€์›ํŒ€์œผ๋กœ ์ž๋™ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค (์ด๋ฉ”์ผ ๋ถˆํ•„์š”). Capgo ์ง€์›ํŒ€์— ์•Œ๋ฆผ์ด ์ „์†ก๋˜๊ณ  ์ด๋ฉ”์ผ๋กœ ํ›„์† ์•ˆ๋‚ด๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. โ€”ai-analytics์— ์ถ”๊ฐ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€”send-logsbooleanโ€”send-logs-to-support์˜ deprecated ๋ณ„์นญ์ž…๋‹ˆ๋‹ค
-astring๊ณ„์ • ์—ฐ๊ฒฐ์„ ์œ„ํ•œ API ํ‚ค
--supa-hoststring์ปค์Šคํ…€ Supabase host URL (self-hosting ๋˜๋Š” Capgo ๊ฐœ๋ฐœ์šฉ)
--supa-anonstring์ปค์Šคํ…€ Supabase anon key (self-hosting์šฉ)
--verboseboolean์ƒ์„ธ ๋กœ๊ทธ๊ฐ€ ํฌํ•จ๋œ verbose ์ถœ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค

๋นŒ๋“œ ์บ์‹œ: ๊ธฐ๋ณธ์ ์œผ๋กœ Capgo๋Š” ์•ฑ๋ณ„๋กœ ์ปดํŒŒ์ผ๋œ Native Build ์•„ํ‹ฐํŒฉํŠธ(CocoaPods, Gradle ๋ฐ ๊ด€๋ จ ์ถœ๋ ฅ๋ฌผ)๋ฅผ ๋ณต๊ตฌํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. --cache-key ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RC์™€ ํ”„๋กœ๋•์…˜ ์บ์‹œ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, --no-cache ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผํšŒ์„ฑ ํด๋ฆฐ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. API ํ†ตํ•ฉ ํ™˜๊ฒฝ์—์„œ๋Š” cache_key ๋˜๋Š” cache_enabled: false ๋ฅผ ๋นŒ๋“œ ์š”์ฒญ ํŽ˜์ด๋กœ๋“œ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋นŒ๋“œ ์บ์‹œ ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ: ์ž˜๋ชป๋œ ์บ์‹œ ๋ณต๊ตฌ.

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build sync-ios-version

package.json์˜ MARKETING_VERSION์„ ๋กœ์ปฌ iOS Xcode ํ”„๋กœ์ ํŠธ์— ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build sync-ios-version --path .

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”pathstringํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (๊ธฐ๋ณธ๊ฐ’: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ)
โ€”checkboolean์ฒดํฌ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, MARKETING_VERSION์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด 0์ด ์•„๋‹Œ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build prescan

์—…๋กœ๋“œ ์ „, ํด๋ผ์šฐ๋“œ ๋นŒ๋“œ ์‹คํŒจ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋ฐ ์ €์žฅ๋œ ์ž๊ฒฉ ์ฆ๋ช…์˜ ๋ฌธ์ œ๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. ์ž๊ฒฉ ์ฆ๋ช…(๋งŒ๋ฃŒ, ๋น„๋ฐ€๋ฒˆํ˜ธ, ํ”„๋กœํ•„ ํŽ˜์–ด๋ง), ํ”„๋กœ์ ํŠธ ์ƒํƒœ(cap sync, node_modules ๊ตฌ์กฐ), ํ”Œ๋žซํผ ์„ค์ •์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค: build request; ์ด ๋ช…๋ น์€ ๋‹จ๋…(์˜ˆ: CI ํ™˜๊ฒฝ)์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Prescan ๊ฒ€์‚ฌ ์ „์ฒด ์ฒดํฌ ํ•ญ๋ชฉ ๋ชฉ๋ก๊ณผ ๊ฐœ๋ณ„ ๊ทœ์น™์„ --skip / --warn ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”platformstring๋Œ€์ƒ ํ”Œ๋žซํผ: ios ๋˜๋Š” android (ํ•„์ˆ˜)
โ€”pathstringํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (๊ธฐ๋ณธ๊ฐ’: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ)
-astring๊ณ„์ • ์—ฐ๊ฒฐ์„ ์œ„ํ•œ API ํ‚ค
โ€”android-flavorstringAndroid: ๋นŒ๋“œ์— ์‚ฌ์šฉํ•  product flavor
โ€”ios-diststringiOS: ๊ฒ€์ฆํ•  distribution mode
โ€”jsonboolean๊ธฐ๊ณ„ ํŒ๋…์ด ๊ฐ€๋Šฅํ•œ JSON ํ˜•์‹์œผ๋กœ ๋ฆฌํฌํŠธ ์ถœ๋ ฅ
โ€”fail-on-warningsboolean๊ฒฝ๊ณ  ๋ฐœ์ƒ ์‹œ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ non-zero๋กœ ๋ฐ˜ํ™˜ (CI์šฉ)
โ€”ignore-fatalboolean์ง„๋‹จ ๋ชจ๋“œ: ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ณด๊ณ ํ•˜์ง€๋งŒ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ํ•ญ์ƒ 0์œผ๋กœ ๋ฐ˜ํ™˜
โ€”skipstringID๋ฅผ ์ง€์ •ํ•˜์—ฌ ํŠน์ • ์ฒดํฌ ํ•ญ๋ชฉ ๊ฑด๋„ˆ๋›ฐ๊ธฐ (์ค‘๋ณต ์‚ฌ์šฉ ๋˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)
โ€”warnstringID๋ฅผ ์ง€์ •ํ•˜์—ฌ ํŠน์ • ์ฒดํฌ ํ•ญ๋ชฉ์„ ๊ฒฝ๊ณ ๋กœ ํ•˜ํ–ฅ ์กฐ์ • (์ค‘๋ณต ์‚ฌ์šฉ ๋˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)
--verboseboolean์ƒ์„ธ ๋กœ๊ทธ๊ฐ€ ํฌํ•จ๋œ verbose ์ถœ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค
--supa-hoststring์ปค์Šคํ…€ Supabase host URL (self-hosting ๋˜๋Š” Capgo ๊ฐœ๋ฐœ์šฉ)
--supa-anonstring์ปค์Šคํ…€ Supabase anon key (self-hosting์šฉ)
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build last-output

์ด์ „ ๋นŒ๋“œ์—์„œ ์ƒ์„ฑ๋œ ๋นŒ๋“œ ์ถœ๋ ฅ ๊ธฐ๋ก์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. build request --output-record. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด JSON์„ ์ถœ๋ ฅํ•˜๋ฉฐ, โ€”field ์˜ต์…˜์œผ๋กœ ํŠน์ • ํ•„๋“œ๋งŒ, ๋˜๋Š” โ€”qr ์˜ต์…˜์œผ๋กœ ASCII QR code๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CI ํ™˜๊ฒฝ์—์„œ ๋‹ค์šด๋กœ๋“œ URL์ด๋‚˜ QR ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ PR์ด๋‚˜ Issue์— ๋‚จ๊ธธ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ: npx @capgo/cli build last-output โ€”path /tmp/build.json npx @capgo/cli build last-output โ€”path /tmp/build.json โ€”field outputUrl npx @capgo/cli build last-output โ€”path /tmp/build.json โ€”qr

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”pathstringโ€”output-record ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ JSON ๋ ˆ์ฝ”๋“œ์˜ ๊ฒฝ๋กœ (ํ•„์ˆ˜)
โ€”fieldstringํŠน์ • ํ•„๋“œ ํ•˜๋‚˜๋งŒ ์ถœ๋ ฅ (jobId, appId, platform, buildMode, status, outputUrl, qrCodeAscii, qrCodePngPath, finishedAt, schemaVersion ์ค‘ ์„ ํƒ)
โ€”qrboolean๋ Œ๋”๋ง๋œ ASCII QR code ์ถœ๋ ฅ (โ€”field qrCodeAscii์˜ ๋‹จ์ถ• ๋ช…๋ น์–ด)

๋กœ์ปฌ ๋จธ์‹ ์— ์ €์žฅ๋œ ๋นŒ๋“œ credentials๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ”’ ๋ณด์•ˆ ์•ˆ๋‚ด:

  • Credentials๋Š” ~/.capgo-credentials/credentials.json (๊ธ€๋กœ๋ฒŒ) ๋˜๋Š” .capgo-credentials.json (๋กœ์ปฌ)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค
  • ๋นŒ๋“œ ์‹œ Capgo๋กœ ์ „์†ก๋˜์ง€๋งŒ, ์ ˆ๋Œ€ ์˜๊ตฌ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • Capgo์—์„œ ๋นŒ๋“œ ์งํ›„ ์ฆ‰์‹œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค
  • ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ ๊ธฐ๊ฐ„ ํ•œ์ • ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ์œ„ํ•ด ์„ ํƒ์ ์œผ๋กœ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ“š DOCUMENTATION: iOS ์„ค์ •: https://capgo.app/docs/cli/cloud-build/ios/ Android ์„ค์ •: https://capgo.app/docs/cli/cloud-build/android/

๋ณ„์นญ: asc-key

ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials apple-key

macOS ์ „์šฉ ๊ฐ€์ด๋“œ ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ App Store Connect ํŒ€ API ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์žฅ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด Apple์˜ App Store Connect UI๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฐฝ์ด ์—ด๋ฆฌ๋ฉฐ, Issuer ID์™€ Key ID๋ฅผ ์ž๋™์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ , ์ผํšŒ์šฉ .p8 ํŒŒ์ผ์„ ๊ฐ€๋กœ์ฑ„ Apple์—์„œ ๊ฒ€์ฆํ•œ ๋’ค ~/.appstoreconnect/private_keys์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ง„ํ–‰ ํ†ต๊ณ„๋Š” Capgo analytics๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค (CAPGO_DISABLE_TELEMETRY__๋กœ ๋น„ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ). npx @capgo/cli build credentials apple-key โ€”appId com.example.app

์˜ˆ์‹œ:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
Example:

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
-astring๊ณ„์ • ์—ฐ๊ฒฐ์„ ์œ„ํ•œ API ํ‚ค
โ€”appIdstring์บก์ฒ˜๋œ ํ‚ค๋ฅผ ํ•ด๋‹น ์•ฑ์˜ iOS build credentials์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
โ€”localboolean๊ธ€๋กœ๋ฒŒ ํŒŒ์ผ ๋Œ€์‹  ํ”„๋กœ์ ํŠธ๋ณ„ .capgo-credentials.json์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
โ€”jsonboolean์บก์ฒ˜๋œ Key ID / Issuer ID / .p8 ๊ฒฝ๋กœ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials save

iOS ๋˜๋Š” Android์šฉ ๋นŒ๋“œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋กœ์ปฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์ •๋ณด ์ €์žฅ ์œ„์น˜:

  • ~/.capgo-credentials/credentials.json (๊ธฐ๋ณธ๊ฐ’, ๊ธ€๋กœ๋ฒŒ)
  • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ .capgo-credentials.json (--local ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ ์‹œ) โš ๏ธ ๋นŒ๋“œ ์ „ ํ•„์ˆ˜ ์‚ฌํ•ญ: ๋นŒ๋“œ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ”’ ์ด ์ธ์ฆ ์ •๋ณด๋Š” Capgo ์„œ๋ฒ„์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฆ‰์‹œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ“š ์„ค์ • ๊ฐ€์ด๋“œ: iOS: https://capgo.app/docs/cli/cloud-build/ios/ Android: https://capgo.app/docs/cli/cloud-build/android/ npx @capgo/cli build credentials save โ€”platform ios
    โ€”certificate ./cert.p12 โ€”p12-password โ€œpasswordโ€
    โ€”ios-provisioning-profile ./profile.mobileprovision
    โ€”apple-key ./AuthKey.p8 โ€”apple-key-id โ€œKEY123โ€
    โ€”apple-issuer-id โ€œissuer-uuidโ€ โ€”apple-team-id โ€œteam-idโ€ ๋ฉ€ํ‹ฐ ํƒ€๊ฒŸ ์˜ˆ์‹œ (์•ฑ + ์œ„์ ฏ ์ต์Šคํ…์…˜): npx @capgo/cli build credentials save โ€”platform ios
    โ€”ios-provisioning-profile ./App.mobileprovision
    โ€”ios-provisioning-profile com.example.widget=./Widget.mobileprovision
    โ€ฆ npx @capgo/cli build credentials save โ€”platform android
    โ€”keystore ./release.keystore โ€”keystore-alias โ€œmy-keyโ€
    โ€”keystore-key-password โ€œkey-passโ€
    โ€”play-config ./service-account.json ๋กœ์ปฌ ์ €์žฅ์†Œ (ํ”„๋กœ์ ํŠธ๋ณ„): npx @capgo/cli build credentials save โ€”local โ€”platform ios โ€ฆ

์˜ˆ์‹œ:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
iOS Example:

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”appIdstringApp ID (์˜ˆ: com.example.app) (ํ•„์ˆ˜)
โ€”platformstringPlatform: ios ๋˜๋Š” android (ํ•„์ˆ˜)
โ€”certificatestringiOS: .p12 ์ธ์ฆ์„œ ํŒŒ์ผ ๊ฒฝ๋กœ
โ€”ios-provisioning-profilestringiOS: ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํŒŒ์ผ ๊ฒฝ๋กœ ๋˜๋Š” bundleId=path (์ค‘๋ณต ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
โ€”p12-passwordstringiOS: ์ธ์ฆ์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ (์ธ์ฆ์„œ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅ)
โ€”apple-keystringiOS: .p8 App Store Connect API ํ‚ค ๊ฒฝ๋กœ
โ€”apple-key-idstringiOS: App Store Connect API Key ID
โ€”apple-issuer-idstringiOS: App Store Connect Issuer ID
โ€”apple-team-idstringiOS: App Store Connect Team ID
โ€”ios-distributionstringiOS: ๋ฐฐํฌ ๋ชจ๋“œ
โ€”apple-idstringiOS: ์•ฑ ์ „์šฉ ์•”ํ˜ธ ์—…๋กœ๋“œ์šฉ Apple ID ์ด๋ฉ”์ผ (App Store Connect API ํ‚ค ๋Œ€์‹  ์‚ฌ์šฉ)
โ€”apple-app-specific-passwordstringiOS: TestFlight ์—…๋กœ๋“œ์šฉ ์•ฑ ์ „์šฉ ์•”ํ˜ธ (xxxx-xxxx-xxxx-xxxx)
โ€”apple-app-idstringiOS: App Store Connect ์ˆซ์ž ์•ฑ ID (โ€”apple-id ๋ฐ โ€”apple-app-specific-password์™€ ํ•จ๊ป˜ ํ•„์ˆ˜)
โ€”keystorestringAndroid: keystore ํŒŒ์ผ ๊ฒฝ๋กœ (.keystore ๋˜๋Š” .jks)
โ€”keystore-aliasstringAndroid: Keystore ํ‚ค ๋ณ„์นญ
โ€”keystore-key-passwordstringAndroid: Keystore ํ‚ค ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”keystore-store-passwordstringAndroid: Keystore ์ €์žฅ์†Œ ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”play-configstringAndroid: Play Store ์„œ๋น„์Šค ๊ณ„์ • JSON ๊ฒฝ๋กœ
โ€”android-flavorstringAndroid: ๋นŒ๋“œํ•  Product flavor (์˜ˆ: production). ํ”„๋กœ์ ํŠธ์— ์—ฌ๋Ÿฌ flavor๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
โ€”in-app-update-prioritystringAndroid: ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์˜ Google Play ์ธ์•ฑ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ (์ •์ˆ˜ 0โ€“5; ๋†’์„์ˆ˜๋ก ๊ธด๊ธ‰). ์ƒ๋žตํ•˜๋ฉด Play์˜ ๊ธฐ์กด ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.
โ€”localboolean๊ธ€๋กœ๋ฒŒ ~/.capgo-credentials/ ๋Œ€์‹  ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ .capgo-credentials.json์— ์ €์žฅ
โ€”output-uploadboolean๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(IPA/APK/AAB)์„ Capgo ์Šคํ† ๋ฆฌ์ง€์— ์—…๋กœ๋“œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ์ถœ๋ ฅ
โ€”no-output-uploadboolean๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(IPA/APK/AAB)์„ Capgo ์Šคํ† ๋ฆฌ์ง€์— ์—…๋กœ๋“œํ•˜์ง€ ๋งˆ์„ธ์š”
โ€”output-retentionstring์ถœ๋ ฅ ๋งํฌ TTL: 1h~7d (๊ธฐ๋ณธ๊ฐ’: 1h). ์˜ˆ์‹œ: 1h, 6h, 2d
โ€”skip-build-number-bumpbooleanํ–ฅํ›„ ๋นŒ๋“œ์—์„œ ๋นŒ๋“œ ๋ฒˆํ˜ธ/๋ฒ„์ „ code ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค
โ€”no-skip-build-number-bumpboolean๋นŒ๋“œ ๋ฒˆํ˜ธ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ ๋™์ž‘)
โ€”skip-marketing-version-bumpboolean์•ฑ์ด ์ด๋ฏธ ์ถœ์‹œ๋œ ๊ฒฝ์šฐ ํ–ฅํ›„ ๋นŒ๋“œ์—์„œ ๋งˆ์ผ€ํŒ… ๋ฒ„์ „ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค
โ€”no-skip-marketing-version-bumpboolean๋งˆ์ผ€ํŒ… ๋ฒ„์ „ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ ๋™์ž‘)
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials list

์ €์žฅ๋œ build credentials ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค (๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๋จ). ํ˜„์žฌ ์ €์žฅ๋œ credentials(global ๋ฐ local ๋ชจ๋‘ ํฌํ•จ)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ: npx @capgo/cli build credentials list # ๋ชจ๋“  ์•ฑ ๋ชฉ๋ก ํ‘œ์‹œ npx @capgo/cli build credentials list โ€”appId com.example.app # ํŠน์ • ์•ฑ ๋ชฉ๋ก ํ‘œ์‹œ

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”appIdstring๋ชฉ๋ก์„ ํ‘œ์‹œํ•  App ID (์ƒ๋žต ์‹œ ์ „์ฒด ๋ชฉ๋ก ํ‘œ์‹œ)
โ€”localboolean๋กœ์ปฌ .capgo-credentials.json ํŒŒ์ผ์˜ ์ธ์ฆ ์ •๋ณด๋งŒ ํ‘œ์‹œ
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials clear

์ €์žฅ๋œ build credentials๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€์—์„œ credentials๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • credentials๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ ค๋ฉด โ€”appId์™€ โ€”platform์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ์‹œ: npx @capgo/cli build credentials clear # ๋ชจ๋“  ์•ฑ ์‚ญ์ œ (global) npx @capgo/cli build credentials clear โ€”local # ๋กœ์ปฌ credentials ์‚ญ์ œ npx @capgo/cli build credentials clear โ€”appId com.example.app โ€”platform ios

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”appIdstring์‚ญ์ œํ•  App ID (์ƒ๋žต ์‹œ ๋ชจ๋“  ์•ฑ ์‚ญ์ œ)
โ€”platformstring์‚ญ์ œํ•  ํ”Œ๋žซํผ: ios ๋˜๋Š” android (์ƒ๋žต ์‹œ ๋ชจ๋“  ํ”Œ๋žซํผ ์‚ญ์ œ)
โ€”localboolean๊ธ€๋กœ๋ฒŒ ๋Œ€์‹  ๋กœ์ปฌ .capgo-credentials.json์—์„œ ์‚ญ์ œ

๐Ÿ”น ์—…๋ฐ์ดํŠธ

โ€œ ๐Ÿ”น Updateโ€ ์„น์…˜
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials update

๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•  ํ•„์š” ์—†์ด ํŠน์ • ์ž๊ฒฉ ์ฆ๋ช…๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ํ•„๋“œ๋งŒ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ์กด ์ž๊ฒฉ ์ฆ๋ช…์„ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”. ์ œ๊ณต๋œ ์˜ต์…˜์„ ํ†ตํ•ด ํ”Œ๋žซํผ์ด ์ž๋™์œผ๋กœ ๊ฐ์ง€๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ: npx @capgo/cli build credentials update โ€”ios-provisioning-profile ./new-profile.mobileprovision npx @capgo/cli build credentials update โ€”local โ€”keystore ./new-keystore.jks

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”appIdstringApp ID (capacitor.config์— ์ƒ๋žต ์‹œ ์ž๋™ ๊ฐ์ง€)
โ€”platformstringPlatform: ios ๋˜๋Š” android (์˜ต์…˜์—์„œ ์ž๋™ ๊ฐ์ง€)
โ€”localboolean๊ธ€๋กœ๋ฒŒ ๋Œ€์‹  ๋กœ์ปฌ .capgo-credentials.json ์—…๋ฐ์ดํŠธ
โ€”certificatestringP12 ์ธ์ฆ์„œ ํŒŒ์ผ ๊ฒฝ๋กœ
โ€”ios-provisioning-profilestringProvisioning profile ๊ฒฝ๋กœ ๋˜๋Š” bundleId=path (์ค‘๋ณต ์ง€์ • ๊ฐ€๋Šฅ, ๊ธฐ๋ณธ๊ฐ’์€ ๋ณ‘ํ•ฉ)
โ€”overwrite-ios-provisioning-mapboolean๊ธฐ์กด ํ”„๋กœ๋น„์ €๋‹ ๋งต์„ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด๋ฅผ ๊ต์ฒด (๊ธฐ๋ณธ๊ฐ’: merge)
โ€”p12-passwordstringP12 ์ธ์ฆ์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”apple-keystringApp Store Connect API ํ‚ค ๊ฒฝ๋กœ (.p8 ํŒŒ์ผ)
โ€”apple-key-idstringApp Store Connect API Key ID
โ€”apple-issuer-idstringApp Store Connect Issuer ID
โ€”apple-team-idstringApp Store Connect Team ID
โ€”apple-idstringiOS: ์•ฑ ์ „์šฉ ์•”ํ˜ธ ์—…๋กœ๋“œ์šฉ Apple ID ์ด๋ฉ”์ผ (App Store Connect API ํ‚ค ๋Œ€์‹  ์‚ฌ์šฉ)
โ€”apple-app-specific-passwordstringiOS: TestFlight ์—…๋กœ๋“œ์šฉ ์•ฑ ์ „์šฉ ์•”ํ˜ธ (xxxx-xxxx-xxxx-xxxx)
โ€”apple-app-idstringiOS: App Store Connect ์ˆซ์ž ์•ฑ ID (โ€”apple-id ๋ฐ โ€”apple-app-specific-password์™€ ํ•จ๊ป˜ ํ•„์ˆ˜)
โ€”ios-distributionstringiOS: ๋ฐฐํฌ ๋ชจ๋“œ
โ€”keystorestringkeystore ํŒŒ์ผ ๊ฒฝ๋กœ (.keystore ๋˜๋Š” .jks)
โ€”keystore-aliasstringKeystore ํ‚ค ๋ณ„์นญ
โ€”keystore-key-passwordstringKeystore ํ‚ค ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”keystore-store-passwordstringKeystore ์ €์žฅ์†Œ ๋น„๋ฐ€๋ฒˆํ˜ธ
โ€”play-configstringGoogle Play ์„œ๋น„์Šค ๊ณ„์ • JSON ๊ฒฝ๋กœ
โ€”android-flavorstringAndroid: ๋นŒ๋“œํ•  Product flavor (์˜ˆ: production). ํ”„๋กœ์ ํŠธ์— ์—ฌ๋Ÿฌ flavor๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
โ€”in-app-update-prioritystringAndroid: ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•œ Google Play ์ธ์•ฑ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ (์ •์ˆ˜ 0โ€“5; ๋†’์„์ˆ˜๋ก ๊ธด๊ธ‰ํ•จ).
โ€”output-uploadboolean๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(IPA/APK/AAB)์„ Capgo ์Šคํ† ๋ฆฌ์ง€์— ์—…๋กœ๋“œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ์ถœ๋ ฅ
โ€”no-output-uploadboolean๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(IPA/APK/AAB)์„ Capgo ์Šคํ† ๋ฆฌ์ง€์— ์—…๋กœ๋“œํ•˜์ง€ ๋งˆ์„ธ์š”
โ€”output-retentionstring์ถœ๋ ฅ ๋งํฌ TTL: 1h~7d. ์˜ˆ์‹œ: 1h, 6h, 2d
โ€”skip-build-number-bumpbooleanํ–ฅํ›„ ๋นŒ๋“œ์—์„œ ๋นŒ๋“œ ๋ฒˆํ˜ธ/๋ฒ„์ „ code ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค
โ€”no-skip-build-number-bumpboolean๋นŒ๋“œ ๋ฒˆํ˜ธ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ ๋™์ž‘)
โ€”skip-marketing-version-bumpboolean์•ฑ์ด ์ด๋ฏธ ์ถœ์‹œ๋œ ๊ฒฝ์šฐ ํ–ฅํ›„ ๋นŒ๋“œ์—์„œ ๋งˆ์ผ€ํŒ… ๋ฒ„์ „ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค
โ€”no-skip-marketing-version-bumpboolean๋งˆ์ผ€ํŒ… ๋ฒ„์ „ ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ ๋™์ž‘)
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials manage

์ €์žฅ๋œ ๋นŒ๋“œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋Œ€ํ™”ํ˜•์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์ธ์ฆ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ์„ค์ • ๋‚ด์šฉ์„ ๋ณด๊ฑฐ๋‚˜, CI/CD์šฉ .env ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ , ํŠน์ • ํ”Œ๋žซํผ์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ TUI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: capgo init. ์˜ˆ์‹œ: npx @capgo/cli build credentials manage npx @capgo/cli build credentials manage โ€”appId com.example.app npx @capgo/cli build credentials manage โ€”appId com.example.app โ€”platform ios npx @capgo/cli build credentials manage โ€”local

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”appIdstring๊ด€๋ฆฌํ•  App ID (์„ ํƒ ์‚ฌํ•ญ, ์ƒ๋žต ์‹œ ์„ ํƒ ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ)
โ€”platformstring๊ด€๋ฆฌํ•  ํ”Œ๋žซํผ: ios ๋˜๋Š” android (์„ ํƒ ์‚ฌํ•ญ, ์ƒ๋žต ์‹œ ์„ ํƒ ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ)
โ€”localboolean๋กœ์ปฌ .capgo-credentials.json ํŒŒ์ผ๋งŒ ํƒ์ƒ‰
ํ„ฐ๋ฏธ๋„ ์ฐฝ
npx @capgo/cli@latest build credentials migrate

๊ธฐ์กด provisioning profile์„ ์ƒˆ๋กœ์šด multi-target ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. BUILD_PROVISION_PROFILE_BASE64๋ฅผ CAPGO_IOS_PROVISIONING_MAP์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Xcode ํ”„๋กœ์ ํŠธ์—์„œ ๋ฉ”์ธ bundle ID๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค. npx @capgo/cli build credentials migrate โ€”platform ios

์˜ˆ์‹œ:

ํ„ฐ๋ฏธ๋„ ์ฐฝ
Example:

์˜ต์…˜:

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…์„ค๋ช…
โ€”appIdstringApp ID (capacitor.config์—์„œ ์ƒ๋žต ์‹œ ์ž๋™ ๊ฐ์ง€)
โ€”platformstringPlatform (ios๋งŒ ์ง€์›)
โ€”localboolean๊ธ€๋กœ๋ฒŒ ๋Œ€์‹  ๋กœ์ปฌ .capgo-credentials.json์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜