ã³ãŒããèšè¿°ããåŸã次ã®ããšã確èªããå¿ èŠããããŸãã
- åäœããŸãã
- ååãæžããã³ãŒããå«ããäœãå£ããŸããã
äž¡æ¹ã®æ¡ä»¶ãæºããããŠããå Žåãæåãžã®éãæ©ãã§ããŸãã ãããã®æ¡ä»¶ãç°¡åã«ç¢ºèªããåçæ§ã®é«ããã¹ããªãã«ããªãããã«ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãèæ¡ããŸããã
CIã¯ãã§ããã ãé »ç¹ã«ã³ãŒããäžè¬çãªè£œåã³ãŒãã«çµ±åããã¯ãŒã¯ãããŒã§ãã ãããŠãåã«çµ±åããã ãã§ãªãããã¹ãŠãæ©èœããããšãåžžã«ãã§ãã¯ããŸãã é »ç¹ã«ç¢ºèªããå¿ èŠããããããèªååã«ã€ããŠæ€èšããå¿ èŠããããŸãã æåçœåŒã§ãã¹ãŠããã§ãã¯ã§ããŸãããããã ãã®äŸ¡å€ã¯ãããŸããããããçç±ã§ãã
- 人ã¯é«äŸ¡ã§ãã ããã°ã©ããŒã®1æéã®äœæ¥ã¯ããµãŒããŒã®1æéã®äœæ¥ãããé«äŸ¡ã§ãã
- 人ã¯ééã£ãŠããŸãã ãã®ãããééã£ããã©ã³ãã§ãã¹ããéå§ãããããã¹ã¿ãŒã®ééã£ãã³ããããåéãããããç¶æ³ãçºçããå¯èœæ§ããããŸãã
- 人ã¯æ ãè ã§ãã å®æçã«ãã¿ã¹ã¯ãå®äºãããšãããããã確èªãã¹ããã®ã¯äœã§ããïŒ ç§ã¯2ã€ã®è¡ãæžããŸãã-stopudovoããã¹ãŠãæ©èœããŸãïŒã ãã ããåžžã«ç¢ºèªããå¿ èŠããããŸãã
Avitoã¢ãã€ã«éçºããŒã ã§ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãå°å ¥ããã³éçºãããæ¹æ³ã1æ¥ããã0ãã450ã®ã¢ã»ã³ããªãããã³ãã«ããã·ã³ã1æ¥200æéåéããæ¹æ³ãNikolay NesterovïŒ nnesterov ïŒ -CI / CD Androidã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®é²åçå€æŽã®åå è ã
ãã®ã¹ããŒãªãŒã¯AndroidããŒã ã®äŸã«åºã¥ããŠããŸãããã»ãšãã©ã®ã¢ãããŒãã¯iOSã«ãåœãŠã¯ãŸããŸãã
æã ã1人ãAvito AndroidããŒã ã§åããŠããŸããã å®çŸ©äžã圌ã¯ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ããäœãå¿ èŠãšããŸããã§ãããçµ±åãã人ã¯ããŸããã§ããã
ããããã¢ããªã±ãŒã·ã§ã³ã¯æé·ããããããæ°ããã¿ã¹ã¯ãåºçŸããããŒã ã¯æé·ããŸããã ããæç¹ã§ãã³ãŒããçµ±åããããã»ã¹ãããæ£åŒã«ç¢ºç«ãããšããæ¥ãŸããã GitãããŒã䜿çšããããšã決å®ãããŸããã
GitãããŒã®æŠå¿µã¯ç¥ãããŠããŸãïŒãããžã§ã¯ãã«ã¯å ±éã®éçºãã©ã³ãã1ã€ãããéçºè ã¯æ°ããæ©èœããšã«åå¥ã®ãã©ã³ããã«ããããã³ãããããŠããã·ã¥ããéçºãã©ã³ãã«ã³ãŒããæ¿å ¥ãããšãã«ãã«ãªã¯ãšã¹ããéããŸãã ç¥èãå ±æããã¢ãããŒããè°è«ããããã«ãã³ãŒãã¬ãã¥ãŒãå°å ¥ããŸãããã€ãŸããååã¯äºãã®ã³ãŒãããã§ãã¯ããã³ç¢ºèªããå¿ èŠããããŸãã
ãã§ãã¯
ã³ãŒããç®ã§èŠãã®ã¯ã¯ãŒã«ã§ãããååã§ã¯ãããŸããã ãã®ãããèªåãã§ãã¯ãå°å ¥ãããŠããŸãã
- ãŸããARCã®ã¢ã»ã³ããªããã§ãã¯ããŸãã
- å€ãã®Junitãã¹ã ã
- ãã¹ããå®è¡ããããã ã³ãŒãã«ãã¬ããžãèæ ®ããŸã ã
ãããã®ãã§ãã¯ã®å®è¡æ¹æ³ãç解ããããã«ãAvitoã®éçºããã»ã¹ãèŠãŠã¿ãŸãããã
æŠç¥çã«ã¯ã次ã®ããã«è¡šãããšãã§ããŸãã
- éçºè ã¯ã©ãããããã§ã³ãŒããèšè¿°ããŸãã ããã§çµ±åãã§ãã¯ãå®è¡ã§ããŸã-ã³ãããããã¯ã䜿çšããããããã¯ã°ã©ãŠã³ãã§ãã§ãã¯ãå®è¡ããã ãã§ãã
- éçºè ã¯ã³ãŒããå®è¡ããåŸããã«ãªã¯ãšã¹ããéããŸãã 圌ã®ã³ãŒããéçºãã©ã³ãã«å ¥ãããã«ã¯ãã³ãŒãã¬ãã¥ãŒãééããå¿ èŠãªæ°ã®ç¢ºèªãåéããå¿ èŠããããŸãã ããã§ãã§ãã¯ãšãã«ããæå¹ã«ã§ããŸãããã¹ãŠã®ãã«ããæåãããŸã§ããã«ãªã¯ãšã¹ãã¯ããŒãžã§ããŸããã
- ãã«ãªã¯ãšã¹ããããŒãžãããã³ãŒããéçºãããåŸãéœåã®ããæéãéžæã§ããŸããããšãã°ãå€éããã¹ãŠã®ãµãŒããŒã空ããŠãããšãã奜ããªããã«ãã©ã€ãããã§ãã¯ããŸãã
ã©ãããããã§ãã¹ããå®è¡ããã®ã奜ããªäººã¯ããŸããã§ããã éçºè ãæ©èœãçµäºããããããã«èµ·åããŠãã«ãªã¯ãšã¹ããéããããšèããŠããŸãã ãã®ç¬éã«ããã€ãã®é·ããã§ãã¯ãéå§ããããšãããã¯éåžžã«å¿«é©ã§ããã ãã§ãªããéçºã®é床ãäœäžãããŸããã©ããããããäœãããã§ãã¯ããŠããéãæ£åžžã«åäœããããšã¯äžå¯èœã§ãã
å€ãã®æéãšãµãŒããŒããããããå€éã«ãã§ãã¯ãå®è¡ããã®ã倧奜ãã§ããã ããããæ®å¿µãªããšã«ãæ©èœã³ãŒããéçºããããšããéçºè ã¯CIãçºèŠãããšã©ãŒã修埩ããåæ©ããã§ã«å€±ã£ãŠããŸãã æã®ã¬ããŒãã§ãåŸã§ä¿®æ£ããããšãå€æãããã¹ãŠã®ãšã©ãŒã«é¢ããã¬ããŒããèŠããšãç§ã¯å®æçã«èªåèªèº«ãèããŠããŸããã
ãã§ãã¯ããã«èŠæ±ããããã¯ããå Žåãã¢ãããŒã·ã§ã³ã¯ååã§ãããã«ããç·è²ã«ãªããŸã§ã³ãŒããéçºãããªããããã¿ã¹ã¯ãå®äºããªãããã§ãã
ãã®çµæããã®æŠç¥ãéžæããŸãããå€éãå¯èœãªéãæ倧ã®ãã§ãã¯ã»ãããå®è¡ããæãéèŠãªãã§ãã¯ãå®è¡ããæãéèŠãªããšãšããŠããã«ãªã¯ãšã¹ãã§å®è¡ããŸãã ããããããã§åæ¢ããããã§ã¯ãããŸãã-䞊è¡ããŠããã§ãã¯ãæž¡ãé床ãæé©åããŠããã€ãã¢ãŒããããã«ãªã¯ãšã¹ãã®ãã§ãã¯ã«åãæ¿ããããã«ããŸãã
ãã®æç¹ã§ã¯ããã¹ãŠã®ãã«ããååã«é«éã ã£ãããããã«ãªã¯ãšã¹ããããã«ãŒã«ARCã¢ã»ã³ããªãJunitãã¹ããã³ãŒãã«ãã¬ããžèšç®ãå«ããŸããã 圌ãã¯ããããªã³ã«ããèãçŽããç§ãã¡ããããå¿ èŠãšããªããšæã£ãã®ã§ãã³ãŒãã«ãã¬ããžãæŸæ£ããŸããã
åºæ¬çãªCIã®ã»ããã¢ãããå®äºããã®ã«2æ¥ããããŸããïŒä»¥éãäžæçãªèŠç©ããã¯æŠç®ã§ãããã¹ã±ãŒã«ã«å¿ èŠã§ãïŒã
ãã®åŸã圌ãã¯ããã«èãå§ããŸãã-ç§ãã¡ã¯ãããæ£ãããã§ãã¯ããŠããŸããïŒ ãã«ãªã¯ãšã¹ãã§ãã«ããæ£ããå®è¡ããŸããïŒ
ãã«ãªã¯ãšã¹ããéããŠãããã©ã³ãã®æåŸã®ã³ãããã§ãã«ããéå§ããŸããã ãããããã®ã³ãããã®ãã§ãã¯ã¯ãéçºè ãæžããã³ãŒããæ©èœããããšã瀺ãã ãã§ãã ãããã圌ãã¯åœŒãäœãç Žããªãã£ãããšã蚌æããŸããã å®éã«ã¯ãæ©èœãããã«æ³šãããåŸãéçºãã©ã³ãã®ã¹ããŒã¿ã¹ã確èªããå¿ èŠããããŸãã
ãããè¡ãããã«ãåçŽãªbashã¹ã¯ãªããpremerge.shãäœæããŸããã
#!/usr/bin/env bash set -e git fetch origin develop git merge origin/develop
ããã§ã¯ãdevelopããã®ææ°ã®å€æŽããã¹ãŠãã«ã¢ãããããçŸåšã®ãã©ã³ãã«ããŒãžãããŸãã ãã¹ãŠã®ãã«ãã®æåã®ã¹ããããšããŠpremerge.shã¹ã¯ãªãããè¿œå ããå¿ èŠãªãã®ãã€ãŸãçµ±åãæ£ç¢ºã«ç¢ºèªãå§ããŸããã
åé¡ãç¹å®ãã解決çãèŠã€ãããã®ã¹ã¯ãªãããäœæããã®ã«3æ¥ããããŸããã
ã¢ããªã±ãŒã·ã§ã³ãéçºããããŸããŸãå€ãã®ã¿ã¹ã¯ãçŸããããŒã ãæé·ããpremerge.shãæã ç§ãã¡ã倱æããå§ããŸããã éçºã§ã¯ãã¢ã»ã³ããªãå£ãã競åããå€æŽã浞éããŸããã
ãããã©ã®ããã«èµ·ãããã®äŸïŒ
2人ã®éçºè ãåæã«æ©èœAãšBã®ãœãŒã€ã³ã°ãéå§ããŸããæ©èœAã®éçºè ã¯ããããžã§ã¯ãã®æªäœ¿çšã®
answer()
é¢æ°ãçºèŠããåªããã¹ã«ãŠãã®ããã«åé€ããŸãã åæã«ããã©ã³ãã®æ©èœBã®éçºè ã¯ããã®é¢æ°ã«æ°ããåŒã³åºããè¿œå ããŸãã
éçºè ã¯äœæ¥ãçµäºãããšåæã«ãã«ãªã¯ãšã¹ããéããŸãã ãã«ããéå§ãããpremerge.shã¯äž¡æ¹ã®ãã«ãªã¯ãšã¹ãããã§ãã¯ããŠãæ°ããéçºç¶æ ã確èªããŸã-ãã¹ãŠã®ãã§ãã¯ã¯ç·è²ã§ãã ãã«ãªã¯ãšã¹ãæ©èœAãããŒãžãããåŸããã«ãªã¯ãšã¹ãæ©èœBãããŒãžãããŸã...ããŒã ïŒ éçºã³ãŒãã§ã¯ååšããªãé¢æ°ãžã®åŒã³åºããããããããã¬ãŒã¯ãéçºããŸãã
éçºããªãå Žåãããã¯å°åã®çœå®³ã§ãã ããŒã å šäœããã¹ãã®ããã«äœããåéããŠæäŸããããšã¯ã§ããŸããã
ãã®ãããã»ãšãã©ã®å Žåãã€ã³ãã©ã¹ãã©ã¯ãã£ã¿ã¹ã¯ïŒåæããããã¯ãŒã¯ãããŒã¿ããŒã¹ïŒã«é¢äžããŠããŸããã ã€ãŸããä»ã®éçºè ã䜿çšããé¢æ°ãšã¯ã©ã¹ãäœæããŸããã ãã®ãããç§ã¯ãã°ãã°ãã®ãããªç¶æ³ã«é¥ããŸããã ç§ããã®ãããªåçãäžåºŠã«èŠãŸããã
ããã¯ç§ãã¡ã«åããªãã£ãã®ã§ããããé²ãæ¹æ³ã®éžæè¢ãèãå§ããŸããã
éçºãå£ããªãæ¹æ³
æåã®ãªãã·ã§ã³ïŒ ã¢ããã°ã¬ãŒãã®éçºæã«ãã¹ãŠã®ãã«èŠæ±ãåæ§ç¯ããŸãã ãã®äŸã§ãæ©èœAã®ãã«ãªã¯ãšã¹ããæåã«éçºããããšãæ©èœBã®ãã«ãªã¯ãšã¹ããåæ§ç¯ãããããã«å¿ããŠã³ã³ãã€ã«ãšã©ãŒã®ããã«ãã§ãã¯ã倱æããŸãã
æèŠæéãç解ããããã«ã2ã€ã®PRã®äŸãèããŠã¿ãŸãããã 2ã€ã®PRã2ã€ã®ãã«ãã2ã€ã®ãã¹ãéå§ãéããŸãã æåã®PRãéçºã«æ³šã蟌ãã åŸã2çªç®ã®PRãåæ§ç¯ããå¿ èŠããããŸãã åèšã§ã3ã€ã®ãã§ãã¯ã®2ã€ã®PRèµ·åãéå§ãããŸãïŒ2 + 1 = 3ã
ååãšããŠãããã¯æ£åžžã§ãã ããããçµ±èšãèŠãŠãç§ãã¡ã®ããŒã ã®å žåçãªç¶æ³ã¯10åã®ãªãŒãã³PRã§ããããã§ãã¯ã®æ°ã¯é²è¡ã®åèšã§ãïŒ10 + 9 + ... + 1 =55ãã€ãŸãã10åã®PRãåãå ¥ããã«ã¯ã55ååæ§ç¯ããå¿ èŠããããŸãã ãããŠãããã¯ããã¹ãŠã®ãã§ãã¯ãåããŠåæ Œãã誰ãè¿œå ã®ãã«ãªã¯ãšã¹ããéããããã®10ãåŠçãããŠããçæ³çãªç¶æ³ã§ãã
æåã«ãããŒãžããã¿ã³ãæŒãæéãå¿ èŠãªéçºè ãæ³åããŠãã ããããããé£äººã«ãã£ãŠè¡ãããå Žåããã¹ãŠã®ã¢ã»ã³ããªãåã³ééãããŸã§åŸ ã€å¿ èŠããããŸã...ããããåäœããŸãããéçºãå€§å¹ ã«é ããªããŸãã
2çªç®ã®æ¹æ³ïŒ ã³ãŒãã¬ãã¥ãŒåŸã«ãã«ãªã¯ãšã¹ããåéããã ã€ãŸãããã«ãªã¯ãšã¹ããéããååããå¿ èŠãªæ°ã®æŽæ°ãåéããå¿ èŠãªãã®ãä¿®æ£ããŠãããã«ããå®è¡ããŸãã æåããå Žåããã«ãªã¯ãšã¹ãã¯éçºãšããŒãžãããŸãã ãã®å Žåãè¿œå ã®åèµ·åã¯ãããŸãããããã£ãŒãããã¯ã®é床ã¯å€§å¹ ã«äœäžããŸãã éçºè ãšããŠããã«ãªã¯ãšã¹ããéãããšããããã«åœŒãè¡ãããšããŠããã®ãã©ãããèŠããã§ãã ããšãã°ããã¹ããã¯ã©ãã·ã¥ããå Žåãããã«ä¿®æ£ããå¿ èŠããããŸãã ãã«ããé ããå Žåããã£ãŒãããã¯ãé ããªããŸããããã¯éçºå šäœãæå³ããŸãã ãããç§ãã¡ã«åããªãã£ãã
ãã®çµæã3çªç®ã®ãªãã·ã§ã³ã®ã¿ãæ®ã- ãµã€ã¯ã«ããŸã ã ãã¹ãŠã®ã³ãŒãããã¹ãŠã®ãœãŒã¹ã¯ãBitbucketãµãŒããŒã®ãªããžããªã«ä¿åãããŸãã ãããã£ãŠãBitbucketã®ãã©ã°ã€ã³ãéçºããå¿ èŠããããŸããã
ãã®ãã©ã°ã€ã³ã¯ããã«ãªã¯ãšã¹ãããŒãžã¡ã«ããºã ããªãŒããŒã©ã€ãããŸãã æåã¯æšæºã§ããPRãéãããã¹ãŠã®ã¢ã»ã³ããªãéå§ãããã³ãŒãã¬ãã¥ãŒããã¹ããŸãã ããããã³ãŒãã¬ãã¥ãŒã«åæ Œããéçºè ããããŒãžããã¯ãªãã¯ããããšã決å®ããåŸããã©ã°ã€ã³ã¯éçºãã§ãã¯ãå®è¡ãããç¶æ ã確èªããŸãã éçºããã«ãåŸã«æŽæ°ã§ããå Žåããã©ã°ã€ã³ã¯ãã®ãããªãã«ãªã¯ãšã¹ããã¡ã€ã³ãã©ã³ãã«ããŒãžããããšãèš±å¯ããŸããã ããã¯ãæ°ããéçºã«é¢é£ããŠãã«ããåèµ·åããã ãã§ãã
å€æŽã競åãããã®äŸã§ã¯ãã³ã³ãã€ã«ãšã©ãŒã®ããã«ãã®ãããªãã«ãã¯å€±æããŸãã ãããã£ãŠãæ©èœBã®éçºè ã¯ã³ãŒããä¿®æ£ãããã§ãã¯ãåéããå¿ èŠããããŸãããã®åŸããã©ã°ã€ã³ã¯èªåçã«ãã«ãªã¯ãšã¹ããé©çšããŸãã
ãã®ãã©ã°ã€ã³ãå®è£ ããåã¯ããã«ãªã¯ãšã¹ãããšã«å¹³å2.7åã®ãã¹ããå®è¡ãããŠããŸããã ãã©ã°ã€ã³ã§ã¯ã3.6åã®èµ·åããããŸããã ããã¯ç§ãã¡ã«åã£ãã
ãã®ãã©ã°ã€ã³ã«ã¯æ¬ ç¹ããããŸãããã«ãã1åã ãåèµ·åããããšã«æ³šæããŠãã ããã ã€ãŸããçžå€ãããã競åããå€æŽãéçºã§ããå°ããªãŠã£ã³ããŠãæ®ã£ãŠããŸãã ããããããã®å¯èœæ§ã¯é«ããªããéå§åæ°ãšå€±æã®å¯èœæ§ã®éã§ãã®åŠ¥åãè¡ããŸããã 2幎éãããã¯äžåºŠã ãæã£ãã®ã§ãããããç¡é§ã§ã¯ââãªãã£ãã§ãããã
Bitbucketã®ãã©ã°ã€ã³ã®æåã®ããŒãžã§ã³ãæžãã®ã«2é±éããããŸããã
æ°ãããã§ãã¯
ãã®éãç§ãã¡ã®ããŒã ã¯æé·ãç¶ããŸããã æ°ãããã§ãã¯ãè¿œå ãããŸããã
ç§ãã¡ã¯èããŸããïŒééããé²ãããšãã§ãããªãããªãééãã修埩ããã®ã§ããïŒ ãããŠã圌ãã¯éçã³ãŒãåæãå°å ¥ããŸããã Android SDKã«å«ãŸããŠããlintããå§ããŸããã ãããããã®æç¹ã§ã¯ã圌ã¯Kotlinã³ãŒãã䜿çšããæ¹æ³ããŸã£ããç¥ããŸããã§ãããã¢ããªã±ãŒã·ã§ã³ã®75ïŒ ã¯ãã§ã«Kotlinã§äœæãããŠããŸãã ãããã£ãŠãçµã¿èŸŒã¿ã®Android Studioãã§ãã¯ãlintã«è¿œå ãããŸããã
ãããè¡ãã«ã¯ãéåžžã«åé¯ããªããã°ãªããŸããã§ãããAndroidStudioãDockerã«ããã¯ããä»®æ³ã¢ãã¿ãŒã䜿çšããŠCIã§å®è¡ããå®éã®ã©ãããããã§å®è¡ãããŠãããšèããŸããã ããããããŸããããŸããã
ãŸãããã®æç¹ã§ãå€ãã®èšæž¬ãã¹ãã®èšè¿°ãéå§ãã ã¹ã¯ãªãŒã³ã·ã§ãããã¹ããå®è£ ããŸãã ã ããã¯ãå¥ã®å°ããªãã¥ãŒã«å¯ŸããŠåç §ã¹ã¯ãªãŒã³ã·ã§ãããçæããããšãã§ããããã¹ãã¯ãã¥ãŒããã¹ã¯ãªãŒã³ã·ã§ãããååŸããããã¯ã»ã«ããšã«åç §ãšçŽæ¥æ¯èŒãããããšã§ãã ççŸãããå Žåãã¬ã€ã¢ãŠããã©ããã«è¡ã£ãããã¹ã¿ã€ã«ã«äœãåé¡ãããããšãæå³ããŸãã
ãã ããã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãã¹ããšã¹ã¯ãªãŒã³ã·ã§ãããã¹ãã¯ãããã€ã¹äžïŒãšãã¥ã¬ãŒã¿ãŒäžãŸãã¯å®éã®ããã€ã¹äžïŒã§å®è¡ããå¿ èŠããããŸãã å€ãã®ãã¹ãããããããããé »ç¹ã«è¿œè·¡ããããšãèãããšããã¡ãŒã å šäœãå¿ èŠã§ãã ç¬èªã®ãã¡ãŒã ãéå§ããã®ã¯é¢åãªã®ã§ãæ¢è£œã®ãªãã·ã§ã³ã§ããFirebase Test LabãèŠã€ããŸããã
Firebaseãã¹ãã©ã
Firebaseã¯Googleã®è£œåã§ãããããã€ãŸããä¿¡é Œæ§ãé«ããæ»ã¬å¯èœæ§ãäœãããã«éžæãããŸããã äŸ¡æ Œã¯æé ã§ãïŒå®éã®ããã€ã¹ã®1æéããã5ãã«ããšãã¥ã¬ãŒã¿ãŒã®1æéããã1ãã«ã
Firebase Test LabãCIã«å®è£ ããã®ã«çŽ3é±éããããŸããã
ããããããŒã ã¯æé·ãç¶ããæ®å¿µãªããFirebaseã¯ç§ãã¡ã倱æããå§ããŸããã åœæã圌ã«ã¯SLAã¯ãããŸããã§ããã Firebaseã¯ããã¹ãã«å¿ èŠãªæ°ã®ããã€ã¹ã空ããŸã§åŸ ã¡ãå¿ èŠã«å¿ããŠããã«å®è¡ãéå§ããªãã£ãããšããããŸããã åã«äžŠãã§åŸ ã€ã®ã«æ倧30åããããããã¯éåžžã«é·ãæéã§ãã èšè£ ãã¹ãã¯ãã¹ãŠã®PRã§å®è¡ãããé 延ã«ããéçºãéåžžã«é ããªãããã®åŸãæé¡è«æ±æžã«ç·èšãä»ããŸããã äžè¬çã«ãããŒã ãååã«æé·ãããããFirebaseãæŸæ£ããŠç€Ÿå ã§èŠãããšã決å®ãããŸããã
Docker + python + bash
圌ãã¯ãããã«ãŒã«ãšãã¥ã¬ãŒã¿ãè©°ã蟌ã¿ãé©åãªã¿ã€ãã³ã°ã§é©åãªæ°ã®ãšãã¥ã¬ãŒã¿ãé©åãªã¿ã€ãã³ã°ã§çæããå¿ èŠã«å¿ããŠããããåæ¢ããåçŽãªPythonããã°ã©ã ãäœæããŸããã ãããŠããã¡ãããããã€ãã®bashã¹ã¯ãªãã-ãããããªããã°ã©ãã«ãããŸããïŒ
ç¬èªã®ãã¹ãç°å¢ãäœæããã®ã«5é±éããããŸããã
ãã®çµæããã«ãªã¯ãšã¹ãããšã«ãåºç¯å²ã«ãããããããã³ã°ãã§ãã¯ã®ããŒãžãªã¹ãããããŸããã
- ARCã®ã¢ã»ã³ããª;
- Junitãã¹ã
- 糞ãã;
- Android Studioãã§ãã¯;
- èšè£ ãã¹ã;
- ã¹ã¯ãªãŒã³ã·ã§ãããã¹ãã
ããã«ãããèããããå€ãã®æ éãé²æ¢ãããŸããã æè¡çã«ã¯ããã¹ãŠãæ©èœããŸããããéçºè ã¯çµæãåŸ ã€æéãé·ããããšäžæºãèšããŸããã
é·ãããŸããïŒ BitbucketãšTeamCityããåæã·ã¹ãã ã«ããŒã¿ãã¢ããããŒããã å¹³ååŸ æ©æéã45åã§ããããšãèªèããŸããã ã€ãŸãããã«ãªã¯ãšã¹ããéããéçºè ã¯ãå¹³å45åã®ãã«ãçµæãæåŸ ããŠããŸãã ç§ã®æèŠã§ã¯ãããã¯ãããããããããªãã¯ãã®ããã«åãããšã¯ã§ããŸããã
ãã¡ããããã¹ãŠã®ãã«ããé«éåããããšã«ããŸããã
ã¹ããŒãã¢ãã
ãã°ãã°ãã«ãã䞊ãã§ããã®ãèŠãŠãæåã«è³Œå ¥ããã®ã¯éã§ãã -åºç¯ãªéçºãæãç°¡åã§ãã ãã«ãã¯äžåã«äžŠã°ãªããªããŸããããåŸ æ©æéã¯ã»ãã®ãããããæžå°ããŸããã§ããããªããªããããã€ãã®ãã§ãã¯èªäœãéåžžã«é·ãæéããããŠããããã§ãã
é·ããããã§ãã¯ãåé€ããŸã
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ããããã®ã¿ã€ãã®ãšã©ãŒãåé¡ããã£ããã§ããŸãã
- ã«è¡ããŸãã ã å€æŽã競åããããã«äœããè¡ãããªãå ŽåãCIã¯ã³ã³ãã€ã«ãšã©ãŒããã£ããã§ããŸãã ç§ãèšã£ãããã«ãã ããäœãéããããšãã§ãããéçºãé²ã¿ã誰ããç·åŒµããŸãã
- åäœã®ãã° ã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ãã¢ã»ã³ãã«ããŠãããã¿ã³ãã¯ãªãã¯ãããšã¯ã©ãã·ã¥ãããããã¿ã³ããŸã£ããæŒãããŸããã ãã®ãããªãã°ã¯ãŠãŒã¶ãŒã«å°éããå¯èœæ§ããããããããã¯æªãããšã§ãã
- ã¬ã€ã¢ãŠãã®ãã° ã ããšãã°ããã¿ã³ãæŒããããã10ãã¯ã»ã«å·Šã«ç§»åãããšããŸãã
- æè¡çè² åµã®å¢å ã
ãã®ãªã¹ããèŠããšãæåã®2ã€ã®ãã€ã³ãã®ã¿ãéèŠã§ããããšãããããŸããã ãŸãããã®ãããªåé¡ããã£ããããããšæããŸãã ã¬ã€ã¢ãŠãã®ãã°ã¯ãèšèšã¬ãã¥ãŒã®æ®µéã§æ€åºãããç°¡åã«ä¿®æ£ãããŸãã æè¡çãªè² åµãæ±ãã«ã¯ãå¥ã®ããã»ã¹ãšèšç»ãå¿ èŠãªã®ã§ããã«ãªã¯ãšã¹ãããã§ãã¯ããªãããšã«ããŸããã
ãã®åé¡ã«åºã¥ããŠããã§ãã¯ã®ãªã¹ãå šäœã確èªããŸããã Lintãæ¶ã ãå€ã®æã¡äžãã延æããŸãããããã¯ããããžã§ã¯ãã«ããã€ã®åé¡ãããããå ±åããããã§ãã æè¡çãªè² åµãåå¥ã«åŠçããããšã«åæããŸãããã Android Studioãã§ãã¯ãå®å šã«æåŠããŸãã ã æ€æ»ãéå§ããããã®Dockerã®Android Studioã¯èå³æ·±ãããã«èãããŸããããµããŒãã«ã¯å€ãã®åé¡ãçããŸãã Android StudioããŒãžã§ã³ã®æŽæ°ã¯ãäžæçãªãã°ãšã®æŠãã§ãã ãŸããã©ã€ãã©ãªãéåžžã«å®å®ããŠåäœããã誀æ€ç¥ããã£ããããã¹ã¯ãªãŒã³ã·ã§ãããã¹ããç¶æããããšãå°é£ã§ããã ã¹ã¯ãªãŒã³ã·ã§ãããã¹ãã¯ãã§ãã¯ãªã¹ãããåé€ãããŸãã ã
ãã®çµæã次ã®ããã«ãªããŸããã
- ARCã®ã¢ã»ã³ããª;
- Junitãã¹ã
- èšè£ ãã¹ãã
Gradleãªã¢ãŒããã£ãã·ã¥
éããã§ãã¯ããªããã°ãç¶æ³ã¯æ¹åãããŸããã ããããå®ç§ã«å¶éã¯ãããŸããïŒ
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã§ã«çŽ150ã®gradleã¢ãžã¥ãŒã«ã«åå²ãããŠããŸãã éåžžããã®å ŽåãGradleãªã¢ãŒããã£ãã·ã¥ã¯æ£åžžã«æ©èœãããããè©ŠããŠã¿ãããšã«ããŸããã
Gradleãªã¢ãŒããã£ãã·ã¥ã¯ãåã ã®ã¿ã¹ã¯ã®ãã«ãã¢ãŒãã£ãã¡ã¯ããåå¥ã®ã¢ãžã¥ãŒã«ã«ãã£ãã·ã¥ã§ãããµãŒãã¹ã§ãã Gradleã¯ãå®éã«ã³ãŒããã³ã³ãã€ã«ãã代ããã«ãHTTPçµç±ã§ãªã¢ãŒããã£ãã·ã¥ãããã¯ãªãŒããŒãã誰ãããã§ã«ãã®ã¿ã¹ã¯ãå®è¡ãããã©ãããå°ããŸãã ãã®å ŽåãçµæãããŠã³ããŒãããŠãã ããã
Gradleã¯Dockerã€ã¡ãŒãžãæäŸãããããGradleãªã¢ãŒããã£ãã·ã¥ã®èµ·åã¯ç°¡åã§ãã ããã3æéã§å®äºããŸããã
å¿ èŠãªã®ã¯ãDockerãèµ·åãããããžã§ã¯ãã«1è¡ãç»é²ããããšã ãã§ããã ãã ãããã¹ãŠãæ£åžžã«æ©èœãããããã«ãã°ããéå§ã§ããŸãããæéãããããŸãã
以äžã¯ãã£ãã·ã¥ãã¹ã®ã°ã©ãã§ãã
åœåããã£ãã·ã¥ãééãããã¹ã®å²åã¯çŽ65ã§ããã3é±éåŸããã®å€ã20ïŒ ã«äžããããšãã§ããŸããã Androidã¢ããªã±ãŒã·ã§ã³ãåéããã¿ã¹ã¯ã«ã¯ãGradleããã£ãã·ã¥ãéããããã«ãå¥åŠãªæšç§»çãªäŸåé¢ä¿ãããããšãå€æããŸããã
ãã£ãã·ã¥ãæ¥ç¶ããããšã§ãã¢ã»ã³ããªãå€§å¹ ã«é«éåããŸããã ããããã¢ã»ã³ããªãšã¯å¥ã«ãèšè£ ãã¹ãã¯ãŸã è¿œããããããŠãããé·ãéè¿œããããŠããŸãã ããããããã¹ãŠã®ãã«èŠæ±ã«å¯ŸããŠãã¹ãŠã®ãã¹ãã远跡ããå¿ èŠã¯ãããŸããã 調ã¹ãããã«ã圱é¿åæã䜿çšããŸãã
圱é¿åæ
ãã«ãªã¯ãšã¹ãã§ãgit diffããã«ãããå€æŽãããGradleã¢ãžã¥ãŒã«ãèŠã€ããŸãã
å€æŽãããã¢ãžã¥ãŒã«ãšãããã«äŸåãããã¹ãŠã®ã¢ãžã¥ãŒã«ããã¹ãããèšæž¬ãã¹ãã®ã¿ãå®è¡ããã®ã¯çã«ããªã£ãŠããŸãã é£æ¥ããã¢ãžã¥ãŒã«ã®ãã¹ããå®è¡ããŠãæå³ããããŸãããã³ãŒãã¯ããã§å€æŽãããŠããããç Žæããããšã¯ãããŸããã
ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãã¹ãã¯ãæäžäœã®ã¢ããªã±ãŒã·ã§ã³ã¢ãžã¥ãŒã«ã«é 眮ããå¿ èŠããããããããã»ã©åçŽã§ã¯ãããŸããã åãã¹ããã©ã®ã¢ãžã¥ãŒã«ã«å±ããããç解ããããã«ããã€ãã³ãŒãåæãã¥ãŒãªã¹ãã£ãã¯ãé©çšããŸããã
é¢é£ããã¢ãžã¥ãŒã«ã®ã¿ããã¹ãããããã«ãèšè£ ãã¹ããã¢ããã°ã¬ãŒãããã®ã«çŽ8é±éããããŸããã
æ€èšŒã®é«éå察çã¯æ£åžžã«æ©èœããŸããã 45åããçŽ15ã«å°éããŸããããã«ããåŸ æ©ããã®ã«15åãããã®ã¯ãã§ã«æ£åžžã§ãã
ãããä»ãéçºè ã¯ãã©ã®ãã«ããèµ·åãããŠããã®ãããã°ãã©ãã«è¡šç€ºãããã®ãããã«ããèµ€ã§ããçç±ãã©ã®ãã¹ãã倱æããã®ããªã©ã圌ãã«äžå¹³ãèšãå§ããŠããŸãã
ãã£ãŒãããã¯ã®åé¡ã«ããéçºã®é床ãäœäžãããããåPRããã³ãã«ãã«é¢ããæããããããã詳现ãªæ å ±ãæäŸããããã«ããŸããã ãŸããPRçšã®Bitbucketã«ã€ããŠã®ã³ã¡ã³ãããå§ããŸãããã©ã®ãã«ãã倱æããã®ãããªãSlackã§ã¿ãŒã²ããã¡ãã»ãŒãžãæžããã®ãã瀺ããŠããŸãã æçµçã«ã圌ãã¯PRããŒãžã®ããã·ã¥ããŒããäœæããçŸåšå®è¡äžã®ãã¹ãŠã®ãã«ããšãã®ã¹ããŒã¿ã¹ïŒã€ã³ã©ã€ã³ãéå§ãã¯ã©ãã·ã¥ãçµäºïŒã®ãªã¹ããäœæããŸããã ãã«ããã¯ãªãã¯ããŠããã®ãã°ã«ã¢ã¯ã»ã¹ã§ããŸãã
詳现ãªãã£ãŒãããã¯ã«6é±éãè²»ããããŸããã
èšç»
ææ°ã®æŽå²ã«ç®ãåããŸãã ãã£ãŒãããã¯ã®åé¡ã解決ããåŸãç§ãã¡ã¯æ°ããã¬ãã«ã«å°éããŸãã-ãšãã¥ã¬ãŒã¿ãŒã®ç¬èªã®ãã¡ãŒã ãæ§ç¯ããããšã«ããŸããã å€ãã®ãã¹ããšãšãã¥ã¬ãŒã¿ãŒãããå Žåããããã管çããã®ã¯å°é£ã§ãã ãã®çµæããã¹ãŠã®ãšãã¥ã¬ãŒã¿ãŒã¯ãæè»ãªãªãœãŒã¹ç®¡çãåããk8sã¯ã©ã¹ã¿ãŒã«ç§»è¡ããŸããã
ããã«ãä»ã®èšç»ããããŸãã
- ãªã³ã ïŒããã³ãã®ä»ã®éçåæïŒãè¿ããŸãã ç§ãã¡ã¯ãã§ã«ãã®æ¹åã«åãçµãã§ããŸãã
- SDKã®ãã¹ãŠã®ããŒãžã§ã³ã§PRãããã«ãŒã§ãã¹ãŠã®ãšã³ãããŒãšã³ããã¹ããå®è¡ããŸãã
ãã®ãããAvitoã§ã®ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®éçºã®æŽå²ããã©ããŸããã ããã§ãçµéšè ã®èŠ³ç¹ããããã€ãã®ã¢ããã€ã¹ãããããšæããŸãã
ãã³ã
ã¢ããã€ã¹ã1ã€ã ãã®å Žåãããã¯æ¬¡ã®ããã«ãªããŸãã
ã·ã§ã«ã¹ã¯ãªããã«ã¯æ³šæããŠãã ããïŒ
Bashã¯éåžžã«æè»ã§åŒ·åãªããŒã«ã§ãããã¹ã¯ãªãããæžãã®ã«éåžžã«äŸ¿å©ã§é«éã§ãã ããããããªãã¯åœŒãšäžç·ã«trapã«é¥ãããšãã§ããŸãããããŠãæ®å¿µãªããšã«ãç§ãã¡ã¯ããã«é¥ããŸããã
ãã¹ãŠã¯ããã«ããã·ã³ã§å®è¡ãããåçŽãªã¹ã¯ãªããããå§ãŸããŸããã
#!/usr/bin/env bash ./gradlew assembleDebug
ãããããåç¥ã®ããã«ããã¹ãŠãæéã®çµéãšãšãã«çºå±ãè€éã«ãªããŸã-ããã¹ã¯ãªãããå¥ã®ã¹ã¯ãªããããå®è¡ããããã«ããã€ãã®ãã©ã¡ãŒã¿ãŒãæž¡ããŸããã-æåŸã«ãå¿ èŠãªåŒçšã眮ãæããããã«ãçŸåšã®ãã¹ãbashã®ã¬ãã«ã決å®ããé¢æ°ãèšè¿°ããªããã°ãªããŸããã§ããããã¹ãŠãå§ãŸãããã«ã
ãã®ãããªã¹ã¯ãªããã®éçºã«äŒŽãåŽåãæ³åã§ããŸãã ãã®trapã«é¥ããªãããšããå§ãããŸãã
äœã亀æã§ããŸããïŒ
- ä»»æã®ã¹ã¯ãªããèšèªã PythonãŸãã¯Kotlin Scriptã§èšè¿°ããã®ã¯ãã¹ã¯ãªããã§ã¯ãªãããã°ã©ãã³ã°ã§ããããããã䟿å©ã§ãã
- ãŸãã¯ããããžã§ã¯ãã®ã«ã¹ã¿ã gradleã¿ã¹ã¯ã®åœ¢åŒã§ãã¹ãŠã®ãã«ãããžãã¯ãèšè¿°ããŸãã
2çªç®ã®ãªãã·ã§ã³ãéžæããããšã«ããŸãããçŸåšããã¹ãŠã®bashã¹ã¯ãªãããäœç³»çã«åé€ããå€ãã®ã«ã¹ã¿ã gradleã·ã£ããã«ãèšè¿°ããŠããŸãã
ãã³ã2ïŒã€ã³ãã©ã¹ãã©ã¯ãã£ãã³ãŒãã«ä¿æããŸãã
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³æ§æãJenkinsãTeamCity UIã€ã³ã¿ãŒãã§ã€ã¹ãªã©ã«ä¿åãããããããžã§ã¯ããªããžããªã«çŽæ¥ããã¹ããã¡ã€ã«ãšããŠä¿åãããå Žåã«äŸ¿å©ã§ãã ããã«ãããããŒãžã§ã³ç®¡çãå¯èœã«ãªããŸãã å¥ã®ãã©ã³ãã§ããŒã«ããã¯ãŸãã¯ã³ãŒããåéããããšã¯é£ãããããŸããã
ã¹ã¯ãªããã¯ãããžã§ã¯ãã«ä¿åã§ããŸãã ãããŠãç°å¢ãã©ããããïŒ
ãã³ãïŒ3ïŒDockerã¯ç°å¢ãæ¯æŽã§ããŸãã
æ®å¿µãªãããAndroidéçºè ã«ã¯ééããªã圹ç«ã¡ãŸããiOSã¯ãŸã ãããŸããã
ããã¯ãjdkãšandroid-sdkãå«ãåçŽãªdockerãã¡ã€ã«ã®äŸã§ãã
FROM openjdk:8 ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \ ANDROID_HOME="/usr/local/android-sdk" \ ANDROID_VERSION=26 \ ANDROID_BUILD_TOOLS_VERSION=26.0.2 # Download Android SDK RUN mkdir "$ANDROID_HOME" .android \ && cd "$ANDROID_HOME" \ && curl -o sdk.zip $SDK_URL \ && unzip sdk.zip \ && rm sdk.zip \ && yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses # Install Android Build Tool and Libraries RUN $ANDROID_HOME/tools/bin/sdkmanager --update RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ "platforms;android-${ANDROID_VERSION}" \ "platform-tools" RUN mkdir /application WORKDIR /application
ãã®docker-fileãäœæãïŒç§å¯ããäŒãããŸãããäœæããããšã¯ã§ããŸããããGitHubããæºåããŠãã ããïŒãã€ã¡ãŒãžãåéãããšãã¢ããªã±ãŒã·ã§ã³ããã«ãããŠJunitãã¹ããå®è¡ã§ããä»®æ³ãã·ã³ãååŸã§ããŸãã
ãããçã«ããªã£ãŠãã2ã€ã®äž»ãªè°è«ã¯ãã¹ã±ãŒã©ããªãã£ãšåçŸæ§ã§ãã Dockerã䜿çšãããšãå€ãç°å¢ãšãŸã£ããåãç°å¢ãæã€å€æ°ã®ãã«ããšãŒãžã§ã³ãããã°ããäœæã§ããŸãã ããã«ãããCIãšã³ãžãã¢ã®ç掻ã楜ã«ãªããŸãã android-sdkãdockerã«ããã·ã¥ããã®ã¯éåžžã«ç°¡åã§ãããšãã¥ã¬ãŒã¿ãŒã¯ããå°ãè€éã§ããããå°ãåªåããå¿ èŠããããŸãïŒãŸãããŸãã¯å®æããGitHubããããäžåºŠããŠã³ããŒãããå¿ èŠããããŸãïŒã
ãã³ã4ïŒãã§ãã¯ã¯äººã®ããã«è¡ãããããšãå¿ããªãã§ãã ããã
çŽ æ©ãããããŠæãéèŠãªããšãšããŠãæ確ãªãã£ãŒãããã¯ã¯éçºè ã«ãšã£ãŠéåžžã«éèŠã§ãã圌ããç Žã£ããã®ãã©ã®ãã¹ãã倱æãããããã«ããã°ãããå Žæã§ãã
ãã³ãïŒ5ïŒç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã掻çšããŠãã ããã
ã©ã®ã¿ã€ãã®ãšã©ãŒãé²ãããã®ããã©ã®ãããã®ãªãœãŒã¹ãè²»ããã€ãããªã®ããæéãã³ã³ãã¥ãŒã¿ãŒæéãæ確ã«ç解ããŠãã ããã é·ããããã§ãã¯ã¯ãããšãã°ãäžæ©ã§åã¹ã±ãžã¥ãŒã«ããããšãã§ããŸãã ãããŠãããã»ã©éèŠã§ã¯ãªãééããèŠã€ãã人ã¯å®å šã«æŸæ£ãããã¹ãã§ãã
ãã³ã6ïŒæ¢è£œã®ããŒã«ã䜿çšããŸãã
çŸåšãã¯ã©ãŠãCIãæäŸããå€ãã®äŒæ¥ããããŸãã
å°ããªããŒã ã«ãšã£ãŠãããã¯è¯ãæ¹æ³ã§ãã äœãç¶æããå¿ èŠã¯ãªãããéãæãã ãã§ãã¢ããªã±ãŒã·ã§ã³ãåéããèšæž¬ãã¹ããå®æœããããšããã§ããŸãã
ãã³ãïŒ7ïŒå€§èŠæš¡ãªããŒã ã§ã¯ã瀟å ãœãªã¥ãŒã·ã§ã³ã®æ¹ãåçæ§ãé«ããªããŸãã
ããããé ããæ©ãããããŒã ã®æé·ã«äŒŽããããåçæ§ã®é«ã瀟å ãœãªã¥ãŒã·ã§ã³ã«ãªãã§ãããã ãããã®æ±ºå®ã«ã¯1ã€ã®ãã€ã³ãããããŸãã çµæžåŠã§ã¯ãåçãæžå°ãããæ³åããããŸããã©ã®ãããžã§ã¯ãã§ãããã®åŸã®åæ¹åã¯ãŸããŸãå°é£ã«ãªãããŸããŸãå€ãã®æè³ãå¿ èŠã«ãªããŸãã
çµæžã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãå«ãç§ãã¡ã®äººçå šäœã説æããŠããŸãã ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³éçºã®å段éã®äœæ¥ã¹ã±ãžã¥ãŒã«ãäœæããŸããã
æ¹åã¯ãŸããŸãå°é£ã«ãªãããšãããããŸãã ãã®ã°ã©ããèŠããšãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®éçºã¯ããŒã ã®èŠæš¡ã®æé·ãšäžè²«ããŠããå¿ èŠãããããšãç解ã§ããŸãã 2人ã®ããŒã ã«ãšã£ãŠãå éšãšãã¥ã¬ãŒã¿ãã¡ãŒã ã®éçºã«50æ¥éãè²»ããããšã¯ããŸããŸãã®ã¢ã€ãã¢ã§ãã ããããåæã«ã倧èŠæš¡ãªããŒã ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ããŸã£ããè¡ããªãããšããçµ±åã®åé¡ãéä¿¡ã®ä¿®æ£ãªã©ã®ããã«æªãèãã§ãã ããã«æéãããããŸãã
ç§ãã¡ã¯ã人ã ãé«äŸ¡ã§ããã圌ããééã£ãŠããŠæ ãè ã§ãããããèªååãå¿ èŠã§ãããšããäºå®ããå§ããŸããã ãããã人ã ãèªååããŸãã ãããã£ãŠããããã®åãåé¡ã¯ãã¹ãŠèªååã«é©çšãããŸãã
- èªååã¯é«äŸ¡ã§ãã å€åã¹ã±ãžã¥ãŒã«ãèŠããŠãããŠãã ããã
- èªååã§ã¯ã人ã ã¯ééããç¯ããŸãã
- ãã¹ãŠããã®ããã«åäœããããããªãŒãã¡ãŒã·ã§ã³ã¯æã éåžžã«æ zyã§ãã ä»ã«ãªãæ¹åããã®ãããªããã®ãã¹ãŠã®ç¶ç¶ççµ±åãªã®ãïŒ
: 20% . , . , , , - , develop, . , , - .
Continuous Integration. .
, , AppsConf . . 22-23 .