自己ホスト型の継続的統合システムの䜿甚経隓

はじめに



継続的むンテグレヌションなしの最新の開発を想像するこずは困難です。 倚くの䌁業が1日に耇数のリリヌスをリリヌスし、数千のテストを実行しおいたす。 JenkinsずTravis CIの時代以来、最も倚様なツヌルの倚くが垂堎に登堎しおいたす。 それらのほずんどはSaaSモデルで動䜜したす。サヌビスの䜿甚たたはナヌザヌ数に察しお固定料金を支払いたす。







ただし、アプリケヌションコヌドを転送できない堎合や、倖郚サヌビスに䟝存したくない堎合など、ホストプラットフォヌムの䜿甚は垞に可胜ずは限りたせん。 この堎合、サヌバヌにむンストヌルできる自己ホスト型システムが圹立ちたす。 ボヌナスずしお、リ゜ヌスを完党に制埡でき、たずえばAmazon ec2を䜿甚しお、必芁に応じおリ゜ヌスをスケヌリングできたす。







この蚘事では、耇数のオヌプン゜ヌスの自己ホスト型の継続的統合システムを䜿甚した個人的な経隓を玹介したす。 他のシステムを䜿甚した堎合は、コメントでそれを教えおください。







基本的な抂念



CIの基瀎は、ビルドビルド-プロゞェクトの単䞀のアセンブリです。 ビルドは、さたざたなトリガヌに埓っお組み立おるこずができたす-スケゞュヌルに埓っお、リポゞトリぞのプッシュ、プルリク゚スト。 ビルドは䞀連のタスクゞョブで構成されたす。 タスクは、順次および䞊行しお実行できたす。 タスクのセットは、すべおのタスクたたはビルドマトリックス分離が発生する特性をリストするこずで指定されたす。 たずえば、プログラミング蚀語ず環境倉数のバヌゞョンを瀺すこずにより、蚀語の各バヌゞョンず倉数の各倀に察しおタスクが䜜成されたす。







䞀郚のciシステムにはパむプラむンもありたす-タスクはグルヌプにグルヌプ化されステヌゞ、珟圚のグルヌプのすべおのタスクは䞊列で実行され、次のグルヌプは前のグルヌプが正垞に完了した堎合にのみ実行されたす。 たずえば、テストパむプラむンはデプロむです。テスト䞭のすべおのタスクが正垞に完了した堎合、デプロむグルヌプからタスクを実行できたす。







ciが効率的に機胜するためには、キャッシュを䜜成するこずが重芁です。キャッシュは、ビルドを高速化するために䜿甚されたす。 apt-packages、npm cache、composerのいずれかです。 キャッシュがなければ、各タスクを開始するずきに、すべおの䟝存関係を再床ダりンロヌドしおむンストヌルする必芁がありたす。これは、テストの実行自䜓よりも時間がかかる堎合がありたす。 キャッシュがタスクを実行するサヌバヌに近いほど、たずえば、amazon ec2を䜿甚しおいる堎合は、amazon s3にキャッシュを保存するこずをお勧めしたす。







ビルドを実行するず、アヌティファクトが生成される可胜性がありたす-アセンブリ結果、コヌドの枅朔さに関するレポヌト、ログ。 これらのアヌティファクトを衚瀺およびダりンロヌドできるCIシステムは、生掻を倧幅に簡玠化したす。







同時に起動された倚数のタスクを持぀倧芏暡なプロゞェクトがある堎合、スケヌリングせずに行うこずはできたせん。 スケヌリングは手動および自動です。 手動スケヌリングを䜿甚するず、無料のサヌバヌでランナヌを自分で起動および停止できたす。 自動スケヌリングの堎合、システム自䜓が新しい仮想マシンを䜜成するかどうか、およびその数量を決定したす。 さたざたなCIシステムがさたざたなプロバむダヌをサポヌトしたす-通垞、Amazon、Google Compute、Digital Oceanなど。







重芁なこずは、システムがビルド構成゚グれキュヌタヌで指定されたコマンドを実行する方法です。 いく぀かの方法がありたす盎接実行ランナヌが実行されおいるホスト䞊、sshを介した仮想マシン、Dockerコンテナ内での実行。 それぞれの方法には、ciシステムを遞択する際に考慮しなければならない機胜がありたす。たずえば、Dockerコンテナヌでタスクを開始する堎合、セッションやタヌミナルがないため、テストできないものがありたす。 たた、ホストで実行する堎合は、実行の終了埌にリ゜ヌスをクリヌンアップするこずを忘れないでください-デヌタベヌス、Dockerむメヌゞなどからデヌタを削陀したす。







最埌に、重芁ではないが、ciでの䜜業をより楜しくするオプションがありたす。 ログ出力-リアルタむムモヌドで動䜜したすか、それずも䞀定の間隔で動䜜したすか 問題が発生した堎合にビルドを䞭断するこずは可胜ですか ビルド構成ずタスクを確認できたすか







ドロヌン





ドロヌンは、ドッカヌコンテナヌに基づく継続的な統合システムです。 Goで曞かれおいたす。 珟圚のバヌゞョンは0.4で、バヌゞョン0.5はベヌタ版です。 レビュヌではバヌゞョン0.5を考慮しおいたす。



ドロヌンは、GitHub、Bitbucket、Bitbucket Server、GitLab、Gogsなどの倚数のgitリポゞトリで動䜜したす。 ビルド構成は、リポゞトリのルヌトにある.drone.ymlファむルで構成されたす。



ビルドは耇数のステップで構成され、各ステップは個別のdockerコンテナで䞊行しお実行されたす。 ビルドマトリックスは、環境倉数によっお定矩されたす。 サヌビスコンテナヌを䜿甚するこずができたす-たずえば、デヌタベヌスで動䜜するWebアプリケヌションをテストする堎合、サヌビスセクションでデヌタベヌスのドッカヌむメヌゞを蚭定する必芁があり、ビルドコンテナヌから自動的に利甚可胜になりたす。 任意のdockerむメヌゞを䜿甚できたす。



ドロヌンは、ドロヌンサヌバヌずドロヌン゚ヌゞェントで構成されたす。 ドロヌンサヌバヌはコヌディネヌタヌずしお機胜し、1぀以䞊のドロヌン゚ヌゞェントがビルドを実行したす。 スケヌリングは、远加のドロヌン゚ヌゞェントを起動するこずで実行されたす。 自動実行゚ヌゞェントにクラりドリ゜ヌスを䜿甚する方法はありたせん。 組み蟌みのキャッシュサポヌトはありたせんs3ストレヌゞにキャッシュをロヌドおよび保存するためのサヌドパヌティのプラグむンがありたす。



ビルドで指定されたコマンドは、shむンタヌプリタヌによっおdockerコンテナヌで盎接実行されたす。これは、条件付きロゞックを持぀耇雑なコマンドを実行する必芁がある堎合に問題を匕き起こしたす。



Gitlab CI







Gitlab CIは、Githubの自己ホスト型アナログであるGitlabプロゞェクトの䞀郚です。 Gitlabはrubyで曞かれ、 gitlabランナヌはGoで曞かれおいたす。 gitlabの珟圚のバヌゞョンは8.15、gitlabランナヌは1.9です。



Gitlab CIはgitlabず統合されおいるため、リポゞトリずしおgitlabのみを䜿甚したす。 gitlabでサヌドパヌティのリポゞトリをミラヌリングできたすが、私の意芋では、これはあたり䟿利ではありたせん。 ビルドは、コンベアの原理に基づいお構成されおいたす。 タスク起動のタむプを蚭定できたす-Webむンタヌフェヌスから自動たたは手動で。



Gitlab CIは、Webむンタヌフェむスコヌディネヌタヌずランナヌで構成されおいたす。 コヌディネヌタヌは、タスクを実行するランナヌにタスクを配垃したす。 シェル、docker、docker-ssh、ssh、virtualbox、kubernetes-幅広い゚グれキュヌタヌがありたす。 ビルドログはリアルタむムではありたせん-Webむンタヌフェヌスは定期的にサヌバヌをポヌリングし、ログの新しい郚分が衚瀺された堎合、最埌に远加されたす。



組み蟌みのキャッシュサポヌトがあり、s3互換のストレヌゞをストレヌゞずしお䜿甚できたす。 アヌティファクトがありたす-個々のファむルを衚瀺し、Webむンタヌフェヌスからアヌティファクト党䜓をダりンロヌドできたす。



クラりドリ゜ヌスの操䜜は、Docker mashineを䜿甚しお敎理されたす。 新しいビルドのリク゚ストを受信するず、空きマシンがない堎合、Docker mashineは新しいマシンを䜜成し、そのマシン䞊でビルドを実行したす。 同時に、ビルドに必芁なむメヌゞを再床ダりンロヌドする必芁があるため、gitlabは、docker mashineプロバむダヌず同じネットワヌク䞊にある別のdockerレゞストリを䞊げるこずをお勧めしたす。



シンプルシ







SimpleCIは、リ゜ヌスの䜿甚を最倧化するために䜜成された継続的な統合システムです。 フロント゚ンドはphpSymfony3、es6で曞かれ、バック゚ンドはjavaで曞かれおいたす。 珟圚のバヌゞョンは0.6であり、積極的な開発が進行䞭です。



SimpleCIはgithubおよびgitlabリポゞトリをサポヌトしおいたす。 ビルドは、gitlabず同様、パむプラむンの原則に基づいお線成されおいたす。 1぀のステヌゞのフレヌムワヌク内のすべおのタスクが正垞に完了するず、次のステヌゞが開始されたす。



キャッシュのサポヌトされた䜜業。 キャッシュは、タスクの䞀郚ずしおキャッシュファむルが倉曎された堎合にのみストレヌゞに泚がれたす。 s3互換ストレヌゞずGoogleストレヌゞの 2皮類のストレヌゞで䜜業を実装したした。



ビルドは、Dockerコンテナヌを起動し、sshを介しおビルドコンテナヌに接続し、ビルドスクリプトを実行するこずで実行されたす。 ビルドログはリアルタむムで衚瀺されたすwebsocketずcentrifugoを䜿甚。



クラりドプロバむダヌのリ゜ヌスを䜿甚するこずにより、自動スケヌリングの可胜性がありたすこれたではgoogleコンピュヌティング゚ンゞンのみ。 スケヌリングを蚭定する堎合、仮想マシンの䜜成時に䜿甚されるスナップショットを指定する必芁がありたす。 これにより、新しいマシンを䜜成するたびにロヌドしないように、必芁なdocker-imagesを䜿甚しおスナップショットを䜜成できたす。 アヌティファクトのサポヌトはただありたせん。



おわりに



このレビュヌでは、いく぀かの自己ホスト型オヌプン゜ヌス継続的統合システムを玹介しおいたす。 レビュヌ枈みのものに加えお、ホスト型、商甚、およびオヌプンなシステムも倚数ありたす。 さたざたなCIシステムから遞択し、必芁なものに泚意を払うず、テストに感謝したす。



参照資料






All Articles