ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãµãŒããŒã«äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠæåã§æ§æããå¿ èŠãããäºåºŠãšãªãããšãæ³åã§ããŸããïŒ ãã«ãã®ãã¹ãŠã®ã¹ããããçã«åé¢ããDockerã³ã³ãããŒã§ã®ã¿åäœãããããšãã§ãããšæããŸããïŒ çµå±ã®ãšãããGolangã§æžããããã¹ãŠã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ããã20ã«ãã ãGithubã«9k以äžã®ã¹ã¿ãŒãä»ããããŒã«ãè©ŠããŠã¿ãŸãããïŒ
ãã®èšäºã§ã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ç°¡çŽ åãšæ¹åã«ãã§ã«åœ¹ç«ã£ãŠããåªãããããŒã³CIã«ã€ããŠã話ããããšæããŸãã ãããŒã³CIã€ã³ã¹ããŒã«ã®è©³çŽ°ãå ±æããå°èŠæš¡ãããžã§ã¯ãã®äŸã§äœ¿çšã®ãã¹ãŠã®è©³çŽ°ã瀺ããŸãã ããŸãèªã¿ãããªãã®ã§ããã«è©ŠããŠã¿ããå Žåã¯ãèšäºã®æåŸã«ãã¯ã€ãã¯ã¹ã¿ãŒãã«åœ¹ç«ã€Githubãªããžããªãžã®ãªã³ã¯ããããŸãã
ã¡ã€ã³ãããã¯ã«ç§»ãåã«ã docker -composeã«é¢ããèšäºã®å€æ°ã®è¯ãã¬ãã¥ãŒãšããã¡ããããã®èšäºãååšããªããããŒã³CIã®èè ã§ããBrad Rydzewskiã«æè¬ããŸãã ããã¯ç§ãã¡ãããã«æžãããã®å€§ããªåæ©ã§ãïŒ
ã¡ãã£ãšããæŽå²
ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãïŒCIïŒãšããçšèªã«ãã§ã«ç²ŸéããŠãããããã«è©³ããç¥ãããå Žåã¯ã Martin Fowlerã«ãããã°ãããèšäºããå§ããŠãã ãã ã ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ãåé¡ãç¹å®ããã¢ããªã±ãŒã·ã§ã³å±éããã»ã¹ãå®å šã«èªååãããšåæã«ãããŒã å šäœã®æéãå€§å¹ ã«ç¯çŽã§ãããšããç¹ã§ãç§ãã¡ã«ãšã£ãŠé·ãé銎æã¿ã®ãããã®ã«ãªããŸããã
ç§ã¯7幎éCIãµãŒããŒã䜿çšããŠããŸããããç§ãã¡ã®å€ããããã§ããããã«ã Jenkinsãå§ããåŸã«TeamCityãå§ã ã Travis CIã«å€¢äžã«ãªããŸããã ãããã®å補åã¯ãç¶ç¶çãªçµ±åãã©ã¯ãã£ã¹ãéçºããããã«å€ãã®ããšãè¡ã£ãŠããŸããã ããŒã«ãæã
å€æŽããã¢ã€ãã¢ã®1ã€ã¯ãããã»ã¹ãå®å
šã«èªååããæ©èœã§ãã JenkinsãšTeamCityã«ã¯éåžžã«éçºããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããããä»»æã®ãããžã§ã¯ãã®ç¶ç¶çãªçµ±åãæ§æã§ããŸãããèªååããã®ã¯éåžžã«å°é£ã§ãã Travisã¯éåžžã«åªããããŒã«ã§ããã ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ãã¹ãã¯10000ïŒ
ç¡æãã§ãããããç§ã®ãã¹ãŠã®ãªãŒãã³ãœãŒã¹ã®åãçµã¿ã«ãããŠäŸç¶ãšããŠãã³ããŒã¯ã³ã®éžæè¢ã§ãã Travisã¯ãåäžã®.travis.yml
ãã¡ã€ã«ãšã®ç¶ç¶çãªçµ±åãå¯èœã«ããæåã®ããŒã«ã§ããã
ã³ãŒããšããŠã®ãã€ãã©ã€ã³
ãã³ãŒããšããŠã®ãã€ãã©ã€ã³ãã¯ãå®è¡äžã®CIãµãŒãã¹ãæåã§æ§æãã代ããã«ãã³ãŒãã䜿çšããŠãå±éãã€ãã©ã€ã³ããæ§æã§ããæ¯èŒçæ°ããã¢ãããŒãã§ãã ä»æ¥ããã®æŠå¿µã¯éåžžã«äººæ°ãããããã®ã»ã°ã¡ã³ãã§ã¯å°ãªããšã5人ã®ãã¬ãŒã€ãŒã ã€ãŸãLambdaCD ã Concourse ã Drone ã GoCD ã Travis CIã ç¥ã£ãŠããŸãã ãã®ã¢ãããŒãã«ãããç¶ç¶çãªçµ±åãšç¶ç¶çãªå±éã®èªååã容æã«ãªãã ãã§ãªããå±éã®ããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããã¹ãããããšãã§ããŸãã ãã®æŠå¿µã«ãããç§ãã¡ã¯äžçãç°ãªã£ãŠèŠãããã«ãªããŸããããæãéèŠãªããšã¯ãCIãããå¹ççãã€ãšã¬ã¬ã³ãã«äœ¿çšã§ããããšã§ãã
ç¶ç¶çã«çµ±åããæ¹æ³
çŸåšã6人ãããŒã ã§åããŠãããç¶ç¶çãªçµ±åãšå±éã«å¯Ÿããã¢ãããŒãã¯éåžžã«ç°¡åã§ãã Githubã ãã«ãªã¯ãšã¹ã ã ã³ãŒãã¬ãã¥ãŒãç©æ¥µçã«äœ¿çšããŠããŸãã ç¶ç¶çããªããªã®è©³çŽ°ã«ã€ããŠã¯ãJez HumbleãšDavid Farleyã«ããç¶ç¶çããªããªïŒãã«ãããã¹ããå±éã®èªååã«ããä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ãªãªãŒã¹ãã芧ãã ããã
ç¶ç¶çãªçµ±åãšç¶ç¶çãªå±éã®äž»ãªæé ïŒ
- åããŒã ã¡ã³ããŒã¯å¥ã ã®ãã©ã³ãã§äœæ¥ããã¿ã¹ã¯ãå®äºãããšããã«ãã«ãªã¯ãšã¹ããäœæããŸãã
- ãã«ãªã¯ãšã¹ãã®åã³ãããã¯ãCIãµãŒããŒã«ãã£ãŠãã§ãã¯ãããŸãã ãŠããããçµ±åãUIãã¹ãããªã³ãã£ã³ã°ãéå§ãããŸãã èµ·åã¹ããŒã¿ã¹ã¯Githubã«è¡šç€ºãããŸãã
- åãã«ãªã¯ãšã¹ãã¯ã2人ã®ããŒã ã¡ã³ããŒãé²èŠ§ããå¿ èŠããããŸãã ãããã®1ã€ã¯ãã³ãŒããããŒã«ã«ã§å®è¡ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ãã¹ãŠã®å€æŽããã§ãã¯ããŸãã ãã¹ãã®éå§ã«æåããã¬ãã¥ãŒã«åæ Œãããšãã³ãŒããã¡ã€ã³ãã©ã³ãïŒãã¹ã¿ãŒïŒã«ããŒãžãããéçšåç°å¢ãžã®èªåå±éããã»ã¹ãéå§ãããŸãã
- å±éã¯2ã€ã®ã¹ãããã§æ§æãããŸãã ãŸãããã¹ãŠã®Dockerã³ã³ãããDockerHubã§å ¬éãã次ã«ãµãŒããŒã«ã¢ããªã±ãŒã·ã§ã³ãå±éããå°ããªAnsibleã¹ã¯ãªãããå®è¡ããŸãã
- å°ãã®æåãã¹ãã®åŸããã¹ãŠã®å€æŽããå®çšŒåããã©ã³ãã«ã¢ããããŒãããããå®çšŒåãç°å¢ã§èªåå±éã®ããã»ã¹ããã§ã«éå§ãããŸãã
ãã®ããã»ã¹ã«ã¯ããã€ãã®æ¬ ç¹ããããããŒã ã倧ãããªããšå€æŽãå¿ èŠã«ãªããŸãã ããããä»æ¥ãããã¯ç§ãã¡ã«å®å šã«åã£ãŠãããç§ãã¡ã®æèŠã§ã¯ã10人ãŸã§ã®å°ããªããŒã ã«çæ³çã§ãã äž»ãªæ¬ ç¹ã¯æ¬¡ã®ãšããã§ãã
- å€æ°ã®ãã¹ãã«ããããããããã¹ã¿ãŒã«é¥ãããã€ãã®å€æŽã«ã¯æ¬ é¥ãå«ãŸããŠããŸãã ããã«ãããæ¬ é¥ãä¿®æ£ããããŸã§ãä»ã®ãã«èŠæ±ã®å±éããããã¯ãããŸãã
- ãã¹ã¿ãŒãã©ã³ããããããã¯ã·ã§ã³ã¬ãã£ãç¶æ ã«ãªãå Žåãããã»ã¹ããéžè±ããã¯ã©ã€ã¢ã³ããããããã¯ã·ã§ã³ããã©ã³ãã§çŽæ¥æ±ããŠããåé¡ãä¿®æ£ããå¿ èŠããããŸããããã«ããããããã®å€æŽããã¹ã¿ãŒãã©ã³ãã«æ»ãå¿ èŠããããŸãã
- äœããããŸããããªãã£ãå ŽåãããŒã«ããã¯ã®å€æŽããã»ã¹ãå®å šã«è§£æ±ºããŠããŸããã ããã¯ããã©ã³ãã®ããããã¯ã·ã§ã³ããå±éåã®ç¶æ ã«ããŒã«ããã¯ããããšã§æ§æãããŠããŸãã ããŒã¿ããŒã¹ãžã®å€æŽãå¿ èŠãªå Žåããã®æ®µéã§ããããæåã§å®è¡ããŸãã
ããŒã ãæé·ããã«ã€ããŠããããã®æ¬ ç¹ã«å¯ŸåŠããŸãã ä»æ¥ãç§ãã¡ã¯ãã§ã«1æ¥ã«æ°åãããžã§ã¯ããã»ãŒç¡çã§å±éã§ããŸãã Githubã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯ãŸã ãããã€ããŠããŸããããæåã®ã¹ãããã¯ãã§ã«å®è¡ãããŠããŸã:)
ãããŒã³ci
ããŸããŸãªããŒã«ãæ¯èŒããåŸãç§ãã¡ã®éžæã¯ãããŒã³CIã§æ±ºãŸããéå»3ãæã§å®å šã«åãæ¿ããŸããã ãããŒã³CIã«ã¯ãGithubã«9003åã®æããããŸãïŒ2017幎3æ15æ¥ïŒã ãããŒã³CIã¯ãGithubã®Goã§äœæãããäžäœ20ã®ã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããŠããŸãã Gitter ã®ãã£ã³ãã«ã¯æ±ºããŠç ããŸãã-ããã«ãã質åã«å¯ŸããçããåŸãããšãã§ããŸãã
èšçœ®
ãããŒã³CIã¯ãåäžã®8ã¡ã¬ãã€ã Dockerã³ã³ãããŒã§ãã ãã®ã³ã³ããã«ã¯2ã€ã®ãµãŒãã¹ãå«ãŸããŸãã
- ãããŒã³UIã¯ããšãŒãžã§ã³ãã調æŽãããã«ãã¹ããŒã¿ã¹ã衚瀺ããã·ã³ãã«ãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã³ãµãŒããŒã§ãã
- ãããŒã³ãšãŒãžã§ã³ãã¯ããããžã§ã¯ãã®ã¢ã»ã³ããªãéå§ããå¥ã®ãµãŒãã¹ã§ãã
éå»ããã³çŸåšã®ãã«ãã«é¢ãããã¹ãŠã®ããŒã¿ã¯ããŒã¿ããŒã¹ã«ä¿åãããŸãã Sqliteã¯ããã©ã«ãã§äœ¿çšãããŸãã ãPostgreSQLãMySQLãªã©ã®ä»ã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã䜿çšããããšãã§ããŸãã ãã®èšäºã®ããã«ã GithubãªããžããªãçšæããŸãããããã¯ãæ°åã§Drone CIãããŒã«ã«ç°å¢ãŸãã¯å®çšŒåç°å¢ã«ã€ã³ã¹ããŒã«ããã®ã«åœ¹ç«ã¡ãŸãã
ã¯ããã«
ãŸãããããŒã³CIã®åçãç°¡åã«çŽ¹ä»ããããšæããŸãã Githubã¢ã«ãŠã³ãã䜿çšããŠDrone CIãã€ã³ã¹ããŒã«ããŠãã°ã€ã³ãããšãDroneã¯ãã¹ãŠã®ãªããžããªãèªåçã«è¡šç€ºããŸãã æåã®ã¹ãããã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãèšå®ãããªããžããªãæå¹ã«ããããšã§ãïŒ
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®æäœã¯ã»ãŒçµãããŸããã ããã«ããã«ãã®ã¹ããŒã¿ã¹ã確èªããããã«ã®ã¿å¿ èŠã§ãã
å±éæé ã®ãã¹ãŠã®èšå®ã¯ã1ã€ã®ãã¡ã€ã«drone.yml
ã§å®è¡ãããŸãã ãã®ãã¡ã€ã«ã¯éåžžããªããžããªã®ã«ãŒãã«ãããCIãµãŒããŒã§çºçãããã¹ãŠãå®å
šã«èšè¿°ããŸãã æ¬è³ªçã«ã .drone.yml
ã¯ä»»æã®ã¹ãããã®ã»ããã§ãããåã¹ãããã¯åå¥ã®åé¢ãããDockerã³ã³ããã§å®è¡ãããŸãã åã³ãããã§ã .drone.yml
ããã¹ããããå®è¡ããåã«ãDroneã¯ãªããžããªãèªåçã«è€è£œããåã¹ãããã®Dockerããªã¥ãŒã ãšããŠè¿œå ããŸãã
ããæ確ã«ããããã«ããã¹ããå®è¡ããDockerã€ã¡ãŒãžãåéããDockerhubã«å ¬éãããã«ããå®äºãããSlackã«ç°¡åãªéç¥ãéä¿¡ããç°¡åãªæ§æãèŠãŠã¿ãŸãããã
pipeline: run-tests: image: node:6.3.0 commands: - cd ./api && npm i --quiet - npm test publish-api-docker: image: plugins/docker:1.12 username: ${DOCKER_USERNAME} password: ${DOCKER_PASSWORD} email: ${DOCKER_EMAIL} repo: anorsich/ds-api tags: - latest dockerfile: ./api/Dockerfile context: ./api/ slack-notification: image: plugins/slack webhook: https://hooks.slack.com/services/... username: drone-ci channel: andrew icon_emoji: ":rocket:"
以äžã§ãïŒ ããã§ããªããžããªãžã®åã³ãããã§ããã¹ããå®è¡ããã³ã³ãããåéããSlackã§éç¥ãåãåããŸãã
ãµãŒãããŒãã£ã®äŸåé¢ä¿ãšã¢ã»ã³ããªæé ã®åé¢
Droneã®åã¹ãããã¯åå¥ã®Dockerã³ã³ãããŒã§å®è¡ãããããããµãŒããŒãšãŒãžã§ã³ããžã®äŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ãæŽæ°ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã éèŠãªéãã¯ãåã¹ãããã®äŸåé¢ä¿ãå®å šã«ç°ãªãå Žåãããããšã§ãã 1ã€ã®ã¹ãããã§Node.JSã®ãã¹ããå®è¡ãã次ã®ã¹ãããã§Goã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã®äœæãéãã«éå§ã§ããŸãã ãã©ãããã©ãŒã ã®æ°ããããŒãžã§ã³ãžã®ç§»è¡ã¯ãã³ã³ããã®ããŒãžã§ã³ãå€æŽããã ãã§å®è¡ãããŸãã ããšãã°ããã¹ããå®è¡ããNode.JSã®ææ°ããŒãžã§ã³ã§ãããžã§ã¯ãããã«ãããæ°ããã¹ããããç°¡åã«è¿œå ã§ããŸãã
run-tests-on-latest-node: image: node:7.7 commands: - cd ./api && npm i --quiet - npm test
å®éãCIãµãŒããŒãæ§æããå¿
èŠãããã®ã¯1ã€ã®å Žåã®ã¿ã§ã-CIãµãŒããŒèªäœã®æ°ããããŒãžã§ã³ããªãªãŒã¹ãããå Žåã ä»ã®ãã¹ãŠã¯ãã·ã³ã°ã«ã¯ãªãã¯ãªãã§ã .drone.yml
ã®ãªããžããªã§çŽæ¥èšå®ãããŸãã ã€ã³ã¹ããŒã«æžã¿-å¿ããŠããŸã£ã:)
åã¹ãããã¯å¥ã®ã³ã³ããã§å®è¡ããããããä»ã®ã¹ãããããå®å šã«åé¢ãããŠããããšã«æ³šæããããšãéèŠã§ãã ããŒãžã§ã³ã®ç«¶åã¯ãããããŸããïŒ
ãŸã 䜿çšããŠããªãããèšåãããå¥ã®å¯èœæ§ã¯ã ãããªãã¯ã¹ã¢ã»ã³ããªã®ãµããŒãã§ããããã«ããããã©ãããã©ãŒã ãããŒã¿ããŒã¹ãªã©ã®ããŸããŸãªããŒãžã§ã³ã§ã³ãŒããããã«ãã¹ãã§ããŸãã
æ¡ä»¶ã«ããããªã¬ãŒ
ç¹å®ã®æ¡ä»¶äžã§ã®ã¿ãã«ãã®ã¹ããããå®è¡ããå¿ èŠãããå ŽåããããŸãã ããã©ã«ãã§ã¯ããã¹ãŠã®ã¹ããããé çªã«éå§ãããã¹ãããã®1ã€ãäžæããŠããåŸç¶ã®ã¹ãããã¯éå§ãããŸããã 䜿çšããäž»ãªå¶éã¯æ¬¡ã®ãšããã§ãã
- ãã©ã³ãåïŒãã¹ã¿ãŒããããã¯ã·ã§ã³ïŒ
- ãã«ãã¹ããŒã¿ã¹ïŒæåã倱æïŒ
- Githubã€ãã³ãïŒpull_requestãpushãtagãdeploymentïŒ
ããšãã°ããã«ããæåãããšããšå£ãããšãã«ãSlackã«éç¥ãéä¿¡ããŸãã ãããè¡ãã«ã¯ã when
ã»ã¯ã·ã§ã³ã䜿çšããŠstatus
ãè¿œå ãstatus
ã
slack-notification: image: plugins/slack ... when: status: [ success, failure ] event: [ push, tag, deployment, pull_request ]
å¶éã«ã€ããŠè©³ããã¯ã ãã¡ããã芧ãã ãã ã
èšåãã䟡å€ã®ããå¥ã®èå³æ·±ãæ©èœã¯ãã¡ãã»ãŒãžã«ã³ããããè¿œå ããããšã§ãã«ããå®è¡ããªãæ©èœã§ãïŒ [ci skip]
ã
ãã©ã°ã€ã³
ãã©ã°ã€ã³ã¯ãAmazon S3ãDockerhubãSlackãªã©ã®ãµãŒãããŒãã£ãµãŒãã¹ãšçµ±åããããã®Drone CIã¢ãããŒãã§ãã ãã¹ãŠã®ãã©ã°ã€ã³ã®å®å šãªãªã¹ãã¯ããã«ãããŸã ã åãã©ã°ã€ã³ã¯ãäºåå®çŸ©ãããã¿ã¹ã¯ãå®è¡ããåå¥ã®Dockerã³ã³ãããŒã§ãã äžèšã®äŸã§ã¯ã2ã€ã®ãã©ã°ã€ã³ã䜿çšããŸããã
- Dockerãã©ã°ã€ã³ïŒ
plugins/docker
dockerïŒ-Dockerhubã§Dockerã€ã¡ãŒãžãæ§ç¯ããã³å ¬éããããã - Slackãã©ã°ã€ã³ïŒ
plugins/slack
ïŒ-Slackã«éç¥ãéä¿¡ããŸãã
ãããŸã§ã®ãšããããã©ã°ã€ã³ã¯ãã¹ãŠã§ã¯ãããŸãããã»ãšãã©ã®å žåçãªã¿ã¹ã¯ã解決ããŸãã ãããžã§ã¯ãåºæã®ã¿ã¹ã¯ãéå§ããã«ã¯ããã®ã¿ã¹ã¯ãDockerã€ã¡ãŒãžã§ã©ããããã ãã§æžã¿ãŸããDroneCIã§äœ¿çšãéå§ã§ããŸãã Dockerã§å®è¡ã§ããããã°ã©ãã³ã°èšèªã¯ãã¹ãŠå©çšå¯èœã§ãã Droneã䜿çšããŠãç¹å¥ãªæé ã®ç¶ç¶çãªçµ±åãå床調æŽã§ããŸãã
ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£
ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£Droneã䜿çšãããšããªã¢ãŒããµãŒããŒãšéä¿¡ããããŸããŸãªç®¡çã¿ã¹ã¯ãå®è¡ã§ããŸãã ã€ã³ã¹ããŒã«åŸããªã¢ãŒããµãŒããŒã«æ¥ç¶ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãã¿ãŒããã«ã§2ã€ã®å€æ°ããšã¯ã¹ããŒãããå¿ èŠããããŸãã
-
export DRONE_SERVER=http://MY_DRONE_URL
ãããŒã³ãµãŒããŒã®URLã -
export DRONE_TOKEN=
-ãããŒã³UIã«ãã°ã€ã³ããåŸã«äœæãããå人ããŒã¯ã³ã 次ã®ããŒãžã§èŠã€ããããšãã§ããŸãïŒhttps://MY_DRONE_URL/account
SHOW TOKEN
ãæŒããŠã³ããŒããŸãã
ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ãèšå®ããå¿ èŠããããŸãã
ç§å¯
ãããŒã³ã«ã¯ããã¹ã¯ãŒããsshããŒïŒã€ãŸããç§å¯ïŒãªã©ã®å人æ
å ±ãå®å
šã«æ±ãããã®éåžžã«äŸ¿å©ãªããŒã«ããããŸãã äžèšã®äŸã§ã¯ãDockerãã©ã°ã€ã³ã䜿çšããŠDockerã€ã¡ãŒãžãDockerhubã«å
¬éããŠããŸãããããã«ã¯ãã¹ã¯ãŒããšãŠãŒã¶ãŒåãå¿
èŠã§ãã
Droneã䜿çšããNode.JSã¢ããªã±ãŒã·ã§ã³ã®ç¶ç¶ççµ±åã®äŸãããGithubãªããžããªã§ã¯ã Ansibleã䜿çšããŸãã ããã䜿çšããŠããªã¢ãŒããµãŒããŒã§Dockerã³ã³ãããå®è¡ããŸãã ãªã¢ãŒããµãŒããŒãšéä¿¡ããã«ã¯ãå¥ã®ããŒãå¿
èŠã§ãã ãåç¥ã®ããã«ãGithubãªããžããªã«ç§å¯æ
å ±ãä¿æããããšã¯ãã¢ããªã±ãŒã·ã§ã³ãå±éºã«ãããããã«ããã«ãŒã䜿çšã§ããæªãç¿æ
£ãšèŠãªãããŸãã ãããŒã³CIã¯ãã®åé¡ã解決ããŸãã
å§ããããã«ãDockerhubã®ãã¹ã¯ãŒããšãŠãŒã¶ãŒåãè¿œå ããæ¹æ³ãèããŠã¿ãŸãããïŒ plugins/docker
dockerã§äœ¿çšïŒïŒ
drone global secret add DOCKER_USERNAME andrew drone global secret add DOCKER_PASSWORD password drone global secret add DOCKER_EMAIL email
global
ã䜿çšããŠãç¹å®ã®ãªããžããªã«ã®ã¿ããŸãã¯Drone CIå
ã®ãã¹ãŠã®ãªããžããªã«ã·ãŒã¯ã¬ãããè¿œå ã§ããŸãã ç¹å®ã®ãªããžããªã®ã¿ã«ã·ãŒã¯ã¬ãããè¿œå ããå Žåã¯ããã®ååãæå®ãã global
䜿çšããå¿
èŠã¯ãããŸããïŒ
drone secret add maqpie/drone-starter DOCKER_USERNAME andrew
ç§å¯ãè¿œå ããããšãåçŽãªæ§æ${DOCKER_USERNAME}
ã§.drone.yml
çŽæ¥äœ¿çšã§ããŸãã 以äžã«å°ããªäŸã瀺ããŸãã
publish-api-docker: image: plugins/docker:1.12 username: ${DOCKER_USERNAME} password: ${DOCKER_PASSWORD} email: ${DOCKER_EMAIL}
åã«è¿°ã¹ãããã«ããªã¢ãŒããµãŒããŒãæäœããã«ã¯sshããŒãå¿ èŠã§ãã ããŒã¯æ¬¡ã®ããã«è¿œå ã§ããŸãã
drone global secret add SSH_KEY @/Users/andrew/.ssh/id_rsa-drone-demo
ç§å¯ã®ä¿è·ãšçœ²å
ããªãã®ç§å¯ãå®ãããã«ããããŒã³ã¯.drone.yml
ã·ã³ãã«ãªçœ²åã¡ã«ããºã ã䜿çšããŸãã .drone.yml
ãå€æŽãã.drone.yml
ãå眲åããå¿
èŠããããŸãã ãããŒã³ã¯ãã«ããå®è¡ããåã«æ¯å眲åããã§ãã¯ããŸãã 眲åãäžèŽããªãå Žåãã·ãŒã¯ã¬ããã¯å
¬éããããå©çšã§ããŸããã
眲åã«ã¯ããããŒã³ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ã®ã»ããã¢ããæã«è¿œå ããå人èªèšŒããŒã䜿çšãããŸãã
drone sign maqpie/drone-starter
眲åãããšãã¯ã .drone.yml
ãé
眮ãããŠãããªããžããªã®ååãæå®ããå¿
èŠããããŸãã ãã®ã³ãã³ãã®çµæã .drone.yml.sig
ãã¡ã€ã«ã衚瀺ããããªããžããªã«ã³ããããããŸãã
éèŠïŒãªããžããªã®.drone.yml
ã«çœ²åããåã«ããã®ãªããžããªãDrone UIã«å«ãŸããŠããããšã確èªããŠãã ãã-ãã以å€ã®å Žåã眲åãã¡ã€ã«ã¯äœæãããŸããã
Droneã«ã¯åªããç§å¯ä¿è·ã¡ã«ããºã ããããŸãããããã«ãŒã«ã¯ãŸã ã¢ã¯ã»ã¹ã§ããããã€ãã®ãªãã·ã§ã³ããããŸãã ããšãã°ãããããã®æé ã§bashã¹ã¯ãªããã䜿çšãããšãããã«ãŒã¯curl
ãŸãã¯å¥ã®ããŒã«ã䜿çšããŠãã¹ã¯ãŒããŸãã¯sshããŒã«ã¢ã¯ã»ã¹ã§ããŸãã åžžã«äžè¬çãªå®å
šååãé©çšããŠãã ããã
ãµãŒãã¹
Drone UIã®ãµãŒãã¹ã䜿çšãããšããã«ãããã»ã¹ã®å®è¡äžã«ä»»æã®ã³ã³ãããŒãèµ·åã§ããŸãã ãã¹ãŠã®ãµãŒãã¹ã¯ãããã»ã¹ãã«ãã³ã³ãããšåããµããããäžã«ãããŸãã ãã®æ©èœã¯ãããŸããŸãªã¿ã€ãã®çµ±åãã¹ãã«éåžžã«åœ¹ç«ã¡ãŸãã éåžžããµãŒãã¹ã¯.drone.yml
ã®æåŸã§å®£èšãããŸãã MySQLããŒã¿ããŒã¹ãèµ·åããäŸã¯æ¬¡ã®ãšããã§ãã
services: database: image: mysql environment: - MYSQL_DATABASE=test - MYSQL_ALLOW_EMPTY_PASSWORD=yes
çŸåšã®æ®µéã§ã¯ããµãŒãã¹ã䜿çšããã代ããã«docker-composeã䜿çšããããåçŽãªã¢ãããŒãã䜿çšããŸãã
docker-composeã䜿çšããŠãã¹ããå®è¡ãã
åã®èšäºã§ã docker-composeã«å¯Ÿããæãå
±æããŸãã ã ãããŒã³CIã§ã®ãã¹ãã®å®è¡æ¹æ³ã«ã€ããŠå°ã説æããŸãã .drone.yml
ã®ã¹ãããã¯æ¬¡ã®ããã«ãªããŸãã
run-tests-in-compose: image: michalpodeszwa/docker-compose:latest volumes: - /var/run/docker.sock:/var/run/docker.sock commands: - ./bin/drone-run-tests.sh api-tests - ./bin/drone-run-tests.sh web-tests when: event: [pull_request]
/bin/drone-run-tests.sh
ã¯ã /bin/drone-run-tests.sh
-composeã®å°ããªã©ãããŒã§ãã¹ããå®è¡ããŸãã ç§ãã¡ã®ã¢ãããŒããæãäžããåã«ãç§ãã¡ãè¡ã£ã劥åã«ã€ããŠã話ããããšæããŸãã ãŸãããã®è¡ã®ã³ã³ãããéé¢ããããšãæåŠããŸããã
volumes: - /var/run/docker.sock:/var/run/docker.sock
èŠããã«ããã®è¡ã¯å®éã«ãã®ã³ã³ãããdockerãµãŒãã¹ãå®è¡ã§ããã³ãã³ããå®è¡ã§ããããã«ããŸããããã«ãããdockerãµãŒãã¹ã¯ãŠãŒã¶ãŒroot
ãšããŠå®è¡ãããããããã¹ãã§ä»»æã®ã³ãã³ããå®è¡ã§ããŸãã ãã®èšäºã®ãã¹ãŠã®çµæã«æ
£ããããšãã§ããŸãã ãã®æ¹æ³ã¯ãå
±æãªããžããªã«ã¯æããã«é©ããŠããŸããã
ãªããã®ãããªãªã¹ã¯ãåããã®ã§ããïŒ ããã€ãã®çç±ããããŸãã
- 1ã€ã®ããŒã ãæ±ãã¯ããŒãºããããžã§ã¯ãããããŸãã
- ãããŒã³CIã¯å¥ã®ãµãŒããŒã§å®è¡ãããŠããã誰ããåé¢ã®æ¬ åŠãå©çšããŠãããç ŽãããšããŠããäœã倱ãããšã¯ãããŸããã DNSã¢ããããŒããèæ ®ããŠãæ°ããDrone CIãã¢ããã°ã¬ãŒãããã®ã«5åãããããŸããã
- äž»ãªçç±ã¯ãDockerãã£ãã·ã¥ãå¹ççã«äœ¿çšãããã£ãããã§ãã æ¯æ¥çŽ20ã100件ã®ãªããžããªãžã®ã³ããããè¡ããããããããã¹ããå®è¡ããŸãã Dockerãã£ãã·ã¥ã䜿çšããŠããªãã£ãå Žåãã³ã³ããã¯ã³ããããããã³ã«åæ§ç¯ãããŸãããããã«ã¯å€ãã®æéãããããŸãã
ãã®ã¢ãããŒãã®æ¬ ç¹ã«ã€ããŠç解ã§ããã®ã§ãã¢ãããŒãèªäœãåæããŸãããã åºæ¬çã«ããã¹ããå®è¡ããã«ã¯ãåã«docker-compose up --file docker-compose.drone-tests.yml
ãŸãã åæ§ã«ããã¹ãã¯äœæ¥ç°å¢ã§å®è¡ãããŸãã docker-composeãä»ããŠãã¹ããå®è¡ãããšãã«å®è¡ããå¯äžã®åé¡ã¯ãdocker-composeã®çµäºã³ãŒããåžžã«0ã§ãã£ãããšã§ããã¹ãããã ãã®ç¶æ³ãä¿®æ£ããããã«ããã¹ãã®å®è¡åŸã«ã³ã³ããã®çµäºã³ãŒããåæããå°ããªã¹ã¯ãªãããäœæããå°ãªããšã1ã€ã®ã³ã³ããããŒã以å€ã®ã³ãŒãã§çµäºããå Žåããã®ã³ãŒãã䜿çšããŠçµäºããŸãã äžèšã®ãã¹ãå®è¡ã¹ãããã§èŠã/bin/drone-run-tests.sh
ã¹ã¯ãªããã®å
容ã¯æ¬¡ã®ããã«ãªããŸãã
#!/bin/sh # remove old containers docker-compose --file docker-compose.drone-tests.yml rm -f # run tests docker-compose --file docker-compose.drone-tests.yml up --build echo "Inspecting exited containers:" docker-compose --file docker-compose.drone-tests.yml ps docker-compose --file docker-compose.drone-tests.yml ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | while read code; do if [ "$code" != "0" ]; then exit $code fi done
ãªã³ã¯ãšãã³ã
ä»ã®ããŒã«ãšåæ§ã«ããããŒã³CIã«ã¯éçºäžã®ãã®ãããã€ããããåžžã«åžæã©ããã«åäœãããšã¯éããŸããã 幞ããªããšã«ãããã€ããããããŸããã§ããã
- ãã«ãããã»ã¹ã§è¡šç€ºãããæ
å ±ãå€ããããšããããŒã³UIãããªãŒãºããŸãã Node.JSã®ãã¹ãŠã®Dockerãã¡ã€ã«ã§ã¯ã
npm install
å®è¡npm install
ãšãã«--quiet
ãè¿œå ããå¿ èŠããããŸãã-ç¡é§ãªæ å ±ãåºåãããŠããŸããã npmã§ãã®ãªãã·ã§ã³ãããã©ã«ãã§äœ¿çšãããªãçç±ã¯ããããããŸããã - Drone 0.4ãš0.5ã®2ã€ã®ããŒãžã§ã³ããããŸãã åŸè ã¯çŸåšæŽ»çºã«éçºãããŠããŸãããååã«å®å®ããŠããŸãïŒ2ãæã§åé¡ã¯ãããŸããã§ããïŒã ããŸããŸãªåçãæ€çŽ¢ãããšãã«ãé¢é£æ§ããªããªã£ãå€ãåçãèŠã€ããããšããããããŸããã
- ããŒãžã§ã³0.5ã®ããã¥ã¡ã³ãã¯ã次ã®ã¢ãã¬ã¹ã«ãããŸãïŒ http : //readme.drone.io/0.5/ ã ããã¥ã¡ã³ããŒã·ã§ã³ã¯ãããããçŸæç¹ã§ãããŒã³ã®æã匱ãåŽé¢ã§ãã ç§ããã¯ãWebpackããã¥ã¡ã³ãã®æåã®ããŒãžã§ã³ ïŒä»¥äžã®ã³ã¡ã³ããèªãã§ãã ããïŒãæé«ã§ã¯ãªãã£ããšèšããŸãããããã¯ã»ãšãã©ã®Webãããžã§ã¯ãã®æšæºã«ãªãããšã劚ããŸããã§ããã
ãããŒã³ãè©Šãããã«èª¬åŸã§ããå Žåã以äžã«åœ¹ç«ã€ãªã³ã¯ã®ãªã¹ãããããŸãã
- ãããŒã³GitHub
- ãããŒã³ãã©ã°ã€ã³github
- Drone 0.5ããã¥ã¡ã³ã
- ãããŒã³ã®ã®ã¿ãŒ
- Drone 0.4ããã¥ã¡ã³ã -ãã®ããã¥ã¡ã³ãã®äžéšã¯ããŸã ããŒãžã§ã³0.5ã«å®å šã«ç§»æ€ãããŠããŸããã
ãããã«
ãããŒã³CIã¯ãç¶ç¶çãªçµ±åã®åé¡ã«å¯Ÿããææ°ã®ãœãªã¥ãŒã·ã§ã³ã§ãã Droneã䜿çšãããšããµãŒããŒãäºåºŠãšèšå®ããããšãªãããã«ããèµ·åããããã®å®å šã«éé¢ãããç°å¢ãååŸããCIãµãŒããŒãç¡éã«æ¡åŒµã§ããŸãã 2ãæéãç§ãã¡ã¯åœŒãšå®å šã«æã«èœã¡ãŸããã
Drone CIã®äœ¿çšãéå§ã§ããããã«ã2ã€ã®GithubãªããžããªãçšæããŸããã
- Droneã®ããã〠-æ¬çªããã³æ¬çªç°å¢åãã®Drone CIã®ã€ã³ã¹ããŒã«ãç°¡çŽ åããŸãã
- Drone Starter â Drone CI, Ansible, Docker Node.js .
, 51%, 49% â Github :)
, !