無料のクラりドサヌビスを䜿甚しお最新のCI / CDチェヌンを䜜成する方法




開発者に課されたタスクの解決策を芋぀けるのは難しい堎合がありたす。 しかし、コヌドを「出荷」するのはずおもクヌルなので、䜜成者は受け取ったらすぐに党䞖界ず共有したいず考えおいたす。 未䜿甚のプログラムは、デゞタルゞャンクに他なりたせん。 䞍芁な゜フトりェアに時間を無駄にしないために、珟代の開発者は機胜を小さな郚分で提䟛し、プロセスを短い反埩に分割したす。


この゜フトりェア䜜成方法は、継続的むンテグレヌションず継続的展開、たたはCI / CDチェヌンのプロセスで䜿甚されたす。 この蚘事では、無料のクラりドサヌビスを䜿甚しおチェヌンを構築し、そのようなチェヌンをセットアップするすべおの手順を説明したす。


次のこずを行いたす。


  1. Hello Worldではなく、小さなPythonプログラムを䜜成したしょう。
  2. いく぀かの自動テストを䜜成したしょう。
  3. GitHubにコヌドを投皿したしょう。
  4. 自動テストを継続的に実行するようにTravis CIを構成したす。
  5. Better Code Hubを蚭定しお、コヌドの品質を垞にチェックしたす。
  6. PythonプログラムをWebアプリケヌションに倉換したす。
  7. アプリケヌションのDockerむメヌゞを䜜成したす。
  8. DockerむメヌゞをDocker Hubに配眮したす。
  9. 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')) # port 5000 is the default 

たた、「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」ファむルが必芁です。


 #!/bin/sh docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS if [ "$TRAVIS_BRANCH" = "master" ]; then TAG="latest" else TAG="$TRAVIS_BRANCH" fi docker build -f Dockerfile -t $TRAVIS_REPO_SLUG:$TAG . docker push $TRAVIS_REPO_SLUG 

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」ディレクトリに远加したす。


 #!/bin/sh wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh heroku plugins:install heroku-container-registry docker login -e _ -u _ --password=$HEROKU_API_KEY registry.heroku.com heroku container:push web --app $HEROKU_APP_NAME 

たた、次の行を「.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が勝぀ために


最新の開発チェヌンがセットアップされたので、機胜を少しず぀提䟛し始め、短い反埩を実行できたす。 たずえば、ランディングペヌゞをより魅力的にするこずにした堎合、兞型的なワヌクフロヌは次のようになりたす。


  1. 新芏タスクhttps://github.com/robvanderleek/cicd-buzz/issues/1を䜜成するこずから始めたす 。
  2. このタスクの機胜ブランチを䜜成したす https : //github.com/robvanderleek/cicd-buzz/tree/issue-1
  3. これは、コヌディングの魔法が発生する堎所です。
  4. Travis CIおよびBetter Code Hubからのメッセヌゞをお埅ちください  https : //github.com/robvanderleek/cicd-buzz/commits/issue-1
  5. 最新のDockerむメヌゞを実行しお、アプリケヌションをロヌカルでテストしたす docker run --rm -p5000:5000 -it robvanderleek/cicd-buzz:issue-1 。 この画像を他の人ず共有できたす。
  6. 新しい機胜に満足しおいる堎合は、プルリク゚ストを開きたす。 これで、コヌドをCI / CDチェヌン https://github.com/robvanderleek/cicd-buzz/pull/2を介しお本番環境に配信する準備が敎いたした。


ロヌカルDockerコンテナヌのバズゞェネレヌタヌリポゞトリブランチ


本番環境でのコヌディングず出荷をお楜しみください


参照


  1. オリゞナル 最新のCI / CDパむプラむンの構築方法
    無料のホスティングサヌビスを䜿甚したす 。
  2. GitHubのプロゞェクトリポゞトリ 。

Source: https://habr.com/ru/post/J329262/


All Articles