๋ด ์ด๋ฆ์ Dmitry์ด๊ณ ํ์ฌ์์ ํ
์คํฐ๋ก ์ผํ๊ณ ์์ต๋๋ค.
๊ทธ ์ ์๋ ์ด๋ฏธ Android์ฉ Firebase Test Lab์ ์ฌ์ฉํด ๋ณด์๊ณ ๋ชจ๋ ๊ฒ์ด ์ ๋ง ๋ง์์ ๋ค์๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ iOS ํ ์คํธ ์ธํ๋ผ๋ฅผ ๋์ผํ ๋ ์ผ์ ๋ฐฐ์นํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ตฌ๊ธ๋ง์ ๋ง์ด ํด์ผ ํ๊ณ ์ฒ์์๋ ๋ชจ๋ ๊ฒ์ด ์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ํด์ผ ํ๋ ์ฌ๋๋ค์ ์ํด ํํ ๋ฆฌ์ผ ๊ธฐ์ฌ๋ฅผ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ฐ๋ผ์ iOS ํ๋ก์ ํธ์ ๋ํ UI ํ
์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ Good Corporation์์ ์ ๊ณตํ๋ ์ค์ ์ฅ์น์์ ์ด๋ฏธ ํ
์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ด์ฌ ์์ - ๊ณ ์์ด ๋ฐ์์ ํ์ํฉ๋๋ค.
์ด์ผ๊ธฐ์์ ์ ๋ ์ผ๋ถ ์์ค ๋ฐ์ดํฐ(GitHub์ ๊ฐ์ธ ์ ์ฅ์ ๋ฐ CircleCI ๋น๋ ์์คํ
)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ์ AmazingApp์ด๊ณ , bundleID๋ com.company.amazingapp์
๋๋ค. ํ์ ํผ๋์ ์ค์ด๊ธฐ ์ํด ์ด ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ธ์ฉํฉ๋๋ค.
ํ๋ก์ ํธ์์ ํน์ ์๋ฃจ์ ์ ๋ค๋ฅด๊ฒ ๊ตฌํํ ๊ฒฝ์ฐ ์๊ฒฌ์ ๊ฒฝํ์ ๊ณต์ ํ์ญ์์ค.
1. ํ ์คํธ ์์ฒด
UI ํ ์คํธ๋ฅผ ์ํ ์ ํ๋ก์ ํธ ๋ถ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค.
$ git checkout develop
$ git pull
$ git checkout -b โfeature/add-ui-testsโ
XCode์์ ํ๋ก์ ํธ๋ฅผ ์ด๊ณ UI ํ ์คํธ[XCode -> File -> New -> Target -> iOS Testing Bundle]๋ก ์ Target์ ๋ง๋ค๊ณ ์ด๋ฆ์ AmazingAppUITests๋ก ์ง์ ํฉ๋๋ค.
์์ฑ๋ Target์ Build Phases ์น์
์ผ๋ก ์ด๋ํ์ฌ Compile Sources - AmazingAppUITests.swift์์ Target Dependencies - AmazingApp์ ํ์ธํฉ๋๋ค.
๋ค์ํ ๋น๋ ์ต์ ์ ๋ณ๋์ ์ฒด๊ณ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. UI ํ ์คํธ [XCode -> Product -> Scheme -> New Scheme]์ ๋ํ ์คํค๋ง๋ฅผ ์์ฑํ๊ณ AmazingAppUITests๋ผ๋ ๋์ผํ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
์์ฑ๋ ์ฒด๊ณ์ ๋น๋์๋ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์(AmazingApp) ๋ฐ ๋์ UI ํ ์คํธ(AmazingAppUITests)๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์คํฌ๋ฆฐ์ท ์ฐธ์กฐ
๋ค์์ผ๋ก UI ํ
์คํธ๋ฅผ ์ํ ์ ๋น๋ ๊ตฌ์ฑ์ ๋ง๋ญ๋๋ค. Xcode์์ ํ๋ก์ ํธ ํ์ผ์ ํด๋ฆญํ๊ณ ์ ๋ณด ์น์
์ผ๋ก ์ด๋ํฉ๋๋ค. "+"๋ฅผ ํด๋ฆญํ๊ณ XCtest์ ๊ฐ์ ์ ๊ตฌ์ฑ์ ๋ง๋ญ๋๋ค. ์ฝ๋ ์๋ช
๊ณผ ๊ด๋ จํ์ฌ ํฌ๋ฒ๋ฆฐ๊ณผ ์ถค์ถ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ์์ผ๋ก ์ด๊ฒ์ด ํ์ํ ๊ฒ์
๋๋ค.
ํ๋ก์ ํธ์๋ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
, ๋จ์ ํ
์คํธ(๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๋ง์ฃ ?) ๋ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ
์คํธ์ Target UI์ ๊ฐ์ด ์ต์ํ ์ธ ๊ฐ์ง Target์ด ์์ต๋๋ค.
Target AmazingApp, Build Settings ํญ, Code Signing Identity ์น์ ์ผ๋ก ์ด๋ํฉ๋๋ค. XCtest ๊ตฌ์ฑ์ ๊ฒฝ์ฐ iOS ๊ฐ๋ฐ์๋ฅผ ์ ํํฉ๋๋ค. ์ฝ๋ ์๋ช ์คํ์ผ ์น์ ์์ ์๋์ ์ ํํฉ๋๋ค. ์์ง ํ๋ก๋น์ ๋ ํ๋กํ์ ์์ฑํ์ง ์์์ง๋ง ๋์ค์ ํ์คํ ๋ค์ ๋ง๋ค ๊ฒ์ ๋๋ค.
Target AmazingAppUITests์ ๊ฒฝ์ฐ์๋ ๋์ผํ ์์ ์ ์ํํ์ง๋ง Product Bundle Identifier ์ด์ com.company.amazingappuitests๋ฅผ ์ ๋ ฅํฉ๋๋ค.
2. Apple ๊ฐ๋ฐ์ ํ๋ก๊ทธ๋จ์์ ํ๋ก์ ํธ ์ค์
Apple ๊ฐ๋ฐ์ ํ๋ก๊ทธ๋จ ํ์ด์ง๋ก ์ด๋ํ์ฌ ์ธ์ฆ์, ์๋ณ์ ๋ฐ ํ๋กํ ์น์ ์ผ๋ก ์ด๋ํ ๋ค์ ์๋ณ์ ํญ๋ชฉ์ ์ฑ ID ์ด๋ก ์ด๋ํฉ๋๋ค. AmazingAppUITests ๋ฐ bundleID com.company.amazingappuitests๋ผ๋ ์ ์ฑ ID๋ฅผ ๋ง๋ญ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ๋ณ๋์ ์ธ์ฆ์๋ก ํ
์คํธ์ ์๋ช
ํ ๊ธฐํ๊ฐ ์์ง๋ง ... ํ
์คํธ๋ฅผ ์ํ ๋น๋ ์ ์ฐจ์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ฒด๋ฅผ ๋น๋ํ๊ณ ํ
์คํธ ๋ฌ๋๋ฅผ ๋น๋ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ๋์ ํ๋ก๋น์ ๋ ํ๋กํ์ผ๋ก ๋ ๊ฐ์ ๋ฒ๋ค ID๋ฅผ ์๋ช
ํ๋ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ๋คํํ๋ ๊ฐ๋จํ๊ณ ์ฐ์ํ ์๋ฃจ์
์ธ Wildcard App ID๊ฐ ์์ต๋๋ค. ์๋ก์ด App ID๋ฅผ ์์ฑํ๋ ์ ์ฐจ๋ฅผ ๋ฐ๋ณตํ๋ Explicit App ID ๋์ ์คํฌ๋ฆฐ์ท๊ณผ ๊ฐ์ด Wildcard App ID๋ฅผ ์ ํํฉ๋๋ค.
์ด ์์ ์์ ์ฐ๋ฆฌ๋ developer.apple.com์ ๋ํด ์์
์ ๋ง์ณค์ง๋ง ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์ต์ํํ์ง๋ ์์ ๊ฒ์
๋๋ค. ๊ฐ์
์ฃผ์ ๊น์ ๋ ์๋ ์ด ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Apple ๊ฐ๋ฐ์ ํ๋ก๊ทธ๋จ๊ณผ Github ๋ชจ๋์ ์ก์ธ์คํ ์ ์๋ ๊ฐ์ธ ์ ์ฅ์์ ๊ณ์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ์ฐ๋ฆฌ๋ (๊ฐ์๊ธฐ ๊ทธ๋ฐ ๊ฒ์ด ์๋ค๋ฉด) ๋ค์ ํ์์ ๊ณ์ ์ ๋ง๋ญ๋๋ค. [์ด๋ฉ์ผ ๋ณดํธ], ๊ฐ๋ ฅํ ์ํธ๋ฅผ ์ ์ํ๊ณ developer.apple.com์ ๋ฑ๋กํ ๋ค์ ํ๋ก์ ํธ ๊ด๋ฆฌ์๋ก ์ง์ ํฉ๋๋ค. ๋ค์์ผ๋ก ํ์ฌ์ github ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ๊ณ์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๊ณ AmazingAppMatch์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ ํ๋ผ์ด๋น ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค.
3. Fastlane ๋ฐ ๋งค์น ์ ํธ๋ฆฌํฐ ์ค์
ํฐ๋ฏธ๋์ ์ด๊ณ ํ๋ก์ ํธ๊ฐ ์๋ ํด๋๋ก ์ด๋ํ ๋ค์ ์ ํ์๋ ๋๋ก fastlane์ ์ด๊ธฐํํฉ๋๋ค.
$ fastlane init
์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ์ฉ ๊ตฌ์ฑ์ ์ ํํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ๋ค ๋ฒ์งธ ํญ๋ชฉ์ธ ํ๋ก์ ํธ ์๋ ๊ตฌ์ฑ์ ์ ํํฉ๋๋ค.
Appfile๊ณผ Fastfile์ด๋ผ๋ ๋ ๊ฐ์ ํ์ผ์ด ์๋ ์๋ก์ด fastlane ๋๋ ํ ๋ฆฌ๊ฐ ํ๋ก์ ํธ์ ๋ํ๋ฌ์ต๋๋ค. ๊ฐ๋จํ ๋งํด์ Appfile์ ์๋น์ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ Fastfile์ ๋ ์ธ์ด๋ผ๋ Fastlane ์ฉ์ด๋ก ์์
์ ์์ฑํฉ๋๋ค. ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฆ๊ฒจ ์ฌ์ฉํ๋ ํ ์คํธ ํธ์ง๊ธฐ์์ Appfile์ ์ด๊ณ ๋ค์ ํ์์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "[email protected]" # ะกะพะทะดะฐะฝะฝัะน ะธะฝััะฐััััะบัััะฝัะน ะฐะบะบะฐัะฝั, ะธะผะตััะธะน ะฟัะฐะฒะพ ะฝะฐ ัะตะดะฐะบัะธัะพะฒะฐะฝะธะต iOS ะฟัะพะตะบัะฐ ะฒ Apple Developer Program.
team_id "LSDY3IFJAY9" # Your Developer Portal Team ID
ํฐ๋ฏธ๋๋ก ๋์๊ฐ ๊ณต์ ๋งค๋ด์ผ์ ๋ฐ๋ผ ๊ฒฝ๊ธฐ ์ค์ ์ ์์ํฉ๋๋ค.
$ fastlane match init
$ fastlane match development
๋ค์์ผ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ, ๊ณ์ , ๋น๋ฐ๋ฒํธ ๋ฑ ์์ฒญ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
์ค์ : ์ผ์น ์ ํธ๋ฆฌํฐ๋ฅผ ์ฒ์ ์คํํ๋ฉด ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํด๋ ํ๊ธฐ ์ํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ด ์ํธ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ฉฐ CI ์๋ฒ ์ค์ ๋จ๊ณ์์ ํ์ํฉ๋๋ค!
fastlane ํด๋์ Matchfile์ด๋ผ๋ ์ ํ์ผ์ด ๋ํ๋ฌ์ต๋๋ค. ์ฆ๊ฒจ ์ฌ์ฉํ๋ ํ ์คํธ ํธ์ง๊ธฐ์์ ์ด๊ณ ๋ค์ ํ์์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.
git_url("https://github.com/YourCompany/AmazingAppMatch") #ะกะพะทะดะฐะฝะฝัะน ะฟัะธะฒะฐัะฝัะน ัะตะฟะพะทะธัะพัะธะน ะดะปั ั
ัะฐะฝะตะฝะธั ัะตััะธัะธะบะฐัะพะฒ ะธ ะฟัะพัะฐะนะปะพะฒ.
type("development") # The default type, can be: appstore, adhoc, enterprise or development
app_identifier("com.company.amazingapp")
username("[email protected]") # Your Infrastructure account Apple Developer Portal username
์์ผ๋ก Crashlytics ๋ฐ/๋๋ AppStore์ ์ ๋ก๋ํ๊ธฐ ์ํด ๋น๋์ ์๋ช ํ๊ธฐ ์ํด(์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค ID์ ์๋ช ํ๊ธฐ ์ํด) match๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ด ๋ฐฉ์์ผ๋ก ์ฑ์๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ ํ ์คํธ ๋น๋์ ์๋ช ํ๊ธฐ ์ํด ํน๋ณํ ์์ผ๋์นด๋ ID๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ฐ๋ผ์ Fastfile์ ์ด๊ณ ์ ๋ ์ธ์ ์ ๋ ฅํ์ญ์์ค.
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # ัะพะทะดะฐะตะผ ะพัะดะตะปัะฝัะน ะฑัะฐะฝั ะดะปั development ัะตััะธัะธะบะฐัะฐ ะดะปั ะฟะพะดะฟะธัะธ ัะตััะพะฒะพะน ัะฑะพัะบะธ.
)
end
์ ์ฅ, ํฐ๋ฏธ๋์ ์ ๋ ฅ
fastlane testing_build_for_firebase
fastlane์ด ์ ์ธ์ฆ์๋ฅผ ์์ฑํ๊ณ ์ ์ฅ์์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ํ์ธํฉ๋๋ค. ์์ฒญ๋!
XCode๋ฅผ ์ฝ๋๋ค. ์ด์ AmazingApp ๋ฐ AmazingAppUITests ๋์์ ๋ํ ํ๋ก๋น์ ๋ ํ๋กํ ์น์ ์ ์ง์ ํด์ผ ํ๋ Match Development com.company.* ์ ํ์ ํ์ ํ๋ก๋น์ ๋ ํ๋กํ์ด ์์ต๋๋ค.
ํ
์คํธ๋ฅผ ๋น๋ํ๊ธฐ ์ํด ๋ ์ธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ฐ์
์๋ ์์ ์์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ด ๋ ์ธ testing_build_for_firebase๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ด๋๋ก ํฉ๋๋ค.
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests"
)
scan(
scheme: 'AmazingAppUITests', # UI Test scheme
clean: true, # Recommended: This would ensure the build would not include unnecessary files
skip_detect_devices: true, # Required
build_for_testing: true, # Required
sdk: 'iphoneos', # Required
should_zip_build_products: true, # Must be true to set the correct format for Firebase Test Lab
)
firebase_test_lab_ios_xctest(
gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (ะบ ััะพะน ัััะพัะบะต ะฒะตัะฝะตะผัั ะฟะพะทะถะต)
devices: [ # Device(s) to run tests on
{
ios_model_id: 'iphonex', # Device model ID, see gcloud command above
ios_version_id: '12.0', # iOS version ID, see gcloud command above
locale: 'en_US', # Optional: default to en_US if not set
orientation: 'portrait' # Optional: default to portrait if not set
}
]
)
end
CircleCI์์ fastlane ์ค์ ์ ๋ํ ์ ์ฒด ์ ๋ณด๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค.
config.yml์ ์ ์์ ์ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
build-for-firebase-test-lab:
macos:
xcode: "10.1.0"
working_directory: ~/project
shell: /bin/bash --login -o pipefail
steps:
- checkout
- attach_workspace:
at: ~/project
- run: sudo bundle install # ะพะฑะฝะพะฒะปัะตะผ ะทะฐะฒะธัะธะผะพััะธ
- run:
name: install gcloud-sdk # ะฝะฐ mac ะผะฐัะธะฝั ะฝะตะพะฑั
ะพะดะธะผะพ ัััะฐะฝะพะฒะธัั gcloud
command: |
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null
brew cask install google-cloud-sdk
- run:
name: build app for testing
command: fastlane testing_build_for_firebase # ะทะฐะฟััะบะฐะตะผ lane ัะฑะพัะบะธ ะธ ะพัะฟัะฐะฒะบะธ ะฒ firebase
4. ํ ์คํธ ์คํ ๋๋ ์ด๋ป์ต๋๊น? Firebase ์ค์ .
์ค์ ๋ก ๊ธฐ์ฌ๊ฐ ์์ฑ๋ ๋ด์ฉ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
์ฑ์์ ๋ฌด๋ฃ ์๊ธ์ ๋ก Firebase๋ฅผ ์ฌ์ฉ ์ค์ด๊ฑฐ๋ Firebase๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ ์ ์์ต๋๋ค. ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ ์ ํ ์์ต๋๋ค. ํ ์คํธ์ ํ์์ฑ์ ๋ฐ๋ผ XNUMX๋ ๋์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ ๋ณ๋์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(๋ฉ์ง์ฃ ?).
์ธํ๋ผ ๊ณ์ (๋๋ ๋ค๋ฅธ ๊ณ์ , ์๊ด ์์)์ ๋ก๊ทธ์ธํ๊ณ ๋ค์์ผ๋ก ์ด๋ํฉ๋๋ค.
์ค์ : ์ด์ ๋จ๊ณ์์ ๋ ์ธ firebase_test_lab_ios_xctest์ Fastfile์์ gcp_project ๋งค๊ฐ๋ณ์๋ ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ ์ค์ ์ ์ฐ๋ฆฌ์๊ฒ ์ ํฉํฉ๋๋ค.
์ฐ๋ฆฌ๋ ํญ์ ๋ซ์ง ์๊ณ ๋์ผํ ๊ณ์ ์ผ๋ก ๋ฑ๋กํฉ๋๋ค
Google์ 300๋ ๋์ 1๋ฌ๋ฌ๋ฅผ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ฉฐ, ์ด๋ ์๋ ํ ์คํธ๋ฅผ ์ํํ๋ ๋งฅ๋ฝ์์ 300๋ ๋์ ์๋น์ค๋ฅผ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ฒฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ณ $XNUMX์ ํ ์คํธ ์๊ฐ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ณ์ ์ $XNUMX๋ฅผ ๋ฐ์ต๋๋ค. XNUMX๋ ํ ํ๋ก์ ํธ๋ ์๋์ผ๋ก ๋ฌด๋ฃ ์๊ธ์ ๋ก ์ด์ ๋๋ฏ๋ก ์์ค ๊ฐ๋ฅ์ฑ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
Firebase ํ๋ก์ ํธ๊ฐ ์๋ ํญ์ผ๋ก ๋์๊ฐ Blaze ์๊ธ์ ๋ก ์ ํํด ๋ณด๊ฒ ์ต๋๋ค. ์ด์ ํ๋๋ฅผ ์ด๊ณผํ๋ฉด ์ง๋ถํด์ผ ํ ๊ฒ์ด ์์ต๋๋ค.
gcloud ์ธํฐํ์ด์ค์์ Firebase ํ๋ก์ ํธ๋ฅผ ์ ํํ๊ณ "Catalogue" ๊ธฐ๋ณธ ๋ฉ๋ด ํญ๋ชฉ์ ์ ํํ ๋ค์ Cloud Testing API ๋ฐ Cloud Tools Result API๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ฉ๋ด ํญ๋ชฉ "IAM ๋ฐ ๊ด๋ฆฌ" -> ์๋น์ค ๊ณ์ -> ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ๋ก ์ด๋ํฉ๋๋ค. ํ๋ก์ ํธ๋ฅผ ํธ์งํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
JSON ํ์์ผ๋ก API ํค ์์ฑ
๋์ค์ ๋ค์ด๋ก๋ํ JSON์ด ํ์ํ์ง๋ง ์ง๊ธ์ Test Lab ์ค์ ์ด ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
5. CircleCI ์ค์ ํ๊ธฐ
ํฉ๋ฆฌ์ ์ธ ์ง๋ฌธ์ด ๋ ์ค๋ฅด๊ณ ์์ต๋๋ค. ๋น๋ฐ๋ฒํธ๋ก ๋ฌด์์ ํด์ผ ํ ๊น์? ์ํธ ๋ฐ ๊ธฐํ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์งํ๋ ค๋ฉด ๋น๋ ๋จธ์ ์ ํ๊ฒฝ ๋ณ์ ๋ฉ์ปค๋์ฆ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. CircleCI ํ๋ก์ ํธ ์ค์ ์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
- ํค: GOOGLE_APPLICATION_CREDENTIALS
๊ฐ: gcloud ์๋น์ค ๊ณ์ ํค json ํ์ผ์ ๋ด์ฉ - ํค: MATCH_PASSWORD
๊ฐ: ์ธ์ฆ์๋ก github ์ ์ฅ์๋ฅผ ํด๋ ํ๊ธฐ ์ํ ์ํธ - ํค: FASTLANE_PASSWORD
๊ฐ: Apple ๊ฐ๋ฐ์ ํฌํธ ์ธํ๋ผ ๊ณ์ ๋น๋ฐ๋ฒํธ
๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ๊ณ PR์ ๋ง๋ ๋ค์ ๊ฒํ ๋ฅผ ์ํด ํ์ฅ์๊ฒ ๋ณด๋ ๋๋ค.
๊ฒฐ๊ณผ
์ด๋ฌํ ๊ฐ๋จํ ์กฐ์์ ๊ฒฐ๊ณผ ํ ์คํธ ์ ์ฅ์น ํ๋ฉด์ ๋น๋์ค๋ฅผ ๋ นํํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋ ์์ ์ ์ด๊ณ ์์ ์ ์ธ ์์ ์คํ ๋๋ฅผ ์ป์์ต๋๋ค. ํ ์คํธ ์ฌ๋ก์์๋ iPhone X ์ฅ์น ๋ชจ๋ธ์ ์ง์ ํ์ง๋ง ํ์ ๋ค์ํ ๋ชจ๋ธ๊ณผ iOS ๋ฒ์ ์ ์กฐํฉ์์ ํ๋ถํ ์ ํ์ ์ ๊ณตํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ถ๋ถ์์๋ Android ํ๋ก์ ํธ์ฉ Firebase Test Lab์ ๋จ๊ณ๋ณ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
์ถ์ฒ : habr.com