
éçºã®èªååã«ã€ããŠé·ãé話ããŠããŸããã ãããã£ãŠãä»åã¯ããªãªãŒã¹æéã3æ¥éãã1æ¥éã«ççž®ããããã»ã¹ãããšã©ãŒã®å¯èœæ§ããã人ã®åå ãåé€ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
é·ããŠåä»ãªéã«ã€ããŠè©±ãããšã¯åžžã«å°é£ã§ãã ããããè¿å¹ŽãYandex.Moneyéçºã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãç§ãã¡ã«ãšã£ãŠæãéèŠãªããã»ã¹ã§ãããªãªãŒã¹ãšããèªååã«åããŠå€§ããªäžæ©ãèžã¿åºããŸãããããã¯åãªã眪ã§ã¯ãããŸããã å®éã Bitbucket ã Jenkins ã Jiraã®æã«åºã¥ããŠãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãšç¶ç¶çããªããªã®å®å
šãªãœãªã¥ãŒã·ã§ã³ã倿ããŸããã
誰ãããããã¹ãŠå¿
èŠãšããŸãã
Yandex.Moneyã®éçºã§ã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãšç¶ç¶çããªããªïŒCI / CDïŒã®ããã»ã¹ãæ¯èŒçé·ãé䜿çšãããŠãããããå°ããªãããã§çç£ãžã®å€æŽãé
ä¿¡ããé«ããªãªãŒã¹ããŒã¹ãç¶æã§ããŸãã
ç¶ç¶çããªããªãŒãšç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ã¢ã€ãã¢ã«ã€ããŠå°ããåºæ¬çã«ãããã¯ãœãããŠã§ã¢éçºãžã®åãªãã¢ãããŒãã§ãã
äžè¬çã«ã誰ããè€éãªãªãªãŒã¹ããã»ã¹ãå¿
èŠãšããããã§ã¯ãããŸããã ããšãã°ãã¹ã¿ãŒãã¢ããã«ãšã£ãŠã¯äžå¿
èŠãªæ®µéãå€ããããã¹ã¿ãŒãã¢ããã«ãšã£ãŠæçšã§ã¯ãªãå¯èœæ§ããããŸããã¹ã¿ãŒãã¢ãããéãŸãããã¹ãŠãçãåã§è°è«ããã®ãç°¡åã§ãã ãã ãããããæ§é å
ã§ããŸããããããªãªãŒã¹ããã»ã¹ãäžååã§ããããã«ãäžåºŠã«æ°åã®éèŠãªå€æŽãåæã«çºçãããšããã«è
ããããå Žåã¯ãéçºã®èªååãæ€èšãã䟡å€ããããŸãã
ããã«ãèªååãããããã»ã¹ã«ãããããŒã ã®åŽåã倧å¹
ã«åæžã§ããŸãã CI / CDã®èªååãè¡ããªããšã人çºçãšã©ãŒãå€ãã®æåæäœãçºçããå±éºããããŸãã ããšãã°ãã¿ã¹ã¯ç®¡çãšBitbucketãªããžããªãšã®çµ±åã«æé©ãªäººæ°ã®ã¿ã¹ã¯ãã©ãã«ãŒJiraã䜿çšããŠããŸããããã®å©ããåããŠãªãªãŒã¹ãµã€ã¯ã«ãèªååããããšã¯å°é£ã§ãã ãããã£ãŠããžã§ã³ãã³ã¹ä»¥åã®éçºããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸããã

Yandex.Moneyã®ãªãªãŒã¹ããã»ã¹ã
ã¿ã¹ã¯éçºãšãã°ä¿®æ£ã¯ã Successful Git Branching Modelã䜿çšããŠè¡ããããã¹ãã¯Feature Branchã§è¡ãããŸããã åãå
¥ããã¹ãã®ãªãªãŒã¹åè£çã®æºåäžã«ãæåæäœã®ãã¹ãŠã®å°çãèµ·ãããŸããã éçºè
ã¯æ¬¡ã®æé ãå®äºããå¿
èŠããããŸããã
devã§ãªãªãŒã¹ãã©ã³ããã«ããããŠã次ã®ãªãªãŒã¹ãæºåããŸãã
å°æ¥ã®ãªãªãŒã¹åè£çã®ã³ãŒããåéããŸãã
ã³ãããã«é¢ããã³ã¡ã³ãããããªãªãŒã¹ã«å«ãŸãããã¹ãŠã®Jiraã¿ã¹ã¯ãèŠã€ããJiraã®ãªãªãŒã¹ã«æ·»ä»ããŸãã
ããŒãããã³åãå
¥ããã¹ãçšã«ãã±ãããJiraã§äœæããŸãã
- æåŸã«ããªãªãŒã¹ãæ
åœãããããŒãžã£ãŒã¯ããã±ããã«é¢é£ä»ãããããã¹ãŠã®ã¿ã¹ã¯ããã¹ãããããã¹ãåŸãŸãã¯ãã¹ãäžã«è¡šç€ºãããªãããšã確èªããå¿
èŠããããŸããã
ããã5ã€ã®ãã€ã³ãã®éçºãšè²¬ä»»è
ãšã®ãªãªãŒã¹ã®æ¿èªã«ããã1æ¥ãã1é±éããããŸããã ããã¯æ°žé ã«ç¶ãããšãã§ããªãã£ãã®ã§ã Jenkinsã§ã®ãã®ããã»ã¹ã®èªååãããã«ç»å ŽããŸããã
èªååãããã®
4幎åãç§ãã¡ã¯äœããå€ããæã ãšæ°ä»ããŸãããã·ã¹ãã ã®ãµã€ãºãåŸæ¥å¡ã®æ°ãããã«ãµãŒããŒã®å€æŽãç®ã®åã«å¢ããŠããŸããã 2014幎以éããªãªãŒã¹æ°ã¯3åã«å¢å ããŸãã-1ãæããã45åãã150åã§ãã

ãã®ãšããç§ãã¡ã¯æ¬¡ã®è·ç©ãæã£ãŠèµ°ããŸããïŒ
å®çšŒåç°å¢ãžã®å±éã®ããã«ãªãªãŒã¹ãæ¿èªããåŸãéçšãšã³ãžãã¢ã®ã°ã«ãŒããåãå§ããŸããã æ¯æããµãŒãã¹ã®ã³ã³ããŒãã³ãã¯ã¯ã©ã¹ã¿ãŒæ§æã§æ©èœãããããåã³ã³ããŒãã³ãã®æŽæ°ããã°ã©ã ã®å±éã«ãããæ°ååã®å埩ãçºçããŸããã ããã€ãã®ç°å¢ã§ãªãªãŒã¹ãå±éããã ãã§ãæ¯æ¥5人ã䜿çšããŠããŸããã
ããã«ããããªãªãŒã¹ãå°ãªããã¹ã¿ãããäŒè°å®€ã«éãŸãããã¹ãŠãè¿
éã«è©±ãåãã調æŽã§ããããã«ãªããŸãã ããããããæç¹ã§ããã¯æ·±å»ãªåé¡ãšãªãããªãªãŒã¹ã®ããŒã¹ãéããã®ã«ãã¬ãŒãããããŸããã éçºããã»ã¹ãåèããé·ãæ
ãå§ããŸãããããã¯æ¬¡ã®ããã«èŠçŽã§ããŸãã

å®éãå®å
šã«èªååããããªãªãŒã¹æºåããã»ã¹ã§ããéçšéšéã®çç£æ§ã«åºããããããããŒã¹ã倧å¹
ã«äžããããšã¯ã§ããŸãããããæç¹ã§ã¯ã1ã€ã®æŽæ°ããã°ã©ã ã®ã¿ãå±éããã®ãæ
£äŸã§ãã ããã¯ããªãªãŒã¹ã«ããçºçããå¯èœæ§ã®ãããšã©ãŒã®èšºæã容æã«ããããã«è¡ãããŸãã
éçšã«ç§»è¡ããããã®ãªãªãŒã¹ã®äœæãšãã¹ãã ãã§ãªãã å±éèªäœãèªååããå¿
èŠãããããšãããããŸããã ã€ãŸããéçºãšéçšã®äžéšã®ããã»ã¹ãæ¹åããããšã§ãã æäœãèªååããæåã®è©Šã¿ã¯ã以åã®èšäºã®1ã€ã§èª¬æãããã ãã§ããããã®çµéšã¯åœ¹ã«ç«ã¡ããã¹ãæè¡çãªè§£æ±ºçãæãèµ·ããããŸããã çŸåšãã»ãšãã©ã®ã³ã³ããŒãã³ãã«å®è£
ãããŠãããå°æ¥ãå¥ã®åºçç©ã®çç±ã«ãªãå¯èœæ§ããããŸãã
ãªããžã§ã³ãã³ã¹
以åã¯JetBrains Teamcityã䜿çšããŠã³ãŒããæ§ç¯ããŠããŸããããéçºè
ãšãµãŒãã¹ã®æ°ã®å¢å ã¯ãYandex.Moneyã®ãã®ãããªãœãªã¥ãŒã·ã§ã³ã®çµæžçäžäŸ¿ãã瀺ããŠããŸããã§ããã ãããã£ãŠã圌ãã¯ãªãŒãã³ãœãŒã¹ã«ç®ãåããã第2ããŒãžã§ã³ããšããŠããªãŒãã³ã§ç¡æã®Jenkinsã«åºã¥ããŠåçã®ããšãè¡ããŸããã
èªååã¿ã¹ã¯ã¯æ¬¡ã®ãšããã§ãã
åçãªJenkinsã¿ã¹ã¯ã®çæã ã³ã³ããŒãã³ãå
ã®ã³ã³ããŒãã³ããšãã©ã³ãã®ã¬ãã«ã§ã¿ã¹ã¯ãäœæããŠææ°ã®ç¶æ
ã«ä¿ã€ããšãã§ããŸãã
ãã¹ãã®æºå ïŒ
ãªãªãŒã¹ãã©ã³ãã®åæã Bitbucketã®Jenkinsããã«ã®ãã¿ã³ã¯ãdevãã©ã³ãããæ°ãããªãªãŒã¹ãã©ã³ããäœæããŸãããã®ãã©ã³ãã«ã¯ãéçºè
ããã®ãã¹ãŠã®å€æŽãæ¢ã«è¿œå ãããŠããŸãã
ãã¹ãçšã®ã¢ã»ã³ããªã å¥ã®ã¹ã¯ãªããããã¹ãçšã®ããã±ãŒãžãåéããŸãã Jenkinsã¯Jiraã§RLãã±ãããäœæãã説æã«é©ããéçºè
ã¿ã¹ã¯ããã€ã³ãããŸãã
- ãã®ã¹ã¯ãªããã¯ãåãå
¥ããã¹ããšçµ±åãã¹ãã®ã¿ã¹ã¯ãçæããŸãã Jenkinsã¯ããªãªãŒã¹ã«å«ãŸããã¿ã¹ã¯ã®ãã¹ãŠã®ãªãã¶ãŒããŒã«ãªãªãŒã¹æ
å ±ãèšèŒããé»åã¡ãŒã«ãéä¿¡ããŸãã
æ¬çªå±é ïŒ
å®çšŒåç°å¢ã§ã®å±éçšã«ãã«ãããŸãã éçºè
ã®ããŒã ã§ã¯ãJenkinsã¯ãªãªãŒã¹ãã©ã³ãã®ã³ãŒãããã¹ã¿ãŒã«ããã¹ã¿ãŒããéçºè
ã«è¿œå ãïŒéçºè
ãææ°ããŒãžã§ã³ãå
¥æã§ããããã«ïŒãå±éçšã®ããã±ãŒãžãäœæããŸãã
- ãã«ãåŸãJenkinsã¹ã¯ãªããã¯Jiraã§ã¿ã¹ã¯ãäœæããŠéçšéšéã®ãªãªãŒã¹ãå±éããæ
åœè
ã«éä¿¡ããŸã-éçšç°å¢ã«ã¢ããããŒãã§ããŸãã
åæ®µéããã詳现ã«åæããŸãã
Jenkinsã®åçã¿ã¹ã¯çæ
æ°ããã¿ã¹ã¯èšè¿°ãã¡ã€ã«ãã³ã³ããŒãã³ããªããžããªã«è¿œå ãããšãJenkinsã¯ãã®ã¿ã¹ã¯ã®ã¢ã»ã³ããªã¿ã¹ã¯ãèªåçã«äœæããŸãã SyncBitbucketã¡ã«ããºã ããããæ
åœãããã®å®äŸã¯Githubã«ãããŸãã
Bitbucketãšã®çžäºäœçšã¯ãAPIãšJenkinsãä»ããŠè¡ãããŸã-Job DSLãã©ã°ã€ã³ã䜿çšããŸãã
åççæã®æé ã¯æ¬¡ã®ãšããã§ãã
Bitbucketåæã¿ã¹ã¯ãæåã§äœæããŸãïŒãã¡ã€ã«synchronizeBitbucket.groovy ïŒã ã¿ã¹ã¯ã¯Bitbucketãããžã§ã¯ããå®è¡ããåã
ã®ãããžã§ã¯ããåæããããã®ã¿ã¹ã¯ãçæããŸãã ãããžã§ã¯ããšã¯ãç®çã䌌ããšã³ãã£ãã£ïŒãµãŒãã¹ãã©ã€ãã©ãªãgradleãã©ã°ã€ã³ïŒããããªããžããªã®ã»ããã§ãã æ°ãããããžã§ã¯ãã®åºçŸã远跡ã§ããªãããããã®ã¿ã¹ã¯ã¯ã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠå®è¡ãããŸãã
ãããžã§ã¯ããåæããããã®ã¿ã¹ã¯ïŒãã¡ã€ã«synchronizeProject.groovy ïŒãã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠèµ·åããããªããžããªãæ€çŽ¢ããåãªããžããªãåæããããã®ã¿ã¹ã¯ãäœæããŸãã
- ãªããžããªãåæããã¿ã¹ã¯ïŒãã¡ã€ã«synchronizeRepo.groovy ïŒã¯ãã¡ã«ããºã ã®äž»èŠéšåã§ãã ãã®ç®æšã¯ããã¹ãŠã®ãã©ã³ãã調ã¹ãŠããã©ã³ãå
ã®ã¹ã¯ãªãããã¡ã€ã«ãèŠã€ããŠã¿ã¹ã¯ãçæããå®è¡ããããšã§ãã ã¿ã¹ã¯ã¯ããªããžããªã«ã³ãããããããšã§èµ·åãããŸãã
ã¿ã¹ã¯ãçæããããã®ã¹ã¯ãªããã¯ã JobDSLplugin圢åŒã§èšè¿°ãããŠããŸãã éçºè
ãæ°ããã¿ã€ãã®ã¿ã¹ã¯ãJenkinsã«è¿œå ããã«ã¯ããªããžããªã®ã«ãŒããã£ã¬ã¯ããªã®\ Jenkinsãã©ã«ããŒã«jenkins_ãã¬ãã£ãã¯ã¹ãæã€ãã¡ã€ã«ãé
眮ããã ãã§ãã ã¿ã¹ã¯äœæã¹ã¯ãªããã§ã¯ãããšãã°ãJenkinsã®ãã©ã³ãåããªããžããªã¢ãã¬ã¹ããã£ã¬ã¯ããªã¢ãã¬ã¹ãªã©ããªããžããªåæã¡ã«ããºã ã«ãã£ãŠæäŸãããããŒã¿ã䜿çšã§ããŸãã
ãªãªãŒã¹ãã©ã³ããã«ããããã¿ã¹ã¯ã®èª¬æã®äŸïŒ
folder(jobParams.jenkinsDirectory) if (jobParams.gitBranch != "dev") { return } job(jobParams.jenkinsDirectory + "/createReleaseBranch") { jdk('jdk1.8.0') scm { git { remote { url(jobParams.gitRepoUrl) refspec('refs/remotes/origin/*') branches("**/$jobParams.gitBranch") } } } steps { gradle { makeExecutable(true) description(' ') tasks(':createReleaseBranch') } } }
åæ§ã®ã¡ã«ããºã ã«ãããæå°éã®åŽåã§ã³ã³ããŒãã³ãããšã«ãªãªãŒã¹ãµã€ã¯ã«ã®æ®µéãå®è£
ããããšãã§ããŸããã Travis CIã«é¡äŒŒããŠããããšãããã ãåãã©ã³ãã«ã€ããŠãç¬èªã®ã¢ã»ã³ããªã»ãããäœæã§ããŸãã
è©Šéšæºå
Jenkinsã§ãªãªãŒã¹ãµã€ã¯ã«ãèªååããã«ã¯ããªãªãŒã¹ãµã€ã¯ã«ã®å段éã§ãèµ·åãã¿ã³ãã®ããã«èŠããããã€ãã®ã¹ã¯ãªãããäœæããå¿
èŠããããŸããã
ã¹ã¯ãªããã¯ãåã³ã³ããŒãã³ãã®åçãªã¿ã¹ã¯çæã®æ®µéã§äœæãããŸãã ã€ãŸãããªãªãŒã¹ãµã€ã¯ã«ã®1ã€ãŸãã¯å¥ã®æ®µéã®éå§ã¯ããªãªãŒã¹ã®æºåãè¡ãããŠããã³ã³ããŒãã³ãã®ç¹å®ã®ã¹ã¯ãªããã®èµ·åãæå³ããŸãã
devãã©ã³ãããcreateReleaseBranchãå®è¡ãããšãBitbucketã«ãªãªãŒã¹ãã©ã³ãããJenkinsã«å¥ã®ãã©ã«ããŒã圢æãããŸãã ãã©ã«ãã®ååã¯ããrelease_versionãã¹ããŒã ã«åŸã£ãŠèªåçã«éžæãããŸãã

次ã«ãããã°ã©ããŒã¯æ°ãããã©ã«ããŒã«ç§»åãã ããã§å¥ã®prepareReleaseForTestingã¹ã¯ãªãããå®è¡ããå¿
èŠããããŸã ããã®ã¹ã¯ãªããã¯æŽæ°ããã±ãŒãžãåéãããªãªãŒã¹ã¢ã»ã³ããªã«é¢ããéç¥ãé¢ä¿è
å
šå¡ã«éä¿¡ããŸãã ããã«ãåãå
¥ããã¹ããšã¹ãã¬ã¹ãã¹ãã¿ã¹ã¯ãJiraã§äœæãããŸãã
ãã¹ãã®ããã«æ°ãããªãªãŒã¹ãéä¿¡ããçŽåŸã«ããã¹ãŠã®é¢ä¿è
ã«ãã®ããšãäŒããå¿
èŠããããŸãã ãã®ããããããã¯ããããŒãžã£ãŒã¯ãäºåã«ããŒã±ãã£ã³ã°ãšPRã«åæããã©ã€ã³ãããŒãžã£ãŒã¯äœãèµ·ããŠããã®ããææ¡ãããã¯ãã«ã«ãµããŒãã¯ãŠãŒã¶ãŒã®è³ªåã«å¯Ÿããåçãå°ãåºãããšãã§ããŸãã

