

éçºè
ã«èª²ãããã¿ã¹ã¯ã®è§£æ±ºçãèŠã€ããã®ã¯é£ããå ŽåããããŸãã ããããã³ãŒãããåºè·ãããã®ã¯ãšãŠãã¯ãŒã«ãªã®ã§ãäœæè
ã¯åãåã£ããããã«å
šäžçãšå
±æããããšèããŠããŸãã æªäœ¿çšã®ããã°ã©ã ã¯ãããžã¿ã«ãžã£ã³ã¯ã«ä»ãªããŸããã äžèŠãªãœãããŠã§ã¢ã«æéãç¡é§ã«ããªãããã«ãçŸä»£ã®éçºè
ã¯æ©èœãå°ããªéšåã§æäŸããããã»ã¹ãçãå埩ã«åå²ããŸãã
ãã®ãœãããŠã§ã¢äœææ¹æ³ã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãšç¶ç¶çå±éããŸãã¯CI / CDãã§ãŒã³ã®ããã»ã¹ã§äœ¿çšãããŸãã ãã®èšäºã§ã¯ãç¡æã®ã¯ã©ãŠããµãŒãã¹ã䜿çšããŠãã§ãŒã³ãæ§ç¯ãããã®ãããªãã§ãŒã³ãã»ããã¢ãããããã¹ãŠã®æé ã説æããŸãã
次ã®ããšãè¡ããŸãã
- Hello Worldã§ã¯ãªããå°ããªPythonããã°ã©ã ãäœæããŸãããã
- ããã€ãã®èªåãã¹ããäœæããŸãããã
- GitHubã«ã³ãŒããæçš¿ããŸãããã
- èªåãã¹ããç¶ç¶çã«å®è¡ããããã«Travis CIãæ§æããŸãã
- Better Code Hubãèšå®ããŠãã³ãŒãã®å質ãåžžã«ãã§ãã¯ããŸãã
- Pythonããã°ã©ã ãWebã¢ããªã±ãŒã·ã§ã³ã«å€æããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®Dockerã€ã¡ãŒãžãäœæããŸãã
- Dockerã€ã¡ãŒãžãDocker Hubã«é
眮ããŸãã
- Herokuã§Dockerã€ã¡ãŒãžãå±éããŸãã
ãã®èšäºã§ã¯ãææ°ã®ãœãããŠã§ã¢éçºãã§ãŒã³ã®åºæ¬çãªã³ã³ããŒãã³ããšããããã®ã³ã³ããŒãã³ããåäžã®å
šäœã«çµåããæ¹æ³ãèªè
ã«ç€ºãããšãç®æããŠããŸãã ããã¹ãã¯ãããã°ã©ãã³ã°èšèªãéçºæ¹æ³è«ã§ã¯åŒ·èª¿ãããŠããŸããã äžéšã®ã³ã³ããŒãã³ãã¯ãããã»ã¹ã¹ã¿ãã¯ã§äœ¿çšãããŠããã³ã³ããŒãã³ããšäžèŽããªãå ŽåããããŸãã ãã ãããã®å Žåã§ããææ¡ãããŠãããã¹ãŠã®æé ãå®è¡ããããšããå§ãããŸãã ãã§ãŒã³ãæåããæåŸãŸã§å
±éã«çè§£ããŠããã°ãèªåã§èª¿æŽããã®ãã¯ããã«ç°¡åã«ãªããŸãã
èªè
ã«å®å
šã«æ£çŽã«ãªãããã«ãç§ã¯Better Code Hubã®éçºè
ã®äžäººã§ããããšãå ±åããªããã°ãªããŸããã
ã¹ãããçªå·1ïŒãã¬ã³ãã£ãªãã¬ãŒãºãžã§ãã¬ãŒã¿ãŒãäœæãã
ãã®ãããã©ãããããããã¯ã©ãŠããŸã§ããã§ãŒã³ã®ãã¹ãŠã®æ®µéãå®è¡ããå°ããªããã°ã©ã ãå¿
èŠã§ãã ãã®ç®çã®ããã«ããã¡ãã·ã§ããã«ãªCI / CDãã¬ãŒãºã®ãžã§ãã¬ãŒã¿ãŒãPythonã§äœæããŸãã
æ°ãããã£ã¬ã¯ããªãcicd-buzzããäœæãããã®äžã«ãbuzzããšåŒã°ããå¥ã®ãã£ã¬ã¯ããªãäœæãããã®äžã«ä»¥äžã®ã³ãŒããå«ããgenerator.pyããã¡ã€ã«ãäœæããŸãã
import random buzz = ('continuous testing', 'continuous integration', 'continuous deployment', 'continuous improvement', 'devops') adjectives = ('complete', 'modern', 'self-service', 'integrated', 'end-to-end') adverbs = ('remarkably', 'enormously', 'substantially', 'significantly', 'seriously') verbs = ('accelerates', 'improves', 'enhances', 'revamps', 'boosts') def sample(l, n = 1): result = random.sample(l, n) if n == 1: return result[0] return result def generate_buzz(): buzz_terms = sample(buzz, 2) phrase = ' '.join([sample(adjectives), buzz_terms[0], sample(adverbs), sample(verbs), buzz_terms[1]]) return phrase.title() if __name__ == "__main__": print generate_buzz()
ãŸãããã®ãã£ã¬ã¯ããªã«ç©ºã®ã init .pyããã¡ã€ã«ãäœæããŸãã ããã§ããããžã§ã¯ãæ§é ã¯æ¬¡ã®ããã«ãªããŸãã
cicd-buzz/ buzz/ __init__.py generator.py
ãbuzzããã£ã¬ã¯ããªã«ç§»åããŠãã¹ã¯ãªãããå®è¡ããŸãã
[cicd-buzz/buzz] $ python generator.py End-To-End Devops Enormously Boosts Continuous Testing
æ°å詊ããŠã¿ãŠãã ãã-楜ããã§ãïŒ
[cicd-buzz/buzz] $ python generator.py Complete Continuous Improvement Enormously Improves Devops [cicd-buzz/buzz] $ python generator.py Modern Devops Remarkably Improves Continuous Testing
ã¹ãããçªå·2ïŒèªåãã¹ããäœæãã
ç¶ç¶çããªããªãŒãã§ãŒã³ãå¿
èŠãªã®ã¯ãå®è¡ãäžååãªãœãããŠã§ã¢ã®ç¶ç¶çãªåºè·ãåé¿ããã®ã«åœ¹ç«ã€å€ãã®èªåãã¹ããèšè¿°ãããŠããå Žåã®ã¿ã§ãã åäœãã¹ããé
眮ããã«ã¯ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ãtestsããã©ã«ããŒãäœæããŸãã 以äžã®ã³ãŒãããã¡ã€ã«ãtest_generator.pyãã«ä¿åããŸãã
import unittest from buzz import generator def test_sample_single_word(): l = ('foo', 'bar', 'foobar') word = generator.sample(l) assert word in l def test_sample_multiple_words(): l = ('foo', 'bar', 'foobar') words = generator.sample(l, 2) assert len(words) == 2 assert words[0] in l assert words[1] in l assert words[0] is not words[1] def test_generate_buzz_of_at_least_five_words(): phrase = generator.generate_buzz() assert len(phrase.split()) >= 5
ãpytestããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãã¹ããå®è¡ããŸãã ãããã€ã³ã¹ããŒã«ããã«ã¯ãPythonä»®æ³ç°å¢ïŒ 'virtualenv'ïŒãå¿
èŠã§ãã å¿é
ããå¿
èŠã¯ãããŸãããèšããããç°¡åã«ããŸãã ãŸã, virtualenv
ã æ¬¡ã«ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã§æ¬¡ã®ã³ãã³ããå®è¡ããŸãã
[cicd-buzz] $ virtualenv venv
ãã®çµæãæ°ãããã£ã¬ã¯ããªãvenvããäœæãããŸãã ãã®ç°å¢ã®äœ¿çšãéå§ããã«ã¯ã次ãå®è¡ããŸãã
[cicd-buzz] $ source venv/bin/activate (venv) [cicd-buzz] $
次ã«ããrequirements.txtããšãããã¡ã€ã«ãäœæããpytestãžã®äŸåé¢ä¿ãããã«èšè¿°ããŸãã
pytest==3.0.6
requirements.txtã«ãªã¹ããããŠããèŠä»¶ãããŒãããã«ã¯ããpipãã³ãã³ããå®è¡ããŸãïŒ
(venv) [cicd-buzz] $ pip install -r requirements.txt
ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã¯æ¬¡ã®ããã«ãªããŸãã
cicd-buzz/ buzz/ requirements.txt tests/ venv/
ããã§ãä»®æ³ç°å¢ã䜿çšããŠããtest_generator.pyããããã¹ããå®è¡ã§ããŸãã
(venv) [cicd-buzz] $ python -m pytest -v tests/test_generator.py
ã³ãã³ãããã®åºåã¯æ¬¡ã®ããã«ãªããŸãã
========== test session starts ========== platform darwin -- Python 2.7.10, pytest-3.0.6, py-1.4.32, pluggy-0.4.0 -- /Users/rob/projects/workspace/cicd-buzz/venv/bin/python cachedir: .cache rootdir: /Users/rob/projects/workspace/cicd-buzz, inifile: collected 3 items tests/test_generator.py::test_sample_single_word PASSED tests/test_generator.py::test_sample_multiple_words PASSED tests/test_generator.py::test_generate_buzz_of_at_least_five_words PASSED ========== 3 passed in 0.02 seconds ==========
ã¹ãããçªå·3ïŒGitHubã«ã³ãŒããæçš¿ãã
GitHubã«ãã°ã€ã³ãïŒãŸã ã¢ã«ãŠã³ãããæã¡ã§ãªãå Žåã¯ãµã€ã³ã¢ããããŠïŒãæ°ãããããªãã¯ãªããžããªãcicd-buzzããäœæããŸãã
ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã§ã1è¡ãå«ããã¡ã€ã«ã.gitignoreããäœæããŸãã
venv
ããã¯ãgitãvirtualenvããªããžããªã«è¿œå ããªãããã«ããããã§ãã æ¬¡ã«ãGitãããŒã«ã«ã§åæåããã³ãŒããGitHubã«éä¿¡ããŸãã
[cicd-buzz] $ git init [cicd-buzz] $ git add * [cicd-buzz] $ git commit -m "Initial commit" [cicd-buzz] $ git remote add origin git@github.com:<YOUR_GITHUB_USERNAME>/cicd-buzz.git [cicd-buzz] $ git push -u origin master
ã¹ãããçªå·4ïŒåã³ãããåŸã«ãã¹ããå®è¡ããã«ã¯ãTravis CIãæ¥ç¶ããŸã
Travis CIã¯ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ã¯ã©ãŠããµãŒãã¹ã§ãã GitHubã®å
¬éãªããžããªã®å Žåãç¡æã§ãã Travis CIã®ã¢ã«ãŠã³ããååŸããã«ã¯ã httpsïŒ//travis-ci.orgã«ã¢ã¯ã»ã¹ããGitHubè³æ Œæ
å ±ã䜿çšããŠãã°ã€ã³ããŸãã
Travis CIã®ãªããžããªã®ããã·ã¥ããã³ãã«ãªã¯ãšã¹ãããšã«ã¢ã»ã³ããªãæå¹ã«ããã®ã¯éåžžã«ç°¡åã§ãã ãããè¡ãã«ã¯ãcicd-buzzãªããžããªã®å察åŽã«ããã¹ã€ãããç§»åããŸãïŒãªããžããªããªã¹ãã«ãªãå Žåã¯ã[ã¢ã«ãŠã³ããåæ]ãã¯ãªãã¯ããŸãïŒã

Travis CIãã¢ã¯ãã£ãåããæåŸã®æé ã¯ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ã.travis.ymlããã¡ã€ã«ã远å ããããšã§ãã ããºãžã§ãã¬ãŒã¿ãŒã«ã¯ã次ã®ãã®ãå«ãŸããŠããå¿
èŠããããŸãã
language: python script: - python -m pytest -v
ãã®ãã¡ã€ã«ãGitã«è¿œå ãã倿Žãã³ãããããŠGithubã«éä¿¡ããŸãã
[cicd-buzz] $ git add .travis.yml [cicd-buzz] $ git commit -m "Add Travis CI configuration" [cicd-buzz] $ git push
Travis CIããŒã«ããŒã«ç§»åããŸãã ããã«ãTravisã¯ã³ãŒãã®å€æŽãéç¥ããã³ãŒãã®æ§ç¯/ãã¹ããéå§ããŸãã åºåãã°ã§ã¯ãåäœãã¹ãã®çµæã確èªã§ããŸãã

ã¹ããã5ïŒããè¯ãã³ãŒãããããã§ãŒã³ã«è¿œå ãã
èªååããããã¹ãã䜿çšããŠã³ãŒãã®ããã©ãŒãã³ã¹ãçµ¶ãããã§ãã¯ãããååã«æ©èœããã¡ã«ããºã ãã§ããã®ã§ãæ©èœã«éäžããã³ãŒãã®å質ãå¿ããããšæããŸãã Better Code Hubã¯ããµããŒããããŠããææ°ã®ã³ãŒããäœæããããã®10ã®æšå¥šäºé
ã«åŸã£ãŠã³ãŒãã®å質ããã§ãã¯ããã¯ã©ãŠããµãŒãã¹ã§ãã Better Code Hubã¯ãéçºçµæïŒæåéãGitHubãããã·ã¥ãããã³ã«ïŒãåžžã«ç£èŠããã³ãŒãã®å質ãå±éºã«ãããããŠããç¶æ³ã«ã€ããŠå ±åããŸãã
Travis CIã®ãããªããè¯ãã³ãŒãããã¯ãGitHubãšã·ãŒã ã¬ã¹ã«çµ±åããŸãã ãªããžããªã«æ·»ä»ããã«ã¯ã httpsïŒ//bettercodehub.comã«ã¢ã¯ã»ã¹ã ããç¡æããšããã©ãã«ã®ä»ãããã°ã€ã³ãã¿ã³ãéžæããŸãã
GitHubã®è³æ Œæ
å ±ã§ãã°ã€ã³ãããšãGitHubãªããžããªã®ãªã¹ããéããŸãã ãcicd-buzzããèŠã€ããŠããåçããã¿ã³ãã¯ãªãã¯ããŸãã Better Code Hubã¯ãæšæºèšå®ã§åæãå®è¡ãããã©ãããå°ããŸãã [Go]ãæŒããŠæ°ç§éåŸ
ã¡ãŸãããã®åŸãç»é¢ã«ã¬ããŒãã衚瀺ãããŸãã

Better Code Hubã«é¢ããã¬ããŒãã®ããã
ããã·ã¥ããã³ãã«ãªã¯ãšã¹ãïŒTravis CIãªã©ïŒããšã«Better Code Hubã§åæããå Žåã¯ãæ¯è»ã¢ã€ã³ã³ãã¯ãªãã¯ããŠã¹ã€ãããç§»åããŸãã

ã¹ããã6ïŒããºãžã§ãã¬ãŒã¿ãŒãã·ã³ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ã«å€ãã
ãããïŒ ããã§ãã³ãŒãã®ããã©ãŒãã³ã¹ãšå質ããã§ãã¯ããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ãã§ãŒã³ãã§ããŸããã æ¬¡ã«ããã¹ãããã³ãŒãã®ç¶ç¶çãªå±éãæ§æããå¿
èŠããããŸãã
Webã¢ããªã±ãŒã·ã§ã³ãHerokuã«ãããã€ããŠãHTTPãªã¯ãšã¹ããåãå
¥ããHTMLãåºåããããã«ããºãžã§ãã¬ãŒã¿ãŒã«æãããããPython Flaskã©ãããŒãäœæããŸãã ãã¡ã€ã«ãapp.pyãããæ¬¡ã®ã³ãŒããå«ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«è¿œå ããŸãã
import os import signal from flask import Flask from buzz import generator app = Flask(__name__) signal.signal(signal.SIGINT, lambda s, f: os._exit(0)) @app.route("/") def generate_buzz(): page = '<html><body><h1>' page += generator.generate_buzz() page += '</h1></body></html>' return page if __name__ == "__main__": app.run(host='0.0.0.0', port=os.getenv('PORT'))
ãŸãããrequirements.txtãã«å¥ã®è¡ã远å ããŸãã
pytest==3.0.6 Flask==0.12
ãããŠãæ°ããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã
(venv) [cicd-buzz] $ pip install -r requirements.txt
ããã§ã次ã®ã³ãã³ãã䜿çšããŠWebã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããŸãã
[cicd-buzz] $ python app.py * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
ãã©ãŠã¶ãªã³ã¯httpïŒ// localhostïŒ5000ãéããäœæ¥ã®çµæã楜ãã¿ãŸãã æ¥œããæéãéããã«ã¯ãããŒãžãæ°åæŽæ°ããŠãã ããã

æåŸã«ãã³ãããã远å ãã倿ŽãGitHubã«ãã¹ãããããšãå¿ããªãã§ãã ããã
[cicd-buzz] $ git add app.py [cicd-buzz] $ git add requirements.txt [cicd-buzz] $ git commmit -m "Step 5" [cicd-buzz] $ git push
ããã§ãTravis CIãšBetter Code Hubããããã®å€æŽããã£ããããŠã³ãŒãã確èªããã®ã楜ããããšãã§ããŸãã
ã¹ããã7ïŒããã«ãŒã䜿çšããŠã¢ããªãã³ã³ããåãã
Dockerã¯ãã¢ããªã±ãŒã·ã§ã³ããç°¡åã«ãããã€å¯èœãªã³ã³ãããŒãäœæããã®ã«åœ¹ç«ã¡ãŸãã åçŽãªPythonããã³Flaskããã°ã©ã ã®å Žåãããã¯åé·ã«æãããããããŸããããã³ã³ãããŒã®åœ¢ã§ã³ãŒãããããã€ãããšããããžã§ã¯ãã®æé·ãšãšãã«æããã«ãªãå€ãã®å©ç¹ããããŸãã
æ¢ã«Dockerãã€ã³ã¹ããŒã«ãããŠããå Žåã¯ã次ã®å
容ã®ãDockerfileãããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«è¿œå ããŸãã
FROM alpine:3.5 RUN apk add --update python py-pip COPY requirements.txt /src/requirements.txt RUN pip install -r /src/requirements.txt COPY app.py /src COPY buzz /src/buzz CMD python /src/app.py
ãããã®æç€ºã«åŸã£ãŠãdockerã¯åºæ¬çãªé«å±±ã€ã¡ãŒãžãååŸããPythonãšpipãã€ã³ã¹ããŒã«ããWebã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŸãã æåŸã®è¡ã¯ãã³ã³ããã®èµ·åæã«Webã¢ããªã±ãŒã·ã§ã³ãèµ·åããããã«dockerã«æç€ºããŸãã
ããã§ãDockerã€ã¡ãŒãžãåé¡ãªããã«ãããã³å®è¡ãããŸãã
[cicd-buzz] $ docker build -t cicd-buzz . [cicd-buzz] $ docker run -p 5000:5000 --rm -it cicd-buzz
çµæãè³è³ããïŒ

Dockerã³ã³ããã§å®è¡ãããCI / CDããºãžã§ãã¬ãŒã¿ãŒ
ç¹°ãè¿ããŸããã倿Žãã³ãããããŠGitHubã«éä¿¡ããŠãã ããã
[cicd-buzz] $ git add Dockerfile [cicd-buzz] $ git commmit -m "Step 6" [cicd-buzz] $ git push
ã¹ãããïŒ8ïŒDocker Hubã«å
¬éãã
Docker Hubãªã©ã®Dockerã€ã¡ãŒãžã®ã¬ãžã¹ããªã«å
¬éãããšãã³ã³ãããŒãããŸããŸãªç°å¢ã«ç°¡åã«å±éãã以åã®ããŒãžã§ã³ã«ããŒã«ããã¯ã§ããŸãã ãã®æé ãå®äºããã«ã¯ã httpsïŒ //docker.comã®ã¢ã«ãŠã³ããšããããžã§ã¯ãã®ã«ãŒãã«ããæ°ãããã£ã¬ã¯ããªã.travisãã®ãdeploy_dockerhub.shããã¡ã€ã«ãå¿
èŠã§ãã
Travis CIã¯åã¹ã¯ãªããã®æåŸã«ãã®ã¹ã¯ãªãããå®è¡ããDockerã€ã¡ãŒãžãäœæããŸãã 3ã€ã®ç°å¢å€æ°ã«æ³šæããŠãã ããã ãããã¯ãTravis CIã®ãcicd-buzzããªããžããªã®ãèšå®ãã¿ãã§å®çŸ©ã§ããŸãã

Travis CIã®Dockerã®ç°å¢å€æ°
Travis CIãGitHubãªããžããªãŒã«ã³ããããããã³ã«Docker Hubã«ã€ã¡ãŒãžãå
¬éããã«ã¯ã次ã®ããã«ã.travis.ymlãã倿ŽããŸãã
sudo: required services: - docker language: python script: - python -m pytest -v after_success: - sh .travis/deploy_dockerhub.sh
ã³ããããäœæãããããã®å€æŽãGitHubã«éä¿¡ããåŸïŒããã³Travis CIãäœæ¥ãçµäºããã®ãåŸ
ã£ãŠïŒãDocker HubããçŽæ¥ããºãžã§ãã¬ãŒã¿ãŒã§ã³ã³ãããŒãèµ·åã§ããŸãã
[cicd-buzz] $ docker run -p5000:5000 --rm -it <YOUR_DOCKER_USERNAME>/cicd-buzz:latest
ã¹ãããïŒ9ïŒHerokuã«ãããã€ãã
Herokuã¯ãå°èŠæš¡ã§ã¹ã±ãŒã©ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ããã¹ãããããã®ã¯ã©ãŠãããŒã¹ã®ãã©ãããã©ãŒã ã§ãã ãã®ãµãŒãã¹ã§ã¯ç¡æã®æéãã©ã³ãæäŸããŠããããã httpsïŒ//signup.heroku.comã®ãªã³ã¯ããã©ã£ãŠããŸã ç»é²ããŠããªãå Žåã¯ç»é²ããŠãã ããã
Heroku Toolbeltã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ãããããžã§ã¯ãã«ãŒããã£ã¬ã¯ããªã§æ¬¡ã®ã³ãã³ããå®è¡ããŸãã
[cicd-buzz] $ heroku login [cicd-buzz] $ heroku create Creating app⊠done, ⬢ fathomless-inlet-53225 https://fathomless-inlet-53225.herokuapp.com/ | https://git.heroku.com/fathomless-inlet-53225.git [cicd-buzz] $ heroku plugins:install heroku-container-registry [cicd-buzz] $ heroku container:login [cicd-buzz] $ heroku container:push web [cicd-buzz] $ heroku ps:scale web=1
ãã®åŸã heroku create
ã³ãã³ãã§è¡šç€ºãããURLã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããã¯ãã§ãã

HerokuãæèŒããCI / CDããŒã¯ãžã§ãã¬ãŒã¿ãŒ
heroku container:push web
ã³ãã³ãã¯ãDocker Hubã§å
¬éããåãã³ã³ãããHerokuã«é
眮ããããšã«æ³šæããŠãã ããã
ãããžã§ã¯ãã®ãã¹ã¿ãŒãã©ã³ãã®åã¢ã»ã³ããªã®å±éããã»ã¹ãèªååããã«ã¯ããdeploy_heroku.shããã¡ã€ã«ãã.travisããã£ã¬ã¯ããªã«è¿œå ããŸãã
ãŸããæ¬¡ã®è¡ãã.travis.ymlããã¡ã€ã«ã«è¿œå ããŸãã
after_success: â sh .travis/deploy_dockerhub.sh â test â$TRAVIS_BRANCHâ = âmasterâ && sh .travis/deploy_heroku.sh
æåŸã«ãããã«2ã€ã®ç°å¢å€æ°ãTravis CIã«è¿œå ããŸãã Heroku APIã¯ãã¢ã«ãŠã³ãèšå®ãã«ããã herokuã¢ããªåã¯heroku create
ã³ãã³ãã®åºåã«ããheroku create
ã

倿Žãã³ãããããŠGitHubã«éä¿¡ããŸãã ãã«ãã«æåãããšãæ°ããDockerã€ã¡ãŒãžã¯ããã«Docker HubãšHerokuã«ç§»åããã¯ãã§ãã
ã¹ãããçªå·10ïŒCI / CDãåã€ããã«ïŒ
ææ°ã®éçºãã§ãŒã³ãã»ããã¢ãããããã®ã§ãæ©èœãå°ããã€æäŸãå§ããçãå埩ãå®è¡ã§ããŸãã ããšãã°ãã©ã³ãã£ã³ã°ããŒãžãããé
åçã«ããããšã«ããå Žåãå
žåçãªã¯ãŒã¯ãããŒã¯æ¬¡ã®ããã«ãªããŸãã
- æ°èŠã¿ã¹ã¯https://github.com/robvanderleek/cicd-buzz/issues/1ãäœæããããšããå§ããŸã ã
- ãã®ã¿ã¹ã¯ã®æ©èœãã©ã³ããäœæããŸãïŒ https : //github.com/robvanderleek/cicd-buzz/tree/issue-1
- ããã¯ãã³ãŒãã£ã³ã°ã®éæ³ãçºçããå Žæã§ãã
- Travis CIããã³Better Code Hubããã®ã¡ãã»ãŒãžããåŸ
ã¡ãã ãã ïŒ https : //github.com/robvanderleek/cicd-buzz/commits/issue-1
- ææ°ã®Dockerã€ã¡ãŒãžãå®è¡ããŠãã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ã§ãã¹ãããŸãïŒ
docker run --rm -p5000:5000 -it robvanderleek/cicd-buzz:issue-1
ã ãã®ç»åãä»ã®äººãšå
±æã§ããŸãã - æ°ããæ©èœã«æºè¶³ããŠããå Žåã¯ããã«ãªã¯ãšã¹ããéããŸãã ããã§ãã³ãŒããCI / CDãã§ãŒã³ïŒ https://github.com/robvanderleek/cicd-buzz/pull/2ïŒãä»ããŠæ¬çªç°å¢ã«é
ä¿¡ããæºåãæŽããŸããã

ããŒã«ã«Dockerã³ã³ãããŒã®ããºãžã§ãã¬ãŒã¿ãŒãªããžããªãã©ã³ã
æ¬çªç°å¢ã§ã®ã³ãŒãã£ã³ã°ãšåºè·ããæ¥œãã¿ãã ããïŒ
åç
§ïŒ
- ãªãªãžãã«ïŒ ææ°ã®CI / CDãã€ãã©ã€ã³ã®æ§ç¯æ¹æ³
ç¡æã®ãã¹ãã£ã³ã°ãµãŒãã¹ã䜿çšããŸã ã - GitHubã®ãããžã§ã¯ããªããžã㪠ã