Skip to content

๐Ÿš€[๊ธฐ๋Šฅ๊ฐœ์„ ][CICD] AppStore/PlayStore ๋ฐฐํฌ ์ง€์› ๋Œ€ํญ ๊ฐœ์„  > ์‹ฌ์‚ฌ ์ž๋™ ์ œ์ถœ + ๋ฐฐํฌ ๋ชจ๋“œ 3๋‹จ๊ณ„ ํ†ต์ผย #934

Description

@Cassiiopeia

๐Ÿ“ ๊ฐœ์š”

iOS(App Store) ยท Android(Play Store) ์Šคํ† ์–ด ๋ฐฐํฌ CICD๋ฅผ ์ „๋ฉด ๊ฐœ์„  ์™„๋ฃŒํ–ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์ด ์ด์Šˆ๋งŒ ๋ณด๊ณ ๋„ ์ฒ˜์Œ ๋ณด๋Š” ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ž‘์„ฑยท์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒŒ์ผ๋ณ„ ์—ญํ• , ์˜์กด์„ฑ, ์‹œํฌ๋ฆฟ, ์‹ค์ œ ์ฝ”๋“œ, ๋™์ž‘ ํ๋ฆ„, ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ๋ชจ๋‘ ์ •๋ฆฌํ•œ๋‹ค.

๊ด€๋ จ ์ด์Šˆ: #930(Android ๊ฑฐ์ง“ ์„ฑ๊ณต ์ œ๊ฑฐ), #931(iOS ์‹ฌ์‚ฌ ์ž๋™ ์ œ์ถœ ๋ˆ„๋ฝ). ์ƒ์„ธ ๊ตฌํ˜„ ๋ณด๊ณ ์„œ๋Š” #931 ๋Œ“๊ธ€ ์ฐธ์กฐ.

์ตœ์ข… ๊ฒฐ๊ณผ: ์ฝ”๋“œ push ํ•œ ๋ฒˆ์œผ๋กœ ๋นŒ๋“œ โ†’ ์Šคํ† ์–ด ์—…๋กœ๋“œ โ†’ (๋ชจ๋“œ์— ๋”ฐ๋ผ) ์‹ฌ์‚ฌ ์ง์ „ ๋˜๋Š” ์‹ฌ์‚ฌ ์ž๋™ ์ œ์ถœ๊นŒ์ง€ ์ž๋™ํ™”. iOS 1.10.104๊ฐ€ ์‹ค์ œ App Store ์‹ฌ์‚ฌ ํ(Waiting for Review)์— ์ž๋™ ์ง„์ž… ์‹ค์ธก ๊ฒ€์ฆ ์™„๋ฃŒ. Android 1.10.101 production "๊ฒ€ํ†  ์ค‘" ์ง„์ž… ๊ฒ€์ฆ ์™„๋ฃŒ.


๐Ÿ—‚๏ธ 1. ํŒŒ์ผ ๊ตฌ์„ฑ๊ณผ ์˜์กด์„ฑ

1-1. ์šด์˜ ์›Œํฌํ”Œ๋กœ์šฐ (์‹ค์ œ ๋ฐฐํฌ๊ฐ€ ๋„๋Š” ๊ณณ)

ํŒŒ์ผ ์—ญํ•  ํŠธ๋ฆฌ๊ฑฐ
.github/workflows/ROMROM-IOS-TESTFLIGHT.yaml iOS ๋นŒ๋“œ โ†’ TestFlight โ†’ App Store deliver push: deploy / workflow_run(CHANGELOG) / workflow_dispatch
.github/workflows/ROMROM-ANDROID-PLAYSTORE-CICD.yaml Android ๋นŒ๋“œ โ†’ internal โ†’ production promote ๋™์ผ

์ค‘์š”: ๋‘ ์›Œํฌํ”Œ๋กœ์šฐ ๋ชจ๋‘ ref: deploy๋ฅผ checkout ํ•œ๋‹ค. ์ฆ‰ deploy ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ/Fastfile๋กœ ๋นŒ๋“œํ•œ๋‹ค. main์—๋งŒ ๋จธ์ง€ํ•˜๋ฉด ๋ฐฐํฌ์— ๋ฐ˜์˜ ์•ˆ ๋จ โ†’ main โ†’ deploy ๋จธ์ง€ ํ•„์š”.

1-2. Fastlane ์„ค์ • ํŒŒ์ผ

ํŒŒ์ผ ์—ญํ•  ๋ˆ„๊ฐ€ ์‚ฌ์šฉ
android/fastlane/Fastfile.playstore Android lane(deploy_internal, promote_internal_to_production) Android ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ Fastfile๋กœ ๋ณต์‚ฌํ•ด ์‚ฌ์šฉ
(iOS) ์ธ๋ผ์ธ Fastfile iOS ์›Œํฌํ”Œ๋กœ์šฐ step ์•ˆ์—์„œ cat > ios/fastlane/Fastfile ๋กœ ๋™์  ์ƒ์„ฑ iOS ์›Œํฌํ”Œ๋กœ์šฐ ์ž์ฒด

iOS๋Š” ๋ณ„๋„ Fastfile ํŒŒ์ผ์ด ์—†๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ step "Install Fastlane and create Fastfile"์ด heredoc์œผ๋กœ ios/fastlane/Fastfile์„ ๊ทธ ์ž๋ฆฌ์—์„œ ๋งŒ๋“ ๋‹ค. iOS deliver ๋กœ์ง์„ ๊ณ ์น˜๋ ค๋ฉด ์ด ์›Œํฌํ”Œ๋กœ์šฐ YAML ์•ˆ์˜ heredoc์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

1-3. ๋งˆ๋ฒ•์‚ฌ(wizard) ํ…œํ”Œ๋ฆฟ โ€” ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ์…‹์—…์šฉ

ํŒŒ์ผ ์—ญํ• 
.github/util/flutter/testflight-wizard/templates/Fastfile iOS Fastfile ํ…œํ”Œ๋ฆฟ (์‹ ๊ทœ ํ”„๋กœ์ ํŠธ๊ฐ€ ios/fastlane/Fastfile๋กœ ๋ฐ›์Œ). ์šด์˜ ์ธ๋ผ์ธ Fastfile๊ณผ ๋™์ผ ๋กœ์ง ์œ ์ง€
.github/util/flutter/testflight-wizard/templates/Gemfile fastlane ~> 2.228 + multi_json
.github/util/flutter/testflight-wizard/testflight-wizard-setup.sh ์œ„ ํ…œํ”Œ๋ฆฟ๋“ค์„ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ + Xcode Manual Signing ํŒจ์น˜
.github/util/flutter/playstore-wizard/playstore-wizard-setup.sh/.ps1 Android ์…‹์—…(+multi_json)

์œ ์ง€๋ณด์ˆ˜ ์›์น™: ์šด์˜ ์›Œํฌํ”Œ๋กœ์šฐ(์ธ๋ผ์ธ Fastfile)๋ฅผ ๊ณ ์น˜๋ฉด wizard ํ…œํ”Œ๋ฆฟ๋„ ๊ฐ™์ด ๊ณ ์ณ์•ผ ๋‘˜์ด ๋ถ„๊ธฐ๋˜์ง€ ์•Š๋Š”๋‹ค.


โš™๏ธ 2. ํ•„์š”ํ•œ GitHub Secrets / Variables

2-1. iOS Secrets

Secret ์šฉ๋„
APPLE_CERTIFICATE_BASE64 / APPLE_CERTIFICATE_PASSWORD Distribution ์ธ์ฆ์„œ(.p12)
APPLE_PROVISIONING_PROFILE_BASE64 Provisioning Profile
APP_STORE_CONNECT_API_KEY_BASE64 / APP_STORE_CONNECT_API_KEY_ID / APP_STORE_CONNECT_ISSUER_ID App Store Connect API Key(.p8) โ€” pilotยทdeliver ์ธ์ฆ
ENV_FILE, SECRETS_XCCONFIG, GOOGLE_SERVICE_INFO_PLIST ์•ฑ ํ™˜๊ฒฝ/Firebase

2-2. Android Secrets

Secret ์šฉ๋„
Release Keystore ๊ด€๋ จ AAB ์„œ๋ช…
GOOGLE_PLAY_JSON_KEY(์„œ๋น„์Šค ๊ณ„์ •) Play Console API

2-3. Repository Variables (๋ฐฐํฌ ๋ชจ๋“œ ์ œ์–ด)

Variable ๊ธฐ๋ณธ(ํด๋ฐฑ) ํšจ๊ณผ
IOS_DEPLOY_MODE testflight_only iOS ํ‰์†Œ ์ž๋™ ๋ฐฐํฌ ๋ชจ๋“œ
ANDROID_DEPLOY_MODE store_submit Android ํ‰์†Œ ์ž๋™ ๋ฐฐํฌ ๋ชจ๋“œ

์šฐ์„ ์ˆœ์œ„: workflow_dispatch input > repo variable > ํด๋ฐฑ.


๐ŸŽ›๏ธ 3. ๋ฐฐํฌ ๋ชจ๋“œ 3๋‹จ๊ณ„ (์–‘ ํ”Œ๋žซํผ ๊ณตํ†ต ๊ฐœ๋…)

๋ชจ๋“œ iOS (App Store) Android (Play Store) ์‚ฌ๋žŒ ๊ฐœ์ž…
store_only TestFlight ์—…๋กœ๋“œ๊นŒ์ง€๋งŒ (pilot) internal ํŠธ๋ž™ ์—…๋กœ๋“œ๊นŒ์ง€๋งŒ ์—†์Œ(ํ…Œ์ŠคํŠธ์šฉ)
store_prepare ๋ฒ„์ „ ์ƒ์„ฑ + ๋นŒ๋“œ ์„ ํƒ + What's New ์ฑ„์›Œ Prepare for Submission production draft ์Šน๊ธ‰ ASC์—์„œ Add for Review / ์ฝ˜์†”์—์„œ "์ถœ์‹œ ์‹œ์ž‘"
store_submit submit_for_review๋กœ ์‹ฌ์‚ฌ ์ž๋™ ์ œ์ถœ production completed ์Šน๊ธ‰(์‹ฌ์‚ฌ ์ž๋™ ๋“ฑ๋ก) ์—†์Œ(์™„์ „ ์ž๋™)

iOS๋Š” testflight_only/appstore_prepare/appstore_submit ๋„ค์ด๋ฐ๊ณผ store_* ๋‘˜ ๋‹ค ์ธ์‹(Fastfile์—์„œ ๋ณ„์นญ ์ฒ˜๋ฆฌ).

flowchart TD
    A(["์ฝ”๋“œ push โ†’ deploy"]) --> B["Flutter ๋นŒ๋“œ + ์ฝ”๋“œ์‚ฌ์ธ + IPA/AAB"]
    B --> C["์Šคํ† ์–ด ์—…๋กœ๋“œ (pilot / internal)"]
    C --> D{"DEPLOY_MODE?"}
    D -->|store_only| E(["์—…๋กœ๋“œ๊นŒ์ง€๋งŒ โ€” ์ข…๋ฃŒ"])
    D -->|store_prepare| F["๋นŒ๋“œ ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ โ†’ deliver/promote(draft)"]
    D -->|store_submit| G["๋นŒ๋“œ ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ โ†’ deliver/promote(completed)"]
    F --> H(["์ œ์ถœ ์ง์ „ โ€” ์‚ฌ๋žŒ์ด ๋ฒ„ํŠผ ํด๋ฆญ"])
    G --> I(["์‹ฌ์‚ฌ ์ž๋™ ์ œ์ถœ โ€” Waiting for Review"])
Loading

๐Ÿ 4. iOS deliver ํ•ต์‹ฌ ์ฝ”๋“œ (์ธ๋ผ์ธ Fastfile)

iOS ์›Œํฌํ”Œ๋กœ์šฐ์˜ deploy_appstore lane ์ค‘ deliver ๋ถ€๋ถ„. 6๊ฐœ ์˜ต์…˜์ด ๊ฐ๊ฐ ํŠน์ • ์‹คํŒจ๋ฅผ ๋ง‰๋Š”๋‹ค โ€” ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ๊ทธ ๋‹จ๊ณ„์—์„œ ์‹คํŒจํ•œ๋‹ค.

# ๋ชจ๋“œ ํŒ์ • (store_* / appstore_* ๋ณ„์นญ ํ˜ธํ™˜)
deploy_mode = (ENV["DEPLOY_MODE"] || "testflight_only").strip
prepare_appstore = ["appstore_prepare","appstore_submit","store_prepare","store_submit"].include?(deploy_mode)
submit_to_appstore = ["appstore_submit","store_submit"].include?(deploy_mode)

# 1) TestFlight ์—…๋กœ๋“œ (ํ•ญ์ƒ). ASC ๋ชจ๋“œ๋ฉด ๋นŒ๋“œ ์ฒ˜๋ฆฌ ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ(deliver๊ฐ€ ๊ทธ ๋นŒ๋“œ๋ฅผ ๊ณจ๋ผ์•ผ ํ•˜๋ฏ€๋กœ)
pilot(
  api_key: api_key,
  app_identifier: app_id,                              # ์—†์œผ๋ฉด ๋น„๋Œ€ํ™”ํ˜• crash
  ipa: ENV["IPA_PATH"],
  changelog: ENV["RELEASE_NOTES"],
  skip_waiting_for_build_processing: !prepare_appstore # store_only๋ฉด ๋Œ€๊ธฐ ์•ˆ ํ•จ
)

if prepare_appstore
  # whatsNew(What's New) ๋ฉ”ํƒ€๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ƒ์„ฑ โ€” โš ๏ธ ๋กœ์ผ€์ผ์€ 'ko'๋งŒ ์œ ํšจ(ko-KR ๋ฌดํšจ)
  metadata_path = File.join(ENV["GITHUB_WORKSPACE"], "ios", "fastlane", "metadata")
  FileUtils.mkdir_p(File.join(metadata_path, "ko"))
  File.write(File.join(metadata_path, "ko", "release_notes.txt"), release_notes)
  # ์‹ฌ์‚ฌ Notes ์ดˆ๊ธฐํ™”(์ด์ „ ๊ฑฐ์ ˆ ์†Œ๋ช…์„œ ์ž๋™์Šน๊ณ„ ๋ฐฉ์ง€) โ€” notes.txt๋งŒ ๋น„์›€, ์—ฐ๋ฝ์ฒ˜ยท๋ฐ๋ชจ๋Š” ASC ๊ธฐ์กด๊ฐ’ ๋ณด์กด
  FileUtils.mkdir_p(File.join(metadata_path, "review_information"))
  File.write(File.join(metadata_path, "review_information", "notes.txt"), "")

  deliver(
    api_key: api_key,
    app_identifier: app_id,                 # [์›์ธ1] Bundle ID ๋ฏธ์ „๋‹ฌ โ†’ crash
    app_version: ENV["APP_VERSION"],        # [์›์ธ2] editable ๋ฒ„์ „ ์ž๋™ ์ƒ์„ฑ/์„ ํƒ
    build_number: ENV["BUILD_NUMBER"],      # [์›์ธ5] ๋นŒ๋“œ ๋ช…์‹œ ์„ ํƒ(skip_metadata:false๋ฉด ์ž๋™์„ ํƒ ๋ˆ„๋ฝ)
    submit_for_review: submit_to_appstore,  # store_submit์ด๋ฉด ์‹ฌ์‚ฌ ์ œ์ถœ
    automatic_release: submit_to_appstore,
    force: true,                            # CI ๋น„๋Œ€ํ™”ํ˜•
    run_precheck_before_submit: false,
    skip_binary_upload: true,               # pilot์œผ๋กœ ์˜ฌ๋ฆฐ ๋นŒ๋“œ ์‚ฌ์šฉ
    skip_metadata: false,                   # whatsNew/notes ์—…๋กœ๋“œ ์œ„ํ•ด false
    metadata_path: metadata_path,           # [์›์ธ3] ์ ˆ๋Œ€๊ฒฝ๋กœ (์ƒ๋Œ€๊ฒฝ๋กœ๋Š” CWD ์–ด๊ธ‹๋‚จ)
    skip_screenshots: true
    # app_review_information์€ ์•ˆ ๋„˜๊น€ โ†’ ASC ๊ธฐ์กด ์—ฐ๋ฝ์ฒ˜ยท๋ฐ๋ชจ๊ณ„์ • ๋ณด์กด(๊ฐœ์ธ์ •๋ณด ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐฉ์ง€)
  )
end

์›Œํฌํ”Œ๋กœ์šฐ step์ด deliver์— ๋„˜๊ธฐ๋Š” ENV (deploy-testflight job):

export APP_IDENTIFIER="com.alom.romrom"
export APP_VERSION="${{ needs.prepare-build.outputs.version }}"
export BUILD_NUMBER="${{ needs.prepare-build.outputs.build_number }}"
export DEPLOY_MODE="${{ env.DEPLOY_MODE }}"
export RELEASE_NOTES="$(cat final_release_notes.txt)"

๐Ÿค– 5. Android promote ํ•ต์‹ฌ ์ฝ”๋“œ (Fastfile.playstore)

deploy_mode = (ENV["DEPLOY_MODE"] || "store_submit").strip
promote = ["store_prepare","store_submit","appstore_prepare","appstore_submit"].include?(deploy_mode)
submit  = ["store_submit","appstore_submit"].include?(deploy_mode)

# Step1: internal ํŠธ๋ž™ ์—…๋กœ๋“œ (completed)
upload_to_play_store(package_name: 'com.alom.romrom', track: 'internal',
  aab: ENV["AAB_PATH"], json_key: ENV["GOOGLE_PLAY_JSON_KEY"], release_status: 'completed', ...)

next unless promote   # store_only๋ฉด ์—ฌ๊ธฐ์„œ ์ข…๋ฃŒ

# Step2: production ์Šน๊ธ‰ โ€” submit์ด๋ฉด completed(์‹ฌ์‚ฌ ์ž๋™๋“ฑ๋ก), prepare๋ฉด draft
promote_internal_to_production(promote_status: submit ? 'completed' : 'draft')
lane :promote_internal_to_production do |options|
  upload_to_play_store(
    track: 'internal', track_promote_to: 'production',
    track_promote_release_status: options[:promote_status] || 'completed',
    rollout: '1.0',
    changes_not_sent_for_review: false,        # ๋ณ€๊ฒฝ์„ ์‹ฌ์‚ฌ๋กœ ์ „์†ก
    rescue_changes_not_sent_for_review: false  # [๊ฑฐ์ง“์„ฑ๊ณต ์ฐจ๋‹จ] ์‹คํŒจ ์‹œ ์›Œํฌํ”Œ๋กœ์šฐ ๋นจ๊ฐ„๋ถˆ
  )
end

๊ฑฐ์ง“ ์„ฑ๊ณต์˜ ์ •์ฒด: fastlane supply์˜ rescue_changes_not_sent_for_review ๊ธฐ๋ณธ๊ฐ’์ด true๋ผ, Google API๊ฐ€ "changesNotSentForReview๋ฅผ true๋กœ ์„ค์ •ํ•˜๋ผ" ์—๋Ÿฌ๋ฅผ ๋‚ด๋ฉด fastlane์ด ์ž๋™ rescueํ•ด ์‹ฌ์‚ฌ ์•ˆ ๋ณด๋‚ด๊ณ  ์ €์žฅ๋งŒ ํ•œ ์ฑ„ success ๋ฐ˜ํ™˜ํ•œ๋‹ค. false๋กœ ๋ช…์‹œํ•ด์•ผ ์‹คํŒจ๊ฐ€ ํ‘œ๋ฉดํ™”๋œ๋‹ค.


โš ๏ธ 6. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… (์‹ค์ œ ๊ฒช์€ 6๊ฐœ ์›์ธ)

์ฆ์ƒ(๋กœ๊ทธ) ์›์ธ ํ•ด๊ฒฐ
Could not infer your App's Bundle Identifier deliver์— app_identifier ์—†์Œ(๋น„๋Œ€ํ™”ํ˜•) app_identifier ๋ช…์‹œ
Cannot submit for review - could not find an editable version App Store์— ํ•ด๋‹น ๋ฒ„์ „ ํŽ˜์ด์ง€ ์—†์Œ app_version ๋ช…์‹œ(์ž๋™ ์ƒ์„ฑ)
missing required attribute 'whatsNew' What's New ๋ฉ”ํƒ€ ๋ฏธ๋ฐ˜์˜(๊ฒฝ๋กœ ์–ด๊ธ‹๋‚จ) metadata_path ์ ˆ๋Œ€๊ฒฝ๋กœ
Unsupported directory name(s) ... ko-KR fastlane ๋ฏธ์ง€์› ๋กœ์ผ€์ผ ์ฝ”๋“œ ko๋งŒ ์‚ฌ์šฉ(ko-KR ๊ธˆ์ง€)
1.10.x ๋ฒ„์ „์— ์—‰๋šฑํ•œ ์ด์ „ ๋นŒ๋“œ๊ฐ€ ๋ถ™์Œ skip_metadata:false๋ฉด deliver๊ฐ€ ๋นŒ๋“œ ์ž๋™์„ ํƒ ๊ฑด๋„ˆ๋œ€ build_number ๋ช…์‹œ
Notes์— ์˜› ๊ฑฐ์ ˆ ์†Œ๋ช…์„œ๊ฐ€ ๋งค๋ฒˆ ๋‚จ์Œ ASC๊ฐ€ ์ด์ „ ๋ฒ„์ „ Notes ์ž๋™ ์Šน๊ณ„ review_information/notes.txt ๋นˆ ํŒŒ์ผ

Apple ๋นŒ๋“œ ์ฒ˜๋ฆฌ(Processing) ๋ณ‘๋ชฉ โ€” ์ฝ”๋“œ ๋ฌธ์ œ ์•„๋‹˜

store_prepare/store_submit์€ deliver๊ฐ€ "๋ฐฉ๊ธˆ ์˜ฌ๋ฆฐ ๊ทธ ๋นŒ๋“œ"(๊ฐ™์€ ๋ฒ„์ „ ์ •ํ•ฉ์„ฑ)๋ฅผ ๊ณจ๋ผ์•ผ ํ•˜๋ฏ€๋กœ pilot์ด ๊ทธ ๋นŒ๋“œ์˜ Processing โ†’ Complete๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์ด ์‹œ๊ฐ„์€ Apple ์„œ๋ฒ„ ์‚ฌ์ •(๋ณดํ†ต 5~15๋ถ„, ๋•Œ๋•Œ๋กœ 1์‹œ๊ฐ„+, ํ†ต์ œ ๋ถˆ๊ฐ€). CI๊ฐ€ "TestFlight ๋ฐฐํฌ" step์—์„œ ์˜ค๋ž˜ ๋ฉˆ์ถฐ๋„ hang์ด ์•„๋‹ˆ๋‹ค. ๊ธ‰ํ•˜๋ฉด store_only ์‚ฌ์šฉ. ๋‹จ๊ธฐ๊ฐ„ ์—ฐ์† ์—…๋กœ๋“œ๋Š” Processing ํ๋ฅผ ๋ฐ€๋ฆฌ๊ฒŒ ํ•˜๋ฏ€๋กœ ์ž์ œ.


โœ… 7. ์šด์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • main ๋ณ€๊ฒฝ ํ›„ deploy ๋ธŒ๋žœ์น˜์— ๋จธ์ง€ํ•ด์•ผ ๋ฐฐํฌ์— ๋ฐ˜์˜๋จ (ref: deploy)
  • ํ‰์†Œ ๊ธฐ๋ณธ: iOS store_prepare(์ œ์ถœ ์ง์ „, ์•ˆ์ „) / Android store_submit(์ž๋™ ์‹ฌ์‚ฌ)
  • ์‹ฌ์‚ฌ๊นŒ์ง€ ์ž๋™ ์›ํ•˜๋ฉด: iOS๋„ IOS_DEPLOY_MODE=store_submit ๋˜๋Š” dispatch์—์„œ ์„ ํƒ
  • ์ธ๋ผ์ธ Fastfile(์šด์˜) ์ˆ˜์ • ์‹œ wizard ํ…œํ”Œ๋ฆฟ๋„ ๋™๊ธฐํ™”
  • iOS ๋กœ์ผ€์ผ์€ ํ•ญ์ƒ ko(ko-KR ๊ธˆ์ง€), ๋‹ค๋ฅธ ๋กœ์ผ€์ผ์€ DELIVER_LOCALES ENV๋กœ ์ถ”๊ฐ€
  • ๊ฐœ์ธ์ •๋ณด(์—ฐ๋ฝ์ฒ˜ยท๋ฐ๋ชจ๊ณ„์ •)๋Š” ASC์—์„œ ๊ด€๋ฆฌ, ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€

๐Ÿ™‹โ€โ™‚๏ธ ๋‹ด๋‹น์ž

Metadata

Metadata

Assignees

Labels

๋ฌธ์„œ๋ฌธ์„œ ์ž‘์—… ๊ด€๋ จ์ž‘์—…์™„๋ฃŒ์ž‘์—… ์™„๋ฃŒ ์ƒํƒœ์ธ ๊ฒฝ์šฐ (์ด์Šˆ ํ์‡„)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions