Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

๋‚ด ์ด๋ฆ„์€ Dmitry์ด๊ณ  ํšŒ์‚ฌ์—์„œ ํ…Œ์Šคํ„ฐ๋กœ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. MEL ๊ณผํ•™. ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ €๋Š” Firebase ํ…Œ์ŠคํŠธ ๋žฉ - ์ฆ‰, ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ธ XCUITest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„๊ตฌ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์ „์—๋Š” ์ด๋ฏธ 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๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

์ƒ์„ฑ๋œ Target์˜ Build Phases ์„น์…˜์œผ๋กœ ์ด๋™ํ•˜์—ฌ Compile Sources - AmazingAppUITests.swift์—์„œ Target Dependencies - AmazingApp์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋นŒ๋“œ ์˜ต์…˜์„ ๋ณ„๋„์˜ ์ฒด๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. UI ํ…Œ์ŠคํŠธ [XCode -> Product -> Scheme -> New Scheme]์— ๋Œ€ํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  AmazingAppUITests๋ผ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์ฒด๊ณ„์˜ ๋นŒ๋“œ์—๋Š” ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Œ€์ƒ(AmazingApp) ๋ฐ ๋Œ€์ƒ UI ํ…Œ์ŠคํŠธ(AmazingAppUITests)๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท ์ฐธ์กฐ

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

๋‹ค์Œ์œผ๋กœ UI ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ƒˆ ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Xcode์—์„œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ํด๋ฆญํ•˜๊ณ  ์ •๋ณด ์„น์…˜์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. "+"๋ฅผ ํด๋ฆญํ•˜๊ณ  XCtest์™€ ๊ฐ™์€ ์ƒˆ ๊ตฌ์„ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์„œ๋ช…๊ณผ ๊ด€๋ จํ•˜์—ฌ ํƒฌ๋ฒ„๋ฆฐ๊ณผ ์ถค์ถ”๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ ์ด๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

ํ”„๋กœ์ ํŠธ์—๋Š” ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์ฃ ?) ๋ฐ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ…Œ์ŠคํŠธ์˜ 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๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ณ„๋„์˜ ์ธ์ฆ์„œ๋กœ ํ…Œ์ŠคํŠธ์— ์„œ๋ช…ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์ง€๋งŒ ... ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋นŒ๋“œ ์ ˆ์ฐจ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํŒŒ์ผ๋กœ ๋‘ ๊ฐœ์˜ ๋ฒˆ๋“ค ID๋ฅผ ์„œ๋ช…ํ•˜๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ๊ฐ„๋‹จํ•˜๊ณ  ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์ธ Wildcard App ID๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด App ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๋ฐ˜๋ณตํ•˜๋˜ Explicit App ID ๋Œ€์‹  ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๊ฐ™์ด Wildcard App ID๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” developer.apple.com์— ๋Œ€ํ•ด ์ž‘์—…์„ ๋งˆ์ณค์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ์ตœ์†Œํ™”ํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ž Fastlane์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ Match ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ๋Œ€ํ•ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ์œผ์‹ญ์‹œ์˜ค.

์ฃผ์˜ ๊นŠ์€ ๋…์ž๋Š” ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Apple ๊ฐœ๋ฐœ์ž ํ”„๋กœ๊ทธ๋žจ๊ณผ Github ๋ชจ๋‘์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ์™€ ๊ณ„์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” (๊ฐ‘์ž๊ธฐ ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์—†๋‹ค๋ฉด) ๋‹ค์Œ ํ˜•์‹์˜ ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. [์ด๋ฉ”์ผ ๋ณดํ˜ธ], ๊ฐ•๋ ฅํ•œ ์•”ํ˜ธ๋ฅผ ์ œ์‹œํ•˜๊ณ  developer.apple.com์— ๋“ฑ๋กํ•œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํšŒ์‚ฌ์˜ github ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ„์ • ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  AmazingAppMatch์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ƒˆ ํ”„๋ผ์ด๋น— ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

3. Fastlane ๋ฐ ๋งค์น˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ค์ •

ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ํด๋”๋กœ ์ด๋™ํ•œ ๋‹ค์Œ ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ fastlane์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋งค๋‰ด์–ผ. ๋ช…๋ น์–ด ์ž…๋ ฅ ํ›„

$ fastlane init

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ๊ตฌ์„ฑ์„ ์„ ํƒํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋„ค ๋ฒˆ์งธ ํ•ญ๋ชฉ์ธ ํ”„๋กœ์ ํŠธ ์ˆ˜๋™ ๊ตฌ์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

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.* ์œ ํ˜•์˜ ํ•„์ˆ˜ ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํ•„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

ํ…Œ์ŠคํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ž ์ €์žฅ์†Œ Firebase Test Lab์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์ง€์นจ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” fastlane ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์›๋ž˜ ์˜ˆ์ œ์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์–ด ๋ ˆ์ธ 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 ์ฝ˜์†” ํŽ˜์ด์ง€. AmazingAppUITests๋ผ๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ค‘์š” : ์ด์ „ ๋‹จ๊ณ„์—์„œ ๋ ˆ์ธ firebase_test_lab_ios_xctest์˜ Fastfile์—์„œ gcp_project ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

๊ธฐ๋ณธ ์„ค์ •์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํƒญ์„ ๋‹ซ์ง€ ์•Š๊ณ  ๋™์ผํ•œ ๊ณ„์ •์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค ์ง€ํด๋ผ์šฐ๋“œ Firebase์™€์˜ ํ†ต์‹ ์€ gcloud ์ฝ˜์†” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ํ•„์š”ํ•œ ์กฐ์น˜์ž…๋‹ˆ๋‹ค.

Google์€ 300๋…„ ๋™์•ˆ 1๋‹ฌ๋Ÿฌ๋ฅผ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋Š” ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋งฅ๋ฝ์—์„œ 300๋…„ ๋™์•ˆ ์„œ๋น„์Šค๋ฅผ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  $XNUMX์˜ ํ…Œ์ŠคํŠธ ์ƒ๊ฐ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ณ„์ •์— $XNUMX๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. XNUMX๋…„ ํ›„ ํ”„๋กœ์ ํŠธ๋Š” ์ž๋™์œผ๋กœ ๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ ์ด์ „๋˜๋ฏ€๋กœ ์†์‹ค ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Firebase ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ํƒญ์œผ๋กœ ๋Œ์•„๊ฐ€ Blaze ์š”๊ธˆ์ œ๋กœ ์ „ํ™˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ง€๋ถˆํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud ์ธํ„ฐํŽ˜์ด์Šค์—์„œ Firebase ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  "Catalogue" ๊ธฐ๋ณธ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์„ ํƒํ•œ ๋‹ค์Œ Cloud Testing API ๋ฐ Cloud Tools Result API๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฉ”๋‰ด ํ•ญ๋ชฉ "IAM ๋ฐ ๊ด€๋ฆฌ" -> ์„œ๋น„์Šค ๊ณ„์ • -> ์„œ๋น„์Šค ๊ณ„์ • ๋งŒ๋“ค๊ธฐ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

JSON ํ˜•์‹์œผ๋กœ API ํ‚ค ์ƒ์„ฑ

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ

๋‚˜์ค‘์— ๋‹ค์šด๋กœ๋“œํ•œ JSON์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ Test Lab ์„ค์ •์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

5. CircleCI ์„ค์ •ํ•˜๊ธฐ

ํ•ฉ๋ฆฌ์ ์ธ ์งˆ๋ฌธ์ด ๋– ์˜ค๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ์š”? ์•”ํ˜ธ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋นŒ๋“œ ๋จธ์‹ ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. CircleCI ํ”„๋กœ์ ํŠธ ์„ค์ •์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Firebase Test Lab์—์„œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒํŠธ 1: iOS ํ”„๋กœ์ ํŠธ
๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ํ‚ค: GOOGLE_APPLICATION_CREDENTIALS
    ๊ฐ’: gcloud ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค json ํŒŒ์ผ์˜ ๋‚ด์šฉ
  • ํ‚ค: MATCH_PASSWORD
    ๊ฐ’: ์ธ์ฆ์„œ๋กœ github ์ €์žฅ์†Œ๋ฅผ ํ•ด๋…ํ•˜๊ธฐ ์œ„ํ•œ ์•”ํ˜ธ
  • ํ‚ค: FASTLANE_PASSWORD
    ๊ฐ’: Apple ๊ฐœ๋ฐœ์ž ํฌํ„ธ ์ธํ”„๋ผ ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ

๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ณ  PR์„ ๋งŒ๋“  ๋‹ค์Œ ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด ํŒ€์žฅ์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์กฐ์ž‘์˜ ๊ฒฐ๊ณผ ํ…Œ์ŠคํŠธ ์‹œ ์žฅ์น˜ ํ™”๋ฉด์— ๋น„๋””์˜ค๋ฅผ ๋…นํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์•ˆ์ •์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์ž‘์—… ์Šคํƒ ๋“œ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์—์„œ๋Š” iPhone X ์žฅ์น˜ ๋ชจ๋ธ์„ ์ง€์ •ํ–ˆ์ง€๋งŒ ํŒœ์€ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๊ณผ iOS ๋ฒ„์ „์˜ ์กฐํ•ฉ์—์„œ ํ’๋ถ€ํ•œ ์„ ํƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ๋Š” Android ํ”„๋กœ์ ํŠธ์šฉ Firebase Test Lab์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€