
èæ¯
1幎ååãiOS FunCorpããŒã ã¯ãiOSããã³Androidãããžã§ã¯ãã®ã·ã³ãã«ãªCIçµç¹åãã®æ°ãããµãŒãã¹ã«ç§»è¡ããŸããã
ãã以åã¯ãBambooã§CIã䜿çšããŠããŸããããå€ãã®åé¡ããã£ããããå®å
šã«æŸæ£ããŠBuddyBuildã«åãæ¿ããŸããã
CIãäœã§ããããã¢ããªã±ãŒã·ã§ã³ãAppStoreã«ã¢ããããŒãããæ¹æ³ãç¥ãããšããã§ããªãã£ããããã³ãŒãããã¹ããããã³è£œåéçºãå·éã«åŠçã§ããã»ã©åçŽã«æ©èœããŠããŸããã
ããããæ代ã¯å€ãã£ãŠãããBudduBuildã¯åãã§ã¯ãªããããå¥ã®æ¹æ³ãæ¢ãå§ããŸããã
ãã®èšäºã§ã¯ãããŒã ãéžæããæ°ãããœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããç¬èªã«CIãæŽçããããã®ã¹ã¯ãªãããæäŸããŸãã
è¯ããšããæå³
BuddyBuildã§ã¯ãã·ã³ãã«ãã«æ¹ãããŸããã ãŸããããã€ãã®æé ãå®è¡ããå¿
èŠããããŸãã
- GitHub / GitLab / BitBucketçµç±ã§ãã°ã€ã³ããŸãã
- ãããžã§ã¯ãã§ãªããžããªãæå®ããŸãã
- ãµãŒãã¹ã«ã¢ã«ãŠã³ããšé
åžèšŒææžãäžããŸãã
- ãµãŒãã¹ã®åŽã§ãéæ³ãèµ·ããããŸã§åŸ
ã¡ãŸãã
ãã®åŸããã«ããã¹ãŠã®ãã©ã³ãã§ãã¹ããšã¢ãŒãã£ãã¡ã¯ããååŸããæ確ãªUIã䜿çšããŠã¢ã»ã³ããªã«ãŒã«ãæ§æããXcodeããŒãžã§ã³ããã°ããåãæ¿ããŠãAppStore / TestFlightã§ãµãŒãã¹ããçŽæ¥ãªãªãŒã¹ã§ããŸãã
BuddyBuildã®äœ¿çšãéå§ãããšããç¡æã§äœ¿çšã§ããŸããããæ°ãæåŸã«çµäºããŸããã çŸåšãã¹ã¿ãŒã¿ãŒããã¯ã¯æé¡79ãã«ã§ãã ç§ãã¡èªèº«ã®ããã«ã279ãã«ã§3ã€ã®ç«¶äºåã®ãããã«ãã®ãã©ã³ãéžã³ãŸããã
BuddyBuildã¯ããŸãæ©èœããŸããããé·ç¶ãããŸããã§ããã
ãµãŒãã¹ã®äººæ°ã®é«ãŸããšãiFunnyã®ã³ãŒãéã®å¢å ã«ããããã«ãæéã¯ãã¹ãããã³ã¢ãŒãã£ãã¡ã¯ãã®ãã«ãã®å®å®ãã20åãã70åã«å¢å ããŸããã
ãµãŒãã¹ã䜿çšããŠãã£ãã·ã³ã°ã®ãœãªã¥ãŒã·ã§ã³ãèŠã€ããããšããŸããããåçŽãªèšå®ã§ã¯äŸ¡å€ã®ãããã®ã¯èŠã€ãããŸããã§ããã
äžæ¹ãAppleã¯ãã®ãµãŒãã¹ã賌å
¥ããç§ãã¡ã¯ãããæŸæ£ãããšããæçµæ±ºå®ãäžããŸããã
CI / CDã®èŠä»¶
CIã®ä»¥åã®çµéšã«åºã¥ããŠãæ°ããã·ã¹ãã ã«ã¯ããã€ãã®èŠä»¶ããããŸããã
- ãšãŒãžã§ã³ãUIãžã®ã¢ã¯ã»ã¹æ°ãæå°éã«æããŠããšãŒãžã§ã³ããšãã«ãç°å¢ãè¿
éã«å±éããå¿
èŠããããŸãã
- ãšãŒãžã§ã³ãUIãå
¥åããã«XcodeãæŽæ°ããè€æ°ã®ããŒãžã§ã³ãåãæ¿ããããšãã§ããŸãã
- ãã«ãªã¯ãšã¹ããšçµ±åããŸãã
- AppStoreã§ã®ã¢ã»ã³ããªãšã¢ã³ããŒãã«ã¯ãå°ãªããšããµãŒãããŒãã£ã®äŸåé¢ä¿ã䜿çšããŸãã
- ããŸããŸãªãã©ã³ãã®ãã«ãæé ãã«ã¹ã¿ãã€ãºããã³ã«ã¹ã¿ãã€ãºããæ©èœããããŸãã
- UIã®ãã¿ã³ã®ã¿ã§ãææç©ã®ã¢ã»ã³ããªãéå§ããŸãã
Gitlab CI
BuddyBuildãæŸæ£ãã決å®ãšãšãã«ãã¢ã€ãã¢ã¯GitHubããGitLabã«ç§»è¡ããããã«ãªããæ¢ã«çµã¿èŸŒã¿ã®CI / CDã·ã¹ãã ããããŸããã€ãŸããããŒãžãªã¯ãšã¹ãã«å¿
èŠãªçµ±åããããŸãã
ãšãŒãžã§ã³ãã®äœæ¥ç°å¢ãèšå®ãã
ãŸããç»é¢å
±æã䜿çšããŠSSHçµç±ã§ãšãŒãžã§ã³ãã«ã¢ã¯ã»ã¹ã§ããããã«ããå¿
èŠããããŸãã ããã¯ãå
±æèšå®ã§è¡ãããŸãã

ããã§ãCIãšãŒãžã§ã³ãã«æ¥ç¶ããããã«ãã¿ãŒããã«ãšSSHã¯ã©ã€ã¢ã³ãã䜿çšã§ããŸãã
ssh user@local.ip
SSHçµç±ã§æ£åžžã«æ¥ç¶ããåŸãsudoã³ãã³ãã®ãã¹ã¯ãŒã䜿çšãç¡å¹ã«ããå¿
èŠããããŸãã ããã¯å®å
šã§ã¯ãªãããã«æãããããããŸããããç§ãã¡ãšäžç·ã«ãããã¹ãŠã®ãšãŒãžã§ã³ãã¯ããŒã«ã«ãããã¯ãŒã¯å
ã§ã®ã¿å©çšå¯èœã§ããããšãèæ
®ããŠãèªååãæ¹åããããã«sudoã®ãã¹ã¯ãŒããç¡å¹ã«ããŸãã ãããè¡ãã«ã¯ïŒ
sudo visudo
æšæºã®Vimãšãã£ã¿ãŒãéããŸããããã§ãè¡ãå€æŽããå¿
èŠããããŸãã
%admin ALL = (ALL) ALL
è¡ããš
%admin ALL = (ALL) NOPASSWD: ALL
å€ãã®iOSéçºè
ã¯ã³ã³ãœãŒã«ãæãäžããããšã奜ã¿ãŸããããVimã䜿çšããããšã¯ãã£ãã«ãªãããããããã®è¡ãå€æŽããæ¹æ³ã«ã€ããŠæ®µéçãªæ瀺ãä¿æããŠãã ããã
- iãæŒããŠãæ¿å
¥ã¢ãŒãã«å
¥ããŸãã
- ç¢å°ã§ç®çã®è¡ãèŠã€ããŠå€æŽããŸãã
- 次ãž
- å
¥åããŠïŒwãä¿åããŸãã
- visudoãçµäºããã«ã¯ãqãå
¥åããŸãã
ãŸããåãšãŒãžã§ã³ãã«Homebrewããã±ãŒãžãããŒãžã£ãŒãå¿
èŠã§ããããã¯ã次ã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ã§ããŸãã
sudo echo | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
ããã§ã¯echoã³ãã³ãã䜿çšããŠãã€ã³ã¹ããŒã«ç¢ºèªã¡ãã»ãŒãžã衚瀺ãããªãããã«ããŸãã
ãã®åŸãHomebrewããå¿
èŠãªæå°éã®äŸåé¢ä¿ãèšå®ã§ããŸãã éžæãããã®ã¯æ¬¡ã®ãšããã§ãã
- XCPretty ããã«ãããxcodebuild iOSãããžã§ã¯ãã®ãã«ãçšã®æšæºã³ãã³ãã®åºåããããã«ãã©ãŒãããã§ããŸãã
sudo gem install xcpretty
- fastlane ã ãããžã§ã¯ãã®ãã«ããå€éšã®äœãã«å€§ããäŸåããããšãæãŸãªãããããã®æ©èœã¯æå°éã«äœ¿çšããŸãã
sudo gem install fastlane
- xcode-install ã ãã®ããŒã«ã䜿çšãããšãAppStoreã«ã¢ã¯ã»ã¹ããã«Xcodeãã€ã³ã¹ããŒã«ããè€æ°ã®ããŒãžã§ã³ãåãæ¿ããããšãã§ããŸãã
sudo gem install xcode-install
- CocoaPods ãã®äŸåé¢ä¿ãããŒãžã£ãŒã¯ããã¹ãŠã®iOSéçºè
ã«ãªãã¿ããããŸãã
sudo gem install cocoapods
ããã§ã次ã®ã³ãã³ããé çªã«å®è¡ããŠXcodeãã€ã³ã¹ããŒã«ã§ããŸãã
export FASTLANE_USER="your@account.todevapple" export FASTLANE_PASSWORD="yourpasswordtoaccont" xcversion install 9.2
ãšã¯ã¹ããŒããå®è¡ããããšã¯ã§ããŸããããã€ã³ã¹ããŒã«ããã»ã¹äžã«Apple IDã®é»åã¡ãŒã«ãšãã¹ã¯ãŒããèŠæ±ãããŸãã
ãããã®ç°¡åãªæé ãå®äºãããšããšãŒãžã§ã³ãã¯å€§éšåã®iOSãããžã§ã¯ããåéããæºåãæŽããŸãã
ãšãŒãžã§ã³ãç»é²
ãšãŒãžã§ã³ããGitlab CIã§ãããžã§ã¯ãã衚瀺ããã«ã¯ããããžã§ã¯ããã€ã³ã¹ããŒã«ããŠç»é²ããå¿
èŠããããŸãã
ããã¯ãSSHãšãšãŒãžã§ã³ãã®ã³ãã³ãã©ã€ã³ã䜿çšããŠè¡ãããšãã§ããŸãã
ãŸãããšãŒãžã§ã³ããããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64
ç§ãã¡ã¯å®è¡ããæš©å©ãäžããŸãïŒ
chmod +x /usr/local/bin/gitlab-runner
gitlab-runnerããµãŒãã¹ãšããŠã€ã³ã¹ããŒã«ããŠå®è¡ããŸãã
gitlab-runner install gitlab-runner start
次ã«ãCIã«ã©ã³ããŒãç»é²ããå¿
èŠããããŸããããã¯ã次ã®ã³ãã³ãã§å®è¡ãããŸãã
gitlab-runner register -n --url CI_URL --registration-token TOKEN --tag-list fastlane,cocoapods,osx_10-13,xcode_9-2 --executor shell
ããã¯ã詳现ã«èª¬æããå¿
èŠãããããŒã ã§ãã
CI_URLãšTOKENã¯ãGitLabã®ãããžã§ã¯ãèšå®ã§ååŸã§ããŸãã
èšå®-> CI / CD->ã©ã³ããŒ->ç¹å®ã®ã©ã³ããŒãæåã§ãããã¯
--tag-list ïŒã¿ã°ã¯ãåŸã§ãããžã§ã¯ãèªäœãèšå®ãããšãã«å¿
èŠã«ãªãããšã瀺ããŠããŸãã
ããšãã°ããšãŒãžã§ã³ãã«ã€ã³ã¹ããŒã«ãããŠããXcodeã®ããŒãžã§ã³ãããšãŒãžã§ã³ãã§å®è¡ããäºå®ã®ã¿ã¹ã¯ã®çš®é¡ã«å¿ããŠãå€æŽããããšãã§ããŸãã
--executor shell ïŒãšãŒãžã§ã³ããã³ãã³ãã©ã€ã³ã§ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠãããããšã瀺ããŸãã
CocoaPodsã®åé¡ãåé¿ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
echo 'export LC_ALL="en_US.UTF-8"' >> ~/.bash_profile echo 'export LANG=en_US.UTF-8' >> ~/.bash_profile
ããã¯ãçåºã®èšçœ®æã«ã³ãŒãã£ã³ã°ãšã©ãŒãçºçããªãããã«ããããã«å¿
èŠã§ãã
ãšãŒãžã§ã³ããæ£åžžã«ç»é²ããããšãèšå®ã§ç¢ºèªã§ããŸãã
èšå®-> CI / CD->ã©ã³ããŒ

ãããžã§ã¯ãã®ã»ããã¢ãã
GitLab CIã§åäœããããã«Xcodeãããžã§ã¯ããæ§æããããšã¯æ®ã£ãŠããŸãã
ãããè¡ãã«ã¯éåžžã«ç°¡åã§ãããããžã§ã¯ãã®ã«ãŒãã«èª¬æãå«ã.gitlab-ci.ymlãã¡ã€ã«ãé
眮ããå¿
èŠããããŸãã
ãã®ãã¡ã€ã«ããªããžããªã«è¿œå ããããšãCIã·ã¹ãã ã¯ããã«æå®ãããã³ãã³ãã®å®è¡ãéå§ããŸãã
ymlãã¡ã€ã«ã®äŸïŒ
stages: - test - archive before_script: - git submodule init - git submodule update --recursive - pod install --repo-update archive_project: stage: archive script: - fastlane match appstore - xcodebuild -workspace iFunny.xcworkspace -scheme iFunny archive -archivePath build/iFunny.xcarchive | xcpretty only: - master - triggers - web artifacts: paths: - build/iFunny.xcarchive tags: - xcode_9-2 - osx_10-13 - cocoapods - fastlane test_project: stage: test script: - xcodebuild test -workspace iFunny.xcworkspace -scheme iFunny -destination 'platform=iOS Simulator,name=iPhone 7,OS=11.2' | xcpretty tags: - xcode_9-2 - osx_10-13 - cocoapods - fastlane
GitLab CIã®yml圢åŒã«ã€ããŠã¯ã
ãã¡ãã§è©³ãã説æããŠã
ãŸã ã
ãµã³ãã«ãã¡ã€ã«ãç°¡åã«äœ¿çšã§ããããã«ã䜿çšããäž»ãªãã€ã³ãã«ã€ããŠèª¬æããŸãã
- before_script -CIã®åäœæ¥ã®åã«å®äºããå¿
èŠãããäžé£ã®æ瀺ãèšè¿°ããŸãã ç§ãã¡ã«ãšã£ãŠãããã¯ãµãã¢ãžã¥ãŒã«ã®æŽæ°ãšçåºã®ã€ã³ã¹ããŒã«ã®æšæºã»ããã§ãã
- archive_project -xcarchiveã§ã¢ãŒãã£ãã¡ã¯ããååŸããããã«äœ¿çšãããååã
ã¹ã¯ãªããã§ãå®äºããå¿
èŠããããã¹ãŠã®æ瀺ãæå®ããŸãã
fastlane match appstore
Fastlaneã«ã¯ã蚌ææžãåæããããã®é©åãªmatchã³ãã³ãããããŸãïŒmatchã®äœ¿çšã®è©³çŽ°ã«ã€ããŠ
ã¯ãfastlaneã®Webãµã€ããåç
§ããŠãã ããïŒã
ã¢ãŒã«ã€ãã¢ã»ã³ããªãéå§ããã¡ã€ã³ã³ãã³ãïŒ
xcodebuild -workspace Project.xcworkspace -scheme ProjectScheme archive -archivePath build/Project.xcarchive | xcpretty
Project.xcworkspace-ã¯ãŒã¯ã¹ããŒã¹ãå«ããã¡ã€ã«ã
ProjectScheme-ã¡ã€ã³ã¿ãŒã²ããã䜿çšããã¹ããŒã ã
build / Project.xcarchive-äœæ¥ææç©ã
åéããããã¹ã 次ã«ãã¢ãŒãã£ãã¡ã¯ãã§ãã®ãã¹ã䜿çšããŸãïŒã¢ãŒã«ã€ãã®ååŸå
ãCIã«æ瀺ããŸãã
å¯äžã®ãããã¯ã§ããã®äœæ¥ã¯masterãã©ã³ãã§ã®ã¿ããŸãã¯Webããèµ·åãããšããã€ãŸãCI / CDã®Run Pipelineãã¿ã³ããèµ·åãããšãã«ã®ã¿å®è¡ããå¿
èŠãããããšã瀺ããŸãã
ã¿ã°ã¯ããã®äœæ¥ãå®è¡ã§ããããã«ãšãŒãžã§ã³ãã«ç»é²ããå¿
èŠãããã¿ã°ã§ãã ããã§ããšãŒãžã§ã³ãã®ç»é²æã«æå®ããå
容ãå®å
šã«ç¹°ãè¿ãããŸãã
ãã¡ã€ã«ã®æ¬¡ã¯ã
test_projectã®æäœã®èª¬æã§ãã
ããã§èå³æ·±ãã®ã¯ããã¹ãå®è¡è¡ã§ãã
xcodebuild test -workspace Project.xcworkspace -scheme ProjectScheme -destination 'platform=iOS Simulator,name=iPhone 7,OS=11.2' | xcpretty
-destinationèšå®
ã§ã¯ããšãŒãžã§ã³ãã§æ£ç¢ºã«äœ¿çšå¯èœãªã·ãã¥ã¬ãŒã¿ãŒãæå®ããŸãã
SSHã³ãã³ãã䜿çšããŠããšãŒãžã§ã³ãã§äœ¿çšå¯èœãªããã€ã¹ã®ãªã¹ãã衚瀺ã§ããŸãã
instruments -s list
.gitlab-ci.ymlãã¡ã€ã«ãæ§æããããããããªããžããªã«è¿œå ãããšããã¡ã€ã«ãå«ããã©ã³ãã§ãã¹ããèªåçã«å®è¡ãããŸãã
ãããã«
GitLabãšçµã¿èŸŒã¿CI / CDã·ã¹ãã ã®ã»ããå
šäœãã»ããã¢ããããããã«ãçŽåæ¥ãè²»ãããŸãããããã¯ãBuddyBuildã®ã»ããã¢ããã«20å以äžããããŸããã
ããããç§ãã¡ã移åããåŸããã®ïŒ
- ãããžã§ã¯ããçµã¿ç«ãŠãããã®ç¬èªã®ãšãŒãžã§ã³ããšããããšé£æºããããã®ã·ã¹ãã ã
- ãã¹ãã䜿çšããã¢ã»ã³ããªã®æéã70åãã6åã«ççž®ãããããã¹ããšã¢ãŒã«ã€ãã䜿çšããå®å
šãªã¢ã»ã³ããªã®æéãæ倧30åã«ççž®ãããã§ããŸããã
- çµç«æéãæé©åããæ©äŒã
- ã«ã¹ã¿ãã€ãºããããããµãŒãã¹ãšã®çµ±åãå¯èœã§ãã
ç§ãã¡ã®ããŒã ã«ãšã£ãŠãGitLab CIã¯äžæçãªãœãªã¥ãŒã·ã§ã³ã§ããçŸåšãJenkinsã«ç§»è¡ããæºåãé²ããŠããããããžã§ã¯ãã«ããã«èªååãè¿œå ããŸãã
ããããããã®èšäºã§èª¬æããçµéšã«ãããèªè
ã¯4æé以å
ã«GitLab CIã«åãæ¿ããããšãã§ããŸãã
ãŸããç°¡åã«ããããã«ãèšäºã§èª¬æãããŠããã³ãã³ãã䜿çšããã¹ã¯ãªãããããã€ã玹ä»ããŸãã