
ãã°ããåã«ã Androidã§ã®ã¡ãŒã«ã®èªåãã¹ãã«ã€ããŠã話ãã ãèªè
ããèšå€§ãªæ°ã®è³ªåãåããŸããã æ¬æ¥ãiOSã®ã»ã«ããã¹ãã«é¢é£ãããå
éšãããã³ãã®äžéšãå
¬éããŸãã åã¢ã»ã³ããªããã¹ãããããã«ã1æéæªæºã§å®è¡ããã500以äžã®èªåãã¹ãã宿œããŠããŸãã ããããã©ã®ããã«å®è£
ããã®ã§ããïŒ ã©ã®ãããªåé¡ã«çŽé¢ããã©ã®ããã«è§£æ±ºã§ããŸãããïŒ ã«ããã®äžã§ããã«ã€ããŠãã¹ãŠèªãã§ãã ããã
å
容
Gerritã³ãŒãã¬ãã¥ãŒ
ã³ãã³ãã·ã¹ãã ãšCIéä¿¡
CIãã©ãããã©ãŒã
çµç«
ãã¹ããã«ã-ã¹ããŒãž1
ã¢ã«ãã¡ç-ã¹ããŒãž2
ããŒã¿ã¹ããŒãž3
ãªãªãŒã¹ã¹ããŒãž4
ã¢ããªã±ãŒã·ã§ã³ã®çµã¿ç«ãŠ
ã¢ããªã±ãŒã·ã§ã³çœ²åãšããããžã§ãã³ã°ãããã¡ã€ã«
åé¡
ãã§ãã¯ãšãã¹ã
UIãã¹ã
ãã¬ãŒã ã¯ãŒã¯ã¯ã©ãããã¹ãã
MonkeyTalk Mods
ã¹ã¯ãªããã«ããUIãã¹ãã®ç®¡ç
ã¹ã±ãŒãªã³ã°-䞊åèµ·å
æåã®ããŒãžã§ã³
çŸåšã®ããŒãžã§ã³
èµ·åæã®åé¢
åã·ãã¥ã¬ãŒã¿ãŒïŒ
ã·ãã¥ã¬ãŒã¿ãŒã³ãã¥ããã£
Xcodeãã·ãã¥ã¬ãŒã¿ãŒã®åé¡ãªã©ã®åé¿ç
iOSã·ãã¥ã¬ãŒã¿ãŒãšã®çžäºäœçšã®å®å®æ§ã«ã¯ãå€ãã®èŠæããããŸã
ã·ãã¥ã¬ãŒã¿ãŒã®ããŒã«ãšããŒã
å®äºã®å
åã®ãªãéåæsimctl
ã¢ããªã±ãŒã·ã§ã³ã®ã·ã¹ãã ãã€ã¢ãã°
åçãšé£çµ¡å
ãžã®ã¢ã¯ã»ã¹
ãµãŒããŒå¿çã®ãªãããŸã
å ±å
ããã¥ã¡ã³ãçæ
ã·ã¹ãã æŠèŠ
çæ
ã¡ãªãã
ãããžã§ã¯ããã§ãã¯
åãã¿ãŒã²ãã
ããŒã«ãªãŒãŒã·ã§ã³
ã«ããŽãªãŒ
ãã¹ãããããŒ
å ±å
éçã³ãŒãåæ
ã¹ãã£ã³ãã«ã
fbinfer
ãããã¡ã€ãªã³ã°ãšèµ·åã®ã¿ã€ãã³ã°
åäœãã¹ã
HipChatãšã¬ããŒã
æ°ããã¿ã¹ã¯ã®ã¬ããŒã
ã¢ã»ã³ããªããã¹ãããã§ãã¯ã®çµæã«é¢ããã¬ããŒã
çµè«/çµè«
æŠç¥çã«ãã¯ãŒã¯ãããŒã¯æ¬¡ã®ãšããã§ãã

ãã®å³ã¯ããªãªãŒã¹ã®éäžã®ã¿ã¹ã¯ã®æåã®ãæã峿 Œã§éèŠãªã¹ãããã瀺ããŠããŸãã æåã®ã³ã³ããŒãã³ãã®1ã€ã§ããCode Reviewããå§ããŸãããã
Gerritã³ãŒãã¬ãã¥ãŒ
ã³ãŒãã¬ãã¥ãŒã«ã¯ãGerrit Code Reviewã䜿çšããŸãã äžéšã®ã¢ã¯ã·ã§ã³ã«ã¯å€ãã®ãªãœãŒã¹ãå¿
èŠãªãããå¥ã®ããŒãã§åäœããŸãã ã³ãŒãã¯gitãªããžããªã«ä¿åãããŸãã ããã«ã远å ããŒããžã®ãªããžããªã®ãã©ãŒãªã³ã°ãæ§æãããTime Machineãä»ãããã£ã¹ã¯å
šäœã®ããã¯ã¢ãããåžžã«ãµããŒããããŸãã
ã¯ãŒã¯ãããŒã¯Gerritãšå¯æ¥ã«é¢é£ããŠããŸãã èªåãã§ãã¯ã ãã§ãªããQAãã¹ããå®è¡ãããŸãã ã©ã®æ®µéã§ãæ¿èª/倱æã¯ãã¹ã³ã¢ãšããŠGerritã«èšé²ãããŸãïŒ+ 1 / -1ã èªåæ€èšŒã倱æãããããã¹ãã¢ã»ã³ããªãçµã¿ç«ãŠãããªãå Žåã-1ãèšå®ãããŸãã
æåã®æ®µéãæåããå ŽåãQAããŒã ãåŒãç¶ããŸãã ãããã¯Jiraãšã®ã¿çžäºäœçšããã¿ã¹ã¯ãOpenãŸãã¯QA Approvedç¶æ
ã«ç§»è¡ãããããé·ç§»äžã«å¯Ÿå¿ããã©ãã«ã¯Gerritã«èšå®ãããŸãã ãããè¡ãããã«ãJiraçšã®å°ããªãã©ã°ã€ã³ãå®è£
ããããŸãã«ãã®ã¿ã¹ã¯ãå®è¡ããŸã-ãã以å€ã¯äœãããŸããã
ã³ãã³ãã·ã¹ãã ãšCIéä¿¡
Gerritã§ã¯ã远å ã®ãã©ã°ã€ã³ã§ãµãŒããŒåŽã®ããã¯ã䜿çšã§ããŸãã rubyã«æ¬¡ã®ããã¯ãå®è£
ããŸãã
- 倿ŽããŒãž;
- ã³ã¡ã³ã远å ;
- ããŒãžå€±æ;
- ãããã»ããäœæ;
- ref-update;
- ã¬ãã¥ã¢ãŒè¿œå ã
ã»ãšãã©ã®ããã¯ã¯ã倿Žã«ã€ããŠããŒã ã«éç¥ããããJiraã§ã¿ã¹ã¯ã®ç¶æ
ãåæãããããããã«äœ¿çšãããŸãã ããšãã°ãGerritã§æ¬¡ã®ãããã»ãããäœæãããšã察å¿ããããã¯ãåŒã³åºãããJiraã¿ã¹ã¯ãã³ãŒãã¬ãã¥ãŒç¶æ
ã«ãªãããã®ãããã»ããã®èªåãã§ãã¯ããŸã å®è¡ãããŠããªããããã«ã¹ã¿ã ã®Merge Approvedãã£ãŒã«ããNoã«èšå®ãããŸãã ãã ããããšãã°ã ã³ã¡ã³ãã远å ãããããã¯ãªã©ããã飜åããå®è£
ããããŸãã ããã«ãããCIãã©ãããã©ãŒã ã§ãã§ãã¯ãå®è¡ãã倿ŽãäœæããŸãã ãããè¡ãããã«ãç¹å®ã®ãããã»ããäžã®CIã§ç¹å®ã®ãžã§ããå®è¡ã§ããç¬èªã®ã³ãã³ãã·ã¹ãã ãå®è£
ããŸããã ã³ãã³ãã»ãããæ¡åŒµããã¿ã¹ã¯ã容æã«ããããã«ããžã§ãã§ã®ã³ã¡ã³ãã®è¡šç€ºãèšè¿°ããå°ããªDSLãå®è£
ããŸããã ããšãã°ãèªåãã§ãã¯ãèµ·åããã³ãã³ãã®èª¬æã¯æ¬¡ã®ããã«ãªããŸãã
JobMapping.register do command 'flow' job BUILD_FLOW_JOB arguments_required processor do |args| { 'CHECKS_ENABLED' => args.key?('checks') } end processor do |args| { 'ANALYSIS_ENABLED' => args.key?('analysis') } end processor do |args| { 'UNITTESTS_ENABLED' => args.key?('unit') } end processor do |args| if args.key?('ui') tags = args['ui'] { 'UITESTS_ENABLED' => true, 'UI_TESTS_TAGS' => tags.nil? ? '' : tags.tr(',', ' ') } else { 'UITESTS_ENABLED' => false } end end end
èªåãã§ãã¯ã¯ããã€ãã®éšåã§æ§æãããŠãããä»å¿
èŠãªãã®ãå®è¡ã§ããããã«ããããšèããŠããŸãã åJobMappingã¯ç¹å®ã®ã³ãã³ãã«ã¢ã¿ããããã ã³ãã³ãã¡ãœããã«ãã£ãŠèšå®ãããŸãã ãŸãããã®ã³ãã³ãã¯Jenkinsã®Jobã«è¡šç€ºãããå¿
èŠããããã©ã®ã¡ãœããïŒ job ïŒãæšæž¬ããããã«èšå®ãããŸãã ã³ãã³ãã«åŒæ°ãããå ŽåãJobMappingã¯arguments_requiredã¡ãœããã«ãã£ãŠãã®å¿
èŠæ§ã瀺ããŸãã
Jenkinsãžã§ãã¯ç°å¢å€æ°ãä»ããŠèšå®ãããŸãããããè¡ãã«ã¯ã ããã»ããµã¡ãœããã䜿çšããŠãããã³ã°ã¡ãœããã«ãããã¯ããã»ããµã远å ããã³ãã³ãã©ã€ã³ãç°å¢å€æ°ã®ã»ããã«å€æããŸãã
ã»ãšãã©ã®å Žåããããã®ã¡ãœããã¯å¿
èŠãªãããã³ã°ãäœæããã®ã«ååã§ãã ãã®åŸãæ inessãçºçãã ãïŒFlow ui unitãã®ä»£ããã«ãåçŽã«ãïŒTestsããšèšè¿°ããŸãã ãããã£ãŠãæŸéãç»å ŽããŸããïŒ
JobMapping.register do command 'tests' translates_to '!flow ui unit' rebase end
ãã¹ãŠãããèªäœãç©èªã æ laz çŽç²ãªå¿«é©ãã
ãã©ãããã©ãŒã ã®ã»ãšãã©ã¯ãRubyã§ãŒãããäœæãããŠããŸãã åãã¹ããŸãã¯ã¿ã¹ã¯ã¯ãããŒã«ã«ãšCIã®äž¡æ¹ã§å®è¡ã§ããåå¥ã®ã¢ãžã¥ãŒã«ã«ãã£ãŠå®è£
ãããŸãã
ã¿ã¹ã¯ãå®è¡ããã«ã¯ãRakeã䜿çšããŸãã ãããã£ãŠãã¢ãžã¥ãŒã«ããšã«ãRakefileã«åå¥ã®Rakeã¿ã¹ã¯ããããŸãã
éçºè
ãããŒã«ã«ã®èµ·åæã«ã³ã³ãœãŒã«ãã°ã«äŸåã§ããå ŽåãCIã§æçµã¬ããŒããšã¢ã©ãŒãã衚瀺ãããããšãæåŸ
ããŠããŸãã ããã¯éå§ååã® 1ã€ã§ããJenkinsã®ãžã§ããã°ã¯ãã¯ã©ã€ã¢ã³ãã§ã¯ãªãCIéçºè
ã«å¿
èŠã§ã ã ãããã£ãŠããã¹ãŠã®ãã¹ãã¢ãžã¥ãŒã«ã¯ãCIã§å®è¡ãããšãã«ã¿ã¹ã¯ã®æçµç¶æ
ãšãšã©ãŒã®èª¬æïŒããå ŽåïŒãååŸããããã«ãåãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŸãã ãããã£ãŠãCIã«ã¯ãRakeã¿ã¹ã¯ãå®è¡ããç¹å®ã®ãªããžã§ã³ã®ã³ãŒãã®è€è£œãèšŒææžã®å
容ãã¢ãŒãã£ãã¡ã¯ãã®ä¿åãªã©ã®åºæ¬çãªæäœãå®è¡ã§ããã·ã¹ãã ãå¿
èŠã§ãã ãžã§ã³ãã³ã¹ã¯ããŒã¹ãšããŠç¿åŸãããŸããã 圌ããç§éã¯äœ¿çšããŸãïŒ
- ã¹ã¬ãŒããã©ã°ã€ã³ãšããŒãäžã®ã¿ã°/ã©ãã«-10åã®Mac Miniãèªç±ã«äœ¿çšã§ããŸãã
- Gitãã©ã°ã€ã³
- ã¢ãŒãã£ãã¡ã¯ãã¹ãã¬ãŒãžã
- ãã§ãŒã³ããã³äžŠåã¿ã¹ã¯ãäœæããããã®BuildFlowãã©ã°ã€ã³ ïŒæä»£é
ãã§ããããµããŒããããŠããŸãã-ç¥ã£ãŠããŸããããããŸã§ã®ãšããããããã¯ãã£ãããšæ¥ç¶ãããŠããŸãïŒ;
- å®è¡äžã®ãžã§ãã®ååããã¿ã¹ã¯ã«é¢é£ä»ãããããã®ã«å€æŽããŸãã
ãã¹ãŠã®ãžã§ãã¯ããªããžããªã®è€è£œåŸã«å®è¡ãããäžé£ã®shã¹ã¯ãªããã§ãã ã»ãšãã©ã®å ŽåãJobã®shã¹ã¯ãªããã¯åã«Rakeã¿ã¹ã¯ãåŒã³åºããŸãã ä»ã®ãã¹ãŠã®æäœïŒxcodebuildãscan-buildããããžã§ã¯ãããã³ãœãŒã¹ãã§ãã«ãŒã¢ãžã¥ãŒã«ãUIãã¹ãã·ã¹ãã ã®èµ·åãçµæã®åŠçïŒã¯ãrubyã¹ã¯ãªããã®ãã¬ãŒã ã¯ãŒã¯ã«å®è£
ãããŸãã
CIãã©ãããã©ãŒã ã§ã¯ã2çš®é¡ã®ã¿ã¹ã¯ãåºå¥ã§ããŸãã
- éäŒ
- ãã§ãã¯ãšãã¹ãã
çµç«
ã¢ã»ã³ããªãšãã§ãã¯/ãã¹ãã¯äºãã«ç¬ç«ããŠããŸããã¢ã»ã³ããªãæåãããšãã¢ããªã±ãŒã·ã§ã³ãšã¿ã¹ã¯ã¯ããã«QAããŒã ã«éãããç¹å®ã®æ°ããã±ãŒã¹ãæåã§æ€èšŒããŸãã ãªãªãŒã¹ã®å段éã§ãã¢ã»ã³ããªã次ã®ããã«ãªããŸãã
- ç¹å®ã®ã¿ã¹ã¯ã®ã¢ã»ã³ããªã®ãã¹ãã ã€ãŸããæ©èœãã©ã³ãã¢ã»ã³ããªã
- Gerritã®ã¡ã€ã³ãããžã§ã¯ããã©ã³ãã®çŸåšã®ã¢ã«ãã¡ã
- ããŒã¿ç
- ãªãªãŒã¹ã
HockeyAppã§ãªãªãŒã¹ãããŠãããããæåã®2ã€ã®ã¹ããŒãžã®ã¿ãå®å
šã«èªåçã«æ©èœããŸãã ããŒã¿çãšãªãªãŒã¹ã¯ãŸãã§ãããæ³šæãå¿
èŠãªãããå¿
èŠã«å¿ããŠæåã§ããªã¬ãŒãããŸãã
ãã¹ããã«ã-ã¹ããŒãž1
倿ŽãCode Reviewã«åæ Œãããšããã¹ããã«ããæºåãããŸããããã¯ããŸã ã¡ã€ã³ãã©ã³ãã«ãªã倿Žãå«ãããŒãžã§ã³ã§ãã æ£åžžã«ã¢ã»ã³ãã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ããã¹ããã«ãçšã®åå¥ã®èå¥åã§HockeyAppã«ããã«ã¢ããããŒããããŸãã
HockeyAppã®ããŒãžã§ã³ãªã³ã¯ã¯ãJiraã®ã¿ã¹ã¯ã«æ·»ä»ãããŸãã ã¢ã»ã³ããªãæåãããšãã¿ã¹ã¯ã¯ãã¹ãã®æºåå®äºç¶æ
ã«ãªããŸãã 倱æããå Žå-ãããªãæ¹è¯ãšãšã©ãŒä¿®æ£ã®ããã«ãªãŒãã³ç¶æ
ã«ããŸãã
QAããŒã ã¯ãããŸããŸãªããã€ã¹ããã³iOSããŒãžã§ã³ã§ã®ã¿ã¹ã¯ã®ã³ã³ãã©ã€ã¢ã³ã¹ã«ã€ããŠã¢ã»ã³ããªããã§ãã¯ããŸãã 誰ãã倿Žã«æºè¶³ããŠããããã®æç¹ãŸã§ã«èªåãã§ãã¯ãã³ãŒãã¬ãã¥ãŒãšãã¶ã€ã³ã¬ãã¥ãŒãæ¢ã«åæ ŒããŠããå ŽåãJiraã§åæ Œãã¯ãªãã¯ãããšããã«å€æŽãã¡ã€ã³ãã©ã³ãã«ããã·ã¥ãããããã«ãã£ãŠç¬¬2ã¹ããŒãžãéå§ãããŸãã
ã¢ã«ãã¡ç-ã¹ããŒãž2
倿Žããããžã§ã¯ãã®ã¡ã€ã³ãã©ã³ãã«æ³šãããããã¢ããªã±ãŒã·ã§ã³ã®ã¢ã«ãã¡ããŒãžã§ã³ããªãªãŒã¹ããå¿
èŠããããŸãã ãã®ã¢ã»ã³ããªã®ããªã¬ãŒã¯ãGerrit change-mergedã®ããã¯ã§ãã 倿Žã®ããŒãžçŽåŸã«ããžã§ãã¯ã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®ã¢ã«ãã¡ããŒãžã§ã³ã®ã¢ã»ã³ãã«ãéå§ããŸãã
ãã®ãžã§ãã§ã¯ã10åã®é
å»¶ãèšå®ãããŠããŸããããã¯ãããã€ãã®äŸåïŒãŸãã¯ç¬ç«ïŒã¿ã¹ã¯ãããŒãžããå Žåã«å¿
èŠã§ãã ãžã§ãå
šäœã®å¹³åæèŠæéã¯11ã12åã§ãããããåã¿ã¹ã¯ã«åå¥ã«æéãè²»ããããããè€æ°ã®ã¿ã¹ã¯ã®ããŒãžãåŸ
ã€æ¹ãç°¡åã§ãã ã¢ã»ã³ãã«ãããã¢ã«ãã¡ããŒãžã§ã³ã«ã¯ãæåŸã«æ£åžžã«ã¢ã»ã³ãã«ãããããŒãžã§ã³ä»¥éã®ãã¹ãŠã®å€æŽãå«ãŸããŸãã
æ£åžžã«å®äºãããšãã¢ããªã±ãŒã·ã§ã³ã®ææ°ããŒãžã§ã³ãHockeyAppã«ã¢ããããŒããããŸãã Jiraã®ã¿ã¹ã¯ã¯ããã®æç¹ã§éããããŠãããšèŠãªãããŸã-ã¢ããªã±ãŒã·ã§ã³ã®ã¢ã«ãã¡çã§å©çšå¯èœã«ãªããšããã«ã ãããã£ãŠãHockeyAppã«å
¬éãããšãããŒãžã§ã³ã«å«ãŸãããã¹ãŠã®ã¿ã¹ã¯ãéããããŸãã ãããè¡ãã«ã¯ãJira APIã䜿çšããŸãã ãŸããJenkinsã®JobãšHockeyAppã®ã¢ããªã±ãŒã·ã§ã³èªäœãžã®ãªã³ã¯ãå«ãã³ã¡ã³ããæ®ããŠããŸãã
æé 2ã§ã®ã¢ã»ã³ããªäžã®é害ã¯ã»ãšãã©ãããŸããã ãããçºçããå ŽåãHockeyAppãŸãã¯Jira APIã®é·æéã®ã¯ã©ãã·ã¥ãåå ã§ããå¯èœæ§ãæãé«ãã§ãã ããã¯ãŸãã§ããã...

次ã®åœ±é¿åã®ãã倿Žãåããžã§ããèµ·åãã以åã®å€æŽããã£ããã£ãããããããã«åé¡ã¯ãããŸããã
ããŒã¿ã¹ããŒãž3
3çªç®ã®æ®µéã¯ããŒã¿çã§ãã Jenkinsã®åå¥ã®ãžã§ããããŒã¿çã®åéå
ãšãªããã©ã³ãã®ååã®ã¿ãå¿
èŠã§ãã ãã«ãã¯æåã§éå§ãããŸããããŒã¿çã¯æ£ç¢ºãªæ¥ã«ã¹ã±ãžã¥ãŒã«ãããŠããŸãããç¹å®ã®éå§æé/ããªã¬ãŒæéãŸãã¯ããªã¬ãŒã¯ãããŸããã
ãã«ãçµæã¯èªåçã«HockeyAppã«éãããQAããŒã ãå©çšã§ããããã«ãªããŸãã åããã©ã³ããããªãªãŒã¹ããŒãžã§ã³ã®ãžã§ããããã«èµ·åãããã¢ã»ã³ããªãTestFlightã«èªã¿èŸŒãŸããå
éšããã³å€éšã®ãã¹ãã«å¯ŸããŠçºè¡ãããŸãã
ãªãªãŒã¹ã¹ããŒãž4
4çªç®ã®æ®µéã¯ãªãªãŒã¹ã§ãã 3çªç®ã®ã¹ãããã§iTunesConnectãšTestFlightã«ãã§ã«ããŒããããŠããããŒã¿çã®ãã«ãããªãªãŒã¹ãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®çµã¿ç«ãŠ
ãã«ãã¯xcodebuildã«ãã£ãŠçŽæ¥å®è¡ãããŸãã åã¹ããŒãžã«ã¯ãåå¥ã®æ§æãšåŒæ°ã䞊ãã§ããŸãã ããšãã°ãæåã®æ®µéã§ããªã³ã¯ææé©åãå®å
šã«ç¡å¹ã«ããŠãã¿ã¹ã¯ããã¹ãã«å
¥ããŸã§ã®æéãç¯çŽããŸãã ãŸããã¢ããªã±ãŒã·ã§ã³ã®æåã®æ®µéã§ã¯ãã³ã³ãã€ã«æã«ã¢ã¯ãã£ãåãããæ©èœã䜿çšã§ããŸããããã¯ãåé¡ã®è¿œè·¡ãšãããã°ã«åœ¹ç«ã¡ãQAããŒã ã®ããã€ãã®ã¿ã¹ã¯ãä¿é²ããŸãã
- ããŒã¿ããŒã¹ã®åäœæ;
- Cookieã®åé€ã
- ãããã°ã¬ãã«ã®ãã°ãšããŒã¿ããŒã¹ãå¥ã®ããã¯ã¹ã«éä¿¡ããŸãã
- 䜿çšããããã€ãã®ãã©ã¡ãŒã¿ãŒã®ç¶æ
ã瀺ã远å ã®èŠèŠèŠçŽ ïŒããšãã°ãæ¥ç¶ã®å質ã®è¡šç€ºïŒã
- ã¢ããªã±ãŒã·ã§ã³ãå
·äœçã«éããæ©èœã
- ã¡ã€ã³ã¹ã¬ããã§æå®ãããã¯ã©ã¹ã®æå®ãããã¡ãœããã®åŒã³åºãã確èªããŸãã
ã¢ããªã±ãŒã·ã§ã³çœ²åãšããããžã§ãã³ã°ãããã¡ã€ã«
çŸæç¹ã§ã¯ãèªåã¢ã»ã³ããªäžã«ã䜿çšããèšŒææžãšããããžã§ãã³ã°ãããã¡ã€ã«ãå³å¯ã«èšå®ããŸãã ã¢ã»ã³ããªã®åã«ãããŒãã§äœ¿çšå¯èœãªãããã¡ã€ã«ã調ã¹ãçŸåšã®ã¢ã»ã³ããªã«é©ãããããã¡ã€ã«ãéžæããç°å¢å€æ°ã䜿çšããŠãããžã§ã¯ãèšå®ã§èšå®ããŸãã ãã¡ããããã®ã¹ãããã¯ã¹ã¯ãªããã«ãã£ãŠèªåçã«å®è¡ãããŸãã
ããã«ã¯çç±ããããŸããã Xcodeã®æ°ããã¡ãžã£ãŒããŒãžã§ã³ã衚瀺ããããããã«åãæ¿ããããšããŠããŸãããXcode 7.0ã®ããŒã¿ããŒãžã§ã³ã®1ã€ã§xcodebuildã®ãã°ã«ééããŸããïŒèªåããããžã§ãã³ã°ãããã¡ã€ã«æ€åºã䜿çšã§ããŸããã§ããã ãããã£ãŠãå©çšå¯èœãªãã¹ãŠã®ãããã¡ã€ã«ããå¿
èŠãªãã³ãã«IDãèŠã€ããåãRubyã¢ãžã¥ãŒã«ã«å®è£
ãããããã¡ã€ã«ã®ä»£ããã«env倿°ããããžã§ã¯ãã«è¿œå ããŸããã ãããã«ãã¢ã»ã³ããªäžã«ããããã¡ã€ã«ã®èå¥åãé
眮ããŸãã
Xcode 7.0ã§ã¯ãããã«ããäžéœåãçããããšã¯ãããŸããã§ããã env倿°ã空ã®å Žåããããã¡ã€ã«ã¯åŒãç¶ãéçºç°å¢ã«ãã£ãŠèªåçã«çœ®ãæããããŸããã ããããXcode 8.0ãšæ°ããèªå眲åã¢ãŒãã§ã¯ããã®æ¹æ³ã¯æ©èœããŸããã§ããã èªå眲åã䜿çšãããšãç°å¢ã¯ãããã°ããŒãžã§ã³ãšãªãªãŒã¹ããŒãžã§ã³ã®éçºèšŒææžãšãããã¡ã€ã«ã®äž¡æ¹ãèªåçã«çœ®ãæããŸãã ãªãªãŒã¹ããŒãžã§ã³ã§é
åžèšŒææžãèšå®ããã®ãé£ããå Žåãxcodebuildã¯åäœããŸããã
ã€ãŸããxcarchiveãäœæãããšããéçºçšã«ãµã€ã³ã¢ãããããããŒãžã§ã³ãåžžã«åºãŠãããšæ³å®ãããŠããŸãã æ¬¡ã«ã第2段éãç¶ããŸããIPAããšã¯ã¹ããŒãããŸããIPAã®å Žåã-exportOptionsPlistã䜿çšããŠæ§æãèšå®ããããã«å¿ããŠãç®çã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¢ããªã±ãŒã·ã§ã³ãå眲åã§ããŸãã åœåããã®ãããªã«ãŒã«ã¯ç§ãã¡ã«åããªãã£ããããèªå眲åã¢ãŒãããªãã«ããæåã§ãããã¡ã€ã«ã眮ãæããŸããã æ§æã¯æ¬¡ã®ãšããã§ãã

åé¡
Xcodebuildã«ã¯åé¿ã§ããªãå¶éããããŸããã©ã³ã¿ã€ã ãç ç²ã«ããªããšãè€æ°ã®ããã»ã¹ãéå§ã§ããŸããã ããŸããŸãªenv倿°ãšãã£ãã·ã¥ãšããŒã¿ãžã®ãã¹ã詊ããŸãããã圹ã«ç«ã¡ãŸããã§ããã ã©ããã«ã圌ã¯ãŸã å
±æãªãœãŒã¹ã«äŸåããŠããŸãã
åæã¢ã»ã³ããªã§ã¯ãåããã»ã¹ã®ä»£æ¿äœæ¥ãéåžžã«é¡èã§ãã 2ã€ã®äžŠåxcodebuildã®åèšæèŠæéã¯ã»ãŒ2åã«ãªããŸãã ãããã£ãŠãJenkinsã¹ã¬ãŒãããšã«1ã€ã®ãšã°ãŒãã¥ãŒã¿ãŒãã€ã³ã¹ããŒã«ããŸãã ããã«ããã远å ã®ãã©ã°ã€ã³ãªãã§2ã€ã®ã¿ã¹ã¯ã®å¹²æžããªããªããŸããããã¯ãJenkinsã§åžžã«é©åã«æ©èœããããã§ã¯ãããŸããã åæã«ããã¹ãŠã®ãžã§ãã¯å°çšã®ãšã°ãŒãã¥ãŒã¿ãŒãæå€§éã«æŽ»çšããŸããè€æ°ã®ã¿ã¹ã¯ã䞊è¡ããŠå®è¡ããããšã¯ç¹ã«æå³ããªããçžäºã«å¹²æžããã ãã§ãã
ãã§ãã¯ãšãã¹ã
ãã§ãã¯ãšãã¹ãã«ã¯ã察å¿ããRakeã¿ã¹ã¯ããããŸãããã§ãã¯ããšã«åå¥ã®ã¿ã¹ã¯ããããŸãã 以äžã®ãã§ãã¯ã®ç®çãšå®è£
ã«ã€ããŠããå
·äœçã«èª¬æããŸãããçŸæç¹ã§ã¯-é«ã¬ãã«ã®è·åèšè¿°æžã§ãã
Jenkinsã¯BuildFlowãã©ã°ã€ã³ã䜿çšããŸããããã«ããã䞊åã¿ã¹ã¯ã®å®è¡ããããã®ããŒãžããã§ãŒã³ã®äœæãªã©ãå¯èœã«ãªããŸããèªååããããã§ãã¯ãšãã¹ãã¯ãBuildFlowã¿ã¹ã¯ã®äžéšãšããŠå®è¡ãããŸãã ãã«ããŒãžã§ã³ã§ã¯ã次ã®ãã®ã䞊è¡ããŠèµ·åãããŸãã
- ãããžã§ã¯ããšãœãŒã¹ã®ãã§ãã¯-æååã®ããŒã«ã©ã€ãºãã«ããŽãªã®äœ¿çšãUIãã¹ãã®ããããŒãã¿ãŒã²ãããžã®ãœãŒã¹ã®å
å«ã
- éçã³ãŒãåæ;
- åäœãã¹ã
- UIãã¹ãã
æåã®3ã€ã®ã¿ã¹ã¯ã¯1ã€ã®Jenkinsãžã§ãã§å®è¡ãããŸãããUIãã¹ãã·ã¹ãã ã¯xcodebuildãä»ããŠãã¹ããå®è¡ãããããå°ãè€éã§ãã ããã¯å¥ã®ãã§ãŒã³ã§ããããã®æåã®ã¹ããã-ãã«ãå-ã¯æ¬¡ã®ãšããã§ãã
- ãã¹ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ããªã
- 䞊åå®è¡ã®ããã®UIãã¹ãã®ã°ã«ãŒããžã®é
åžã
- ã¢ã»ã³ããªãã¢ãŒã«ã€ãã«ããã¯ããŸãã

次ã«ãé
åžçµæã«åºã¥ããŠãBuildFlowã¯Jenkinsã§å¿
èŠãªæ°ã®ã¿ã¹ã¯ãèµ·åããŸããåã¿ã¹ã¯ã«ã¯ç¬èªã®ãã¹ãã°ã«ãŒãããããŸãã åãžã§ãã¯ããã«ãåã®ã¢ãŒãã£ãã¡ã¯ãããUIãã¹ããæ§æãã¢ã»ã³ããªãããã³ã¹ã¯ãªãããåäžã®ã¢ãŒã«ã€ããšããŠåãåããŸãã BuildFlowãæ¬¡ã®ã¿ã¹ã¯ã«é²ãã åŸããã®æ¬è³ªã¯æçµçãªå
šäœã¬ããŒããäœæããJiraãHipChatãGerritã§ã¢ã©ãŒããå®è¡ããããšã§ãã åãã¹ã®çµæã«ã€ããŠã¯ããã®ã¿ã¹ã¯ã¯ææç©ã«å€ãããŸãã BuildFlowãæ§æãããŠããŸããå¿
èŠã«å¿ããŠãä»»æã®ãã¹ããªãã«ããããšãã§ããŸãã
UIãã¹ã
ãã¬ãŒã ã¯ãŒã¯ã¯ã©ãããã¹ãã
UIãã¹ãã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯æ¬¡ã®ãã®ãå¿
èŠã§ãããšèããŠããŸãã
- iOSã®éçºè
ãšããã°ã©ããŒã ããåŠçã§ããåºæ¬æ§æã
- ãã¹ããã©ã¯ãã£ã¹ãåå©çšããæ©èœã UIãã¹ããäœæãããšããã³ãã³ãã¯ã¢ã¯ã»ã·ããªãã£èå¥åã䜿çšããŠã¿ãŒã²ããã«ãããŸãïŒã»ãšãã©ã®å ŽåïŒã çæ³çã«ã¯ãæšæºã§å©çšå¯èœãªã³ãã³ãã®äžã«ç¬èªã®ã©ã€ãã©ãªãæ§ç¯ããããšèããŠããŸãã ããã«ãããåºæ¬ã³ãŒãã®éè€ãæŸæ£ããã¢ããªã±ãŒã·ã§ã³ã³ãŒããå°ãä¿®æ£ããã ãã§äœæ¥ã容æã«ããããšãã§ããŸãã èå¥åã¯å€æŽãããŸãããïŒ æ€çŽ¢ãšçœ®æãªãïŒã¬ã€ã€ãŒã«ç§»åããããã§1ã€ã®èå¥åã倿ŽããŸãã
MonkeyTalkïŒçŸåšOracleã«ãã£ãŠè³Œå
¥ãããŠããŸããããã以äžã®ãã¹ã¯ãŸã äžæã§ãïŒãç§ãã¡ã®åºæºã«éããä»ã®å¿åè
ã倧å¹
ã«è¿œãè¶ããŸããã ã·ã³ãã«ãªç¬èªã®åºæ¬æ§æããããäžè¬çãªãã¹ããã©ã°ã¡ã³ããåå¥ã®ã¹ã¯ãªããã«äœæããŠåå©çšã§ããŸãã ãã®èšèªã§ãã¹ããäœæããã«ã¯ãããã°ã©ãã³ã°ããŸã£ããçè§£ããå¿
èŠã¯ãããŸãããAccessibilityIdentifierãèŠã€ããã ãã§ããReveal ãAccessibility Inspectorã Flexãªã©ã®ãŠãŒãã£ãªãã£ã§æœåºããææªã®å Žåã¯éçºè
ã«å°ããŠãã ããã
çµæã®ã¹ã¯ãªããã¯ãQAããŒã ã«ãã£ãŠèšè¿°ããããã¹ãã±ãŒã¹ãã»ãŒå®å
šã«ç¹°ãè¿ããŸãã åæã«ãMonkeyTalkã¯JavaScriptããµããŒãããŠããŸãã ããã§ã¯ãã¢ã¯ã·ã§ã³ã®ã¹ã³ãŒãã«ãããæšæºã®ã³ãã³ããšèŠçŽ èå¥åã®äžã«åãã¬ã€ã€ãŒãå®è£
ã§ããŸãã åŸã
ã«ã ããŒãžãªããžã§ã¯ãã«éåžžã«ãã䌌ããã®ãäœæãããŸãã ã åç»é¢ããã€ã¢ãã°ãããã³ã¢ããªã±ãŒã·ã§ã³èŠçŽ ã¯æçµçã«JavaScriptã§ç¬èªã®ã¢ãžã¥ãŒã«ãååŸããUIãã¹ãã®éçºã倧å¹
ã«å éããŸããã
åæã«ãããã°ã©ãã³ã°ã®ãã¹ãŠã®å©ç¹ïŒãµã€ã¯ã«ãæ¡ä»¶ãæ©èœïŒãå©çšå¯èœã§ãããããã«ã¯å察ã§ãã ãã¹ãã¯åçŽã§ç°¡åã§ãå°ãåé·ã«ãªã£ãŠããå¿
èŠããããŸãã ãã¹ãã倱æããå Žåã¯ãã¹ã¯ãªããã«ç®ãåããå¿
èŠãããå Žåããããç·šéã¢ãŒãã§åé€ããåŸã«ã¡ãã»ãŒãžåãæ€èšŒãããªãã£ãããšãæç¢ºãã€æ£ç¢ºã«äŒããæ©èœãå¿
èŠã§ãã ãããŠãã³ãã³ãã«ãã3ã€ã®æ¡ä»¶åå²ãšåŒæ°ã®1察ã®ã©ã ããæã€ã¬ãžãŒã ã®ãµã€ã¯ã«ã®ååšäžã§ãããè¡ãããšã¯éåžžã«é£ãããéåžžã«äžæå¿«ã§ãã ãã ããäžéšã®ãã¹ãã§ã¯ãŸã ïŒãã ãé©åºŠã«ïŒãµã€ã¯ã«ã䜿çšããŠããŸããããã«ããããã¹ãã¹ã¯ãªããã®é·ãã倧å¹
ã«ççž®ãããŸãã
MonkeyTalkã«ã¯ãã1ã€ã®å€§ããªå©ç¹ããããŸããããã¯ã倧å¹
ã«æ¡åŒµãããUIãã¹ãã®ããŒã¹ã®å®è¡ãæé©åããã³å éãããšãã«å°æ¥éåžžã«åœ¹ç«ã¡ãŸããã
MonkeyTalk Mods
MonkeyTalkã¯XCTestããç¬ç«ããŠããŸãã ãã®éèŠãªæ©èœã®ãããã§ãUIãã¹ããå®è¡ããããã®åæ£ã·ã¹ãã ãå®è£
ã§ããŸããã ä»ã®ãã¬ãŒã ã¯ãŒã¯ïŒ KIF ã EarlGrey ãããã³å
¬åŒã®XCUITestïŒã¯ãxcodebuildãä»ããŠèµ·åãããŸãã XCUITestã§ã¯ããã¹ãŠãéåžžã«å°é£ã§ãã ãã¹ãã®å®è¡æã«æ©èœããããã»ã¹ã«æ³šæãæããšã testmanagerdã«æ°ä»ãã§ããã ã 圌ã¯é²è¡äžã®1ã€ã®ãã¹ãã«å®å
šã«åŸäºããŠããŸãã å¥ã®ã»ãã·ã§ã³ã䞊è¡ããŠéå§ããå Žåãtestmanagerdã«ã¯äœãèµ·ãããŸããããã¹ãã¯éå§ãããŸããã
KIFãšEarlGreyã¯ãXCTestã䜿çšããŠããŸãã åãããŒãå
ã§äžŠåã«å®è¡ããããšãèãå§ãããšããããã»ã©å€ãã®éçºã¯ãããŸããã§ããã FBSimulatorControlã®éçºãå§ãŸãã pxctestãç»å ŽããŸããã èªèº«ã®è©Šã¿ã¯ãå€ããå°ãªããæçšãªãã®ã«ã¯ã€ãªãããŸããã§ããã MonkeyTalkãªãã·ã§ã³ã¯ããã·ã³ãã«ã§æé ãªäŸ¡æ Œã§ããã
MonkeyTalkã¯ãXCTestãŸãã¯XCUITestã«æ±ºããŠäŸåããŸããã åå¥ã®ãã¹ãå®è¡ãšå®è¡ã·ã¹ãã ããããŸãã httpãµãŒããŒãåãããšãŒãžã§ã³ããã¢ããªã±ãŒã·ã§ã³ã«çµã¿èŸŒãŸããŠããŸãã ã¹ã¯ãªããã®åŽã§ã¯ãUIãã¹ãã®ã¹ã¯ãªãããè§£æããæå®ãããã¢ãã¬ã¹ã«ã³ãã³ããéä¿¡ããã³ãã³ãã®çµæã§å¿çãåŸ
ã€ã©ã³ããŒã䜿çšãããŸãã
ãã®çµæãã·ãã¥ã¬ãŒã¿ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããèµ·åãåŸ
ã£ãŠãããã©ã³ããŒãå®è¡ããŠçµæãåŠçããã ãã§æžã¿ãŸãã
æéãçµã¡ã次ã®iOSã®ã¢ããããŒãã§ãããã€ãã®å°é£ã«çŽé¢ããŸããããããã解決ããããã«ãMonkeyTalkãèªåçšã«ä¿®æ£ããŠå®è£
ããŸããã
- ãæ£çŽãã¯ããŒããŒãã§åäœããŸãã
- ã€ãã³ãUIApplicationã¬ãã«ã§ã®ãæ£çŽãªãããŒããšãžã§ã¹ãã£ãŒã
- ãã«ããŒã®å¶åŸ¡ãããåŒã³åºãã®ããã®è¿œå ã³ãã³ã;
- èŠçŽ ã®å¯èŠæ§ã®å®å
šãªãã§ãã¯ã
ãŸããUIKitã®ããã€ãã®èŠçŽ ãšãããã¯ãŒã¯çžäºäœçšã®äžéšãšã®çžäºäœçšãæžãçŽãããã¬ãŒã ã¯ãŒã¯å
šäœã倧å¹
ã«é«éåããŸããã
UIãã¹ãã¯ãã§ããã ãå®éã®æ¡ä»¶ã«è¿ãããã©ãã¯ããã¯ã¹ã®ååãç¶æããå¿
èŠããããŸãã å®éã®ç¶æ
ã§ã®ããŒããšãžã§ã¹ãã£ãŒã¯ããŠãŒã¶ãŒã®æã«ãã£ãŠå®è¡ãããŸãã èªååã§éæã§ããæãè¿ãæ¹æ³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã€ãã³ãã¬ãã«ã§ã¯ãªãã¯ãã·ãã¥ã¬ãŒãããããšã§ãã åœåãMonkeyTalkã¯UIControlsããã³UIGestureRecognizersã«ã¡ãã»ãŒãžãçŽæ¥éä¿¡ããŸããããããã¯ãŸã£ããç§ãã¡ã«åãããå Žåã«ãã£ãŠã¯ã±ãŒã¹ãã«ããŒããããšãã§ããŸããã§ããã
ãŸããã¢ããªã±ãŒã·ã§ã³ã®èµ·åæãå«ãã¹ã¿ããå«ã/ç¡å¹åãå«ãããã¹ãã¹ã¯ãªãããä»ããŠãã¹ãŠã®ãããã¯ãŒã¯ã®çžäºäœçšãå¶åŸ¡ããããšãã§ããŸãã ããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã 远å ã®å©ç¹ã¯ãçªç¶ããã€ã¹ã«åãæ¿ããããšã«ããå Žåãå®éã®ããã€ã¹ãšãŸã£ããåãããã»ã¹ã§ããããšã§ãã
ã¹ã¯ãªããã«ããUIãã¹ãã®ç®¡ç
MonkeyTalkã«ã¯ç¹å¥ãªèµ·åæ¹æ³ãããããã远å ã®å¶åŸ¡ã¹ã¯ãªãããå®è£
ããå¿
èŠããããŸããã 圌ãã®ã¿ã¹ã¯ïŒ
- å®è¡ãããã¹ãã®ã»ãããå®çŸ©ãã
- ã·ãã¥ã¬ãŒã¿ãŒã管çããŸãã
- UIãã¹ããå®è¡ããŸãã
- çµæãåŠçããŸãã
UIãã¹ãã¹ã¯ãªããèªäœã«ã€ããŠã¯ãèŠåºããå°å
¥ããŸãããããã«ã€ããŠã¯ãåŸã§è©³ãã説æããŸãã ããã§ããã¹ããå®è¡ããããã€ã¹ã®ã¿ã€ããšiOSã®ããŒãžã§ã³ãèšå®ãããŠããã®ã¯ããããŒã«ããããšãææãã䟡å€ããããŸãã è€æ°ã®åŒæ°ãæå®ãããŠããå Žåããã«ã«ãç©ãååŸãããŸãã ãã¹ãåã«ã¢ããªã±ãŒã·ã§ã³ãæ§æããããã«ãã¢ããªã±ãŒã·ã§ã³ã«ããŸããŸãªåŒæ°ãæž¡ãããšãã§ããŸãã
ãããã¯ãã¹ãŠå®è£
ãéåžžã«ç°¡åã§ãããUIãã¹ãã¯é·ãããã»ã¹ã§ããããããžã§ã¯ãã®ãã¹ãŠã®å€æŽããã§ãã¯ããããšãç®æšã§ãã
ã¹ã±ãŒãªã³ã°-䞊åèµ·å
æåã®ããŒãžã§ã³
åœåãUIãã¹ããå®è¡ããããã®èªå·±èšè¿°ã·ã¹ãã ã¯ããªãœãŒã¹äœ¿çšçãäœããšããç¹åŸŽããããŸããã 70åã®ãã¹ãããã©ã«ããŒã«åå²ããŸããã åãã©ã«ããŒã¯ãUIãã¹ãã®ã«ããŽãªïŒããšãã°ãæ¿èªïŒã«å¯Ÿå¿ããŠããŸããã èµ·åæã«ããã©ã«ãã¯Mac Miniã«é
åžãããå©çšå¯èœã«ãªããŸããã ãããã®ããããã§ãäžåºŠã«1ã€ã®ã·ãã¥ã¬ãŒã¿ã®ã¿ãæ©èœããåèµ·åãããæ°ããUIãã¹ãã«ãã£ãŠå®å
šã«äžæžããããŸããã æãããªæ¬ ç¹ïŒ
- i5ãš16 GBã®RAMãæèŒããMac Miniã¯ããªãœãŒã¹ã®å¹³å0ïŒ
ã䜿çšããŸãã
- ãã©ã«ãã®ã«ããŽãªãžã®ååžã¯äžåäžã§ãããæ€çŽ¢ãã¹ãã¯ãã¹ããæžããããã¯ããã«å°ãªãããšãããããŸããã
- ãã¹ãã®æ°ã¯å¢ããŸãããããŸã ãã£ããå®è¡ãããŠããŠãCIã«æ·±å»ãªãã¥ãŒã圢æãããŠããããããã¹ãã«åæ Œããªããšã¿ã¹ã¯ã管çã§ããŸããã
次ã«ããã¹ãããŒã¹ããããã«æ¡åŒµããæãå¿
èŠãã€åºæ¬çãªãã®ãã«ããŒããŠããªãœãŒã¹ã®äœ¿çšãæå€§åããæ¹æ³ãæ¢ãå§ããŸããã ãããŠåœŒãã¯èŠã€ããã
çŸåšã®ããŒãžã§ã³

ã€ãŸããåããã·ã³ã§è€æ°ã®ã·ãã¥ã¬ãŒã¿ãå®è¡ããã³å¶åŸ¡ããããšãåŠã³ããã·ã³ã®ã°ã«ãŒãã«ãã¹ãé
åžã·ã¹ãã ãå®è£
ããŸããã :
- , .
- / , , .
- HTTP- MonkeyTalk . MonkeyTalk , . environment variable launch argument.
, . i7, 16 SSD - . , . . , env-, . UI-.
Jenkins API. env- . , , , . API.
â . , . , , . , Jenkins. :
- .
- json .
- .
- .
json UI-. UI- , . UI-. :
- .
- json , .
- ( ) .
- â « » => «», .
- UI- Jenkins , .
- , .
- .
UI- :
- .
- .
. , UI- . , . , . , .
UI- . , . , :
json , :
INFO IOSMail::UITestsGrouper : Getting all available tests... INFO IOSMail::UITestsGrouper : Found 506 available tests. Took 0.8894939422607422 secs. INFO IOSMail::UITestsGrouper : Reading stats json from ./ui-tests/uitests_stats.json... INFO IOSMail::UITestsGrouper : Gluing available tests and stats... WARN IOSMail::UITestsGrouper : No statistics for ScrollToFirstLetterInListFromMiddle.mt_iPhone5s. Using mean tests time. INFO IOSMail::UITestsGrouper : Statistical total duration = 33603.8670472377 INFO IOSMail::UITestsGrouper : Computing capacities counters... INFO IOSMail::UITestsGrouper : Capacities counters received and computed. Took 3.4377992153167725 secs. INFO IOSMail::UITestsGrouper : Partitioning for 7 parts... INFO IOSMail::UITestsGrouper : Allocated partitions = [{:capacity=>4, :label=>"4sim", :tests=>[]}, {:capacity=>4, :label=>"4sim", :tests=>[]}, {:capacity=>5, :label=>"5sim", :tests=>[]}, {:capacity=>4, :label=>"4sim", :tests=>[]}, {:capacity=>5, :label=>"5sim", :tests=>[]}, {:capacity=>3, :label=>"3sim", :tests=>[]}, {:capacity=>4, :label=>"4sim", :tests=>[]}] INFO IOSMail::UITestsGrouper : Partitions constructed, took 0.039823055267333984 secs. INFO IOSMail::UITestsGrouper : Partitions sizes = [72, 70, 87, 73, 83, 46, 75] INFO IOSMail::UITestsGrouper : Partitions durations = [1157.0547642111776, 1160.5415018200872, 1157.1358834599146, 1159.2893925905228, 1158.044078969956, 1161.813697735469, 1158.7458768486974]
. 4â5 , API Jenkins. UI-, . , .
UI-. . , â 40 . . , 5 , , , . , , 10â15 UI-. . : 10 , .
UI- . . UI- .
!
, . ruby wrapper simctl â xcode iOS-. :
simulator = Simulators::MRSimulator.new(test_name, type, runtime) simulator.launch simulator.prepare(app) simulator.install_app(app) If access_allowed simulator.enable_access(app) else simulator.disable_access(app) end simulator.run_app(app, arguments, env)
- , simctl, , , . Ì syslog' . . â .
, . :
- .
- .
- .
- .
- â , keychain, , (TCC).
- , , â 2.
, . , 20 . , .
keychain. data- appgroup- . . keychain . keychain-2-debug.db. , - , . keychain:
def clear_keychain `sqlite3 ~/Library/Developer/CoreSimulator/Devices/
, ( , ), keychain â .
xcode, simulator . .
C iOS-
iOS- , . , , , , . , , - . . iOS- , dlopen, . â , Jenkins , . . , - .
, . -, , watchdog springboard. â 20 . , FBSimulatorControl Facebook. , preferences springboard , - Bundle Id. , springboard, preferences , ? â .
â . File IO. CI, , launchd, kernel_task CoreSimulator. . . XCode 8.0 - , -, 160 . , .
simctl
simctl, XCode, â . , , launch screen. (. â watchdog). simctl , syslog' . , , :
. MonkeyTalk , . . sqlite TCC.db, .
, , . . , .
, /. sqlite TCC.db, :
def self.setup_access(simulator_id, app, disabled, simulator_set_path: "#{ENV['HOME']}/Library/Developer/CoreSimulator/Devices") tcc_path = File.join(simulator_set_path, "#{simulator_id}/data/Library/TCC/TCC.db") Utilities::FileMonitoring.wait_for_file_creation(tcc_path, :max_wait => 30) { raise Simulators::Errors::SimulatorTimeoutError.new("Timed out while waiting for TCC!") } rights = disabled ? '0' : '1' ['kTCCServiceAddressBook', 'kTCCServicePhotos', 'kTCCServiceCalendar'].each do |access_target| `sqlite3 #{tcc_path} "replace into access(service, client, client_type, allowed, prompt_count) values ('#{access_target}','#{app.bundle_id}',0,#{rights},1)" 2>&1` end end
UI- . CI , , , , . . URLProtocol, . URLProtocol' FakeResponse. UI- FakeResponse , . . :
Jira Hipchat UI- . , , Jenkins Job'. HTML- UI-, UI-, , UI- . ( UI- â //) :
- ;
- UI-;
- HTML- XML- UI-;
- data- ;
- appgroup- ;
- ;
- -, ;
- .
UI- debug-. HTML- json-, , N . Job' json- - , , .
HTML- Jenkins, Jira :

Jira, , HipChat:

HTML- :

â -, :
HTML- . UI-. CI-.
BuildFlow â UI-. :
- UI- â 506;
- UI- â 9 20 ;
- UI- â 45â50 ;
- UI- â 66 ;
- UI- â 397 .
Prebuild, 5â6 , Gerrit. CI 506 UI- 55 .
çæ
, XCode. , . â :
- MonkeyTalk , iOS 8.0;
- simctl springboard , XCode ( );
- XCode , , XCode 8.0, .
- , . .
ã¡ãªãã
- 9,33 UI- 60 ;
- ( , , );
- â . CI 50 â , , 50 50 iOS.
, , :
- , : ;
- UI-, XCUITest;
- , UI- , .
Same Targets
alpha- . , , iTunes.
: Alpha, Beta AppStore. Alpha Alpha-. , - . . (, ) , . CI . - , . . , , . Alpha-, . json. :
{ "compare-sets": [ { "targets": ["MRMail-Alpha-Enterprise", "MRMail-Pub-Beta-Enterprise", "MRMail-AppStore", "MRMail-MonkeyTalk"], "exclusive": { "MRMail-Alpha-Enterprise": [ "^pod-packages/Reveal-iOS-SDK/", "^src/infrastructure/MainThreadGuard/UIKitThreadGuard\\.m$",
, xcodeproj , .
ããŒã«ãªãŒãŒã·ã§ã³
, . , . , , :
- NL (Not Localized): ;
- L (Localized): â , .
Build Phase, . . . - , CI, , Open.
Xcode â , , , . /. :
- ;
- action extension;
- share extension;
- today extension;
- shared framework.
, , . , , . , , , . â Ruby, :
â , . :
- Protected/Private- â ;
- â .
, . . â â , , , . :
{ "rules": [ { "name": "GeneralExternalImplementation", "type": "ExternalImplCheck", "imports": { "AccountEnvironmentImpl+Protected.h": "AccountEnvironmentImpl.m", âŠâŠ.
â AccountEnvironmentImpl+Protected.h AccountEnvironmentImpl.m.
CI- .
xcodeproj .
, UI- â . . UI- :
UI-:
# tasks: IOSMAIL-6020 # name: # category: Compose # description: , «» , , , # .
, Jenkins Job, , Rake-. , , .
, HTML- , BuildFlow. 次ã®ããã«ãªããŸãã


scan-build
scan-build + xcodebuild. : . scan-build . , , , . â .
scan-build, , HTML-.
fbinfer
CI infer . â . 1 10 . . , . Ì . CI-, , , .
, CI, , . â , infer scan-build, .
. , , .
alpha- Downstream Job, .
Job , .
250 . InfluxDB, Grafana. , , , , - : , ( , ).

åäœãã¹ã
Unit- â xcodebuild + xcpretty . HTML- xcpretty, , . Unit- â BuildFlow. 1451 Unit-, 10â11 .
HipChat
Jira + HipChat. , , .
, ,
â CI-. . . :
- ;
- ;
- ;
- HTML-;
- Jira, Gerrit HipChat.
, . CI â Unit-, UI-, , â 55â60 .
, , /. , . , , ( ): , CI, . Continuous Reporting , . , , , .
/
. :
, , , , . , , , , . .
Ì , , . .