Jiraã§ã®ãã±ããã¿ã€ãã«ã€ããŠã®äœè«ã§ããRLã¯ããªãªãŒã¹ã®èª¬æãèšèŒããããã±ããã§ããããã®ãªãªãŒã¹ã«å«ãŸããã¿ã¹ã¯ãžã®ãªã³ã¯ãå«ãŸããŠããŸãã
INT-ãªãªãŒã¹ã®åãå
¥ããã¹ãã®ã¿ã¹ã¯ã
- LOAD-è² è·ãã¹ãã®ã¿ã¹ã¯ã
ããããã¹ãŠãå®çŸããã«ã¯ããžã§ã³ãã³ã¹ããžã©ãšåéã«ããããšãéèŠã§ããã ããã§ã¯ãBitbucketã®ã³ãŒã倿Žã«å¯Ÿããéçºè
ã®ãã®ãããªèª¬æãããèŠããããããå
šäœã®åé¡ã¯çµç¹ã®åé¡ã«ããã£ãŠããŸãã
ãã®ãããªèª¬æã§ã¯ãJiraã§ã®ã¿ã¹ã¯ã³ãŒãã®å€æŽã®çš®é¡ãçè§£ããããšã¯å°é£ã§ãã ãã®ããããŸããBitbucketã®å€æŽã«é¢ããã³ã¡ã³ãã«ã¿ã¹ã¯çªå·ãå«ãŸããããšã«éçºè
ã«åæããŸããïŒããšãã°ããBACKEND-186 Fixedã¡ãŒã«ã®éä¿¡ãïŒã éçºè
ã¯GitãšBitbucketã®å±¥æŽãåæããããã«å¿
èŠã§ããããããã®æ°å€ã¯ä»¥åã®ãã®ã§ããããä»ã§ã¯éèŠã«ãªã£ãŠããŸãã
人çèŠå ãæå¹ã«ãªãã誰ãããããå¿ããå Žå-ãžã§ã³ãã³ã¹ã¯äžè¬çãªãªãªãŒã¹ã¬ã¿ãŒã«ã³ã¡ã³ããããã®ãŸãŸã远å ããããšãã°ããããžã§ã¯ããããŒãžã£ãŒãã¿ã¹ã¯ãJiraã®RLã«å²ãåœãŠãŸãã
å±é
Jenkinsã®æ¬¡ã®2ã€ã®ã¿ã¹ã¯ã¯ãå±éããã»ã¹ãæ
åœããŸãã
ãã¹ãåŸã責任è
ã¯Jenkinsã®ãªãªãŒã¹ãã©ã«ããŒã«ç§»åããmergeToMasterã¹ã¯ãªãããå®è¡ããŸããããã«ãããBitbucketã§merge release-> masterããã³master-> devãå®è¡ãããŸãã

æçµæ®µé-çç£ã®ããã®ã¢ã»ã³ããªãæ®ããŸãã prepareReleaseForProductionã¹ã¯ãªããããããæ
åœããŸããããã¯ã.DEBããã±ãŒãžãåéããã¿ã¹ã¯ãéçšéšéã«èšå®ãããªãªãŒã¹ã®æºåãã§ããŠã¢ããããŒãã§ããããšãæ
åœè
ã«äŒããŸãã
ãªãªãŒã¹ãµã€ã¯ã«ãèªååããéçºãããžã§ã¯ããšããŠããã¹ããã§ãŒãºãããã«å®å
šã«èªååããããã«ããã¹ãéšéã§çµ±åãã¹ããšã®ãªã³ã¯ãæ§ç¯ããŠããŸãã éçºè
ããªãªãŒã¹ãããé »ç¹ã«ãªãªãŒã¹ããããã«ãJenkinsã«1æ¥ã«1åãdevãã©ã³ãã®æ°ããã¿ã¹ã¯ã«é¢ããéç¥ãèªåçã«éä¿¡ããããã«æç€ºããŸããã ããã«ãããã«ãããéçºè
ããã¹ã¿ãŒãããã³ã·ã¹ãã 管çè
ãå°æ¥ã®èªåãªãªãŒã¹ã«ããã«åããããšãæåŸ
ãããŠããŸãã
ãªãªãŒã¹ãžã®ã¢ãããŒãã«ã€ããŠç¥ããã-ãã¥ãŒãã³ãšã©ãŒã«ã©ã®ããã«å¯ŸåŠããŸãããå®å®ãããªãªãŒã¹çãç¶æããŠããŸããïŒ