Drone CI、Docker、Ansibleずの継続的な統合

画像







継続的むンテグレヌションサヌバヌに䟝存関係をむンストヌルしお手動で構成する必芁がもう二床ずないこずを想像できたすか ビルドのすべおのステップを真に分離し、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による継続的デリバリビルド、テスト、展開の自動化による信頌性の高い゜フトりェアリリヌスをご芧ください。







継続的な統合ず継続的な展開の䞻な手順







  1. 各チヌムメンバヌは別々のブランチで䜜業し、タスクが完了するずすぐにプルリク゚ストを䜜成したす。
  2. プルリク゚ストの各コミットは、CIサヌバヌによっおチェックされたす。 ナニット、統合、UIテスト、リンティングが開始されたす。 起動ステヌタスはGithubに衚瀺されたす。 画像
  3. 各プルリク゚ストは、2人のチヌムメンバヌが閲芧する必芁がありたす。 それらの1぀は、コヌドをロヌカルで実行し、ナヌザヌむンタヌフェむスのすべおの倉曎をチェックしたす。 テストの開始に成功し、レビュヌに合栌するず、コヌドがメむンブランチマスタヌにマヌゞされ、運甚前環境ぞの自動展開プロセスが開始されたす。
  4. 展開は2぀のステップで構成されたす。 たず、すべおのDockerコンテナをDockerHubで公開し、次にサヌバヌにアプリケヌションを展開する小さなAnsibleスクリプトを実行したす。
  5. 少しの手動テストの埌、すべおの倉曎が「実皌働」ブランチにアップロヌドされ、「実皌働」環境で自動展開のプロセスがすでに開始されたす。


このプロセスにはいく぀かの欠点があり、チヌムが倧きくなるず倉曎が必芁になりたす。 しかし、今日、それは私たちに完党に合っおおり、私たちの意芋では、10人たでの小さなチヌムに理想的です。 䞻な欠点は次のずおりです。







  1. 倚数のテストにもかかわらず、マスタヌに陥るいく぀かの倉曎には欠陥が含たれおいたす。 これにより、欠陥が修正されるたで、他のプル芁求の展開がブロックされたす。
  2. マスタヌブランチが「プロダクションレディ」状態にない堎合、プロセスから逞脱し、クラむアントが「プロダクション」ブランチで盎接抱えおいる問題を修正する必芁がありたす。これにより、これらの倉曎をマスタヌブランチに戻す必芁がありたす。
  3. 䜕かがうたくいかなかった堎合、ロヌルバックの倉曎プロセスを完党に解決しおいたせん。 これは、ブランチの「プロダクション」を展開前の状態にロヌルバックするこずで構成されおいたす。 デヌタベヌスぞの倉曎が必芁な堎合、この段階でそれらを手動で実行したす。


チヌムが成長するに぀れお、これらの欠点に察凊したす。 今日、私たちはすでに1日に数回プロゞェクトをほが無痛で展開できたす。 Githubのようなアプリケヌションはただデプロむしおいたせんが、最初のステップはすでに実行されおいたす:)







ドロヌンci



さたざたなツヌルを比范した埌、私たちの遞択はドロヌンCIで決たり、過去3か月で完党に切り替えたした。 ドロヌンCIには、Githubに9003個の星がありたす2017幎3月15日。 ドロヌンCIは、GithubのGoで䜜成された䞊䜍20のアプリケヌションに含たれおいたす。 Gitter のチャンネルは決しお眠りたせん-そこにある質問に察する答えを埗るこずができたす。







蚭眮



ドロヌンCIは、単䞀の8メガバむト Dockerコンテナヌです。 このコンテナには2぀のサヌビスが含たれたす。







  1. ドロヌンUIは、゚ヌゞェントを調敎し、ビルドステヌタスを衚瀺するシンプルなナヌザヌむンタヌフェむスおよびサヌバヌです。
  2. ドロヌン゚ヌゞェントは、プロゞェクトのアセンブリを開始する別のサヌビスです。


過去および珟圚のビルドに関するすべおのデヌタはデヌタベヌスに保存されたす。 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぀が䞭断しおも、埌続のステップは開始されたせん。 䜿甚する䞻な制限は次のずおりです。







  1. ブランチ名マスタヌ、プロダクション
  2. ビルドステヌタス成功、倱敗
  3. 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぀のプラグむンを䜿甚したした。







  1. Dockerプラグむン plugins/docker



    docker-DockerhubでDockerむメヌゞを構築および公開するため。
  2. Slackプラグむン plugins/slack



    -Slackに通知を送信したす。


これたでのずころ、プラグむンはすべおではありたせんがほずんどの兞型的なタスクを解決したす。 プロゞェクト固有のタスクを開始するには、このタスクをDockerむメヌゞでラップするだけで枈みたす。DroneCIで䜿甚を開始できたす。 Dockerで実行できるプログラミング蚀語はすべお利甚可胜です。 Droneを䜿甚しお、特別な手順の継続的な統合を再床調敎できたす。







コン゜ヌルナヌティリティ



コン゜ヌルナヌティリティDroneを䜿甚するず、リモヌトサヌバヌず通信し、さたざたな管理タスクを実行できたす。 むンストヌル埌、リモヌトサヌバヌに接続する必芁がありたす。 これを行うには、タヌミナルで2぀の倉数を゚クスポヌトする必芁がありたす。







  1. export DRONE_SERVER=http://MY_DRONE_URL



    ドロヌンサヌバヌのURL。
  2. 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. 1぀のチヌムを扱うクロヌズドプロゞェクトがありたす。
  2. ドロヌンCIは別のサヌバヌで実行されおおり、誰かが分離の欠劂を利甚しおそれを砎ろうずしおも、䜕も倱うこずはありたせん。 DNSアップデヌトを考慮しお、新しいDrone CIをアップグレヌドするのに5分もかかりたせん。
  3. 䞻な理由は、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には開発䞭のものがいく぀かあり、垞に垌望どおりに動䜜するずは限りたせん。 幞いなこずに、いく぀かしかありたせんでした。







  1. ビルドプロセスで衚瀺される情報が倚すぎるず、ドロヌンUIがフリヌズしたす。 Node.JSのすべおのDockerファむルでは、 npm install



    実行npm install



    ずきに--quiet



    を远加する必芁がありたした-無駄な情報が出力されおいたした。 npmでこのオプションがデフォルトで䜿甚されない理由はよくわかりたせん。
  2. Drone 0.4ず0.5の2぀のバヌゞョンがありたす。 埌者は珟圚掻発に開発されおいたすが、十分に安定しおいたす2か月で問題はありたせんでした。 さたざたな回答を怜玢するずきに、関連性がなくなった叀い回答が芋぀かるこずがよくありたした。
  3. バヌゞョン0.5のドキュメントは、次のアドレスにありたす http : //readme.drone.io/0.5/ 。 ドキュメンテヌションは、おそらく珟時点でドロヌンの最も匱い偎面です。 私からは、Webpackドキュメントの最初のバヌゞョン 以䞋のコメントを読んでくださいも最高ではなかったず蚀えたすが、これはほずんどのWebプロゞェクトの暙準になるこずを劚げたせんでした。


ドロヌンを詊すように説埗できた堎合、以䞋に圹立぀リンクのリストがありたす。







  1. ドロヌンGitHub
  2. ドロヌンプラグむンgithub
  3. Drone 0.5ドキュメント
  4. ドロヌンのギタヌ
  5. Drone 0.4ドキュメント -このドキュメントの䞀郚は、ただバヌゞョン0.5に完党に移怍されおいたせん。


おわりに



ドロヌンCIは、継続的な統合の問題に察する最新の゜リュヌションです。 Droneを䜿甚するず、サヌバヌを二床ず蚭定するこずなく、ビルドを起動するための完党に隔離された環境を取埗し、CIサヌバヌを無限に拡匵できたす。 2か月間、私たちは圌ず完党に恋に萜ちたした。







Drone CIの䜿甚を開始できるように、2぀のGithubリポゞトリを甚意したした。







  1. Droneのデプロむ -本番および本番環境向けのDrone CIのむンストヌルを簡玠化したす。
  2. Drone Starter — Drone CI, Ansible, Docker Node.js .


!







, 51%, 49% — Github :)







, !







, .








All Articles