CI / CDのDockerイメージをdappですばやく便利にアセンブルします(レビューとビデオ)

これは、会議でのスピーチに基づいた2番目の出版物です。 1つ目は、 Dockerを使用した継続的配信プラクティスの一般的なレビューです 新しいレポートは、11月8日に開催されたHighLoad ++ 2016カンファレンスのセクション「DevOps and operation」で作成された、より適用されたレポート「迅速かつ便利にDockerイメージを組み立てる」に基づいています。







前回と同様に、ビデオに1時間以上費やす機会がある場合は、完全に視聴することをお勧めします(記事の最後を参照) 。 それ以外の場合は、テキスト形式で主要な本質を示します。



Dockerイメージには何が必要ですか?



CI / CDプロセス(継続的インテグレーション、継続的デリバリー、継続的デプロイメント)のコンテキストでの要件は次のとおりです。



  1. コンパクトなボリューム。 その理由は、CDのフレームワーク内では、非常に頻繁に大量に(各コミット)収集する必要があるため、すぐに巨大なストレージが必要になる可能性があるためです。 200 MB未満の画像レートを受け入れました(Ubuntuシステムの基本的な画像は130 MBかかります)。
  2. 10 KBのボリュームでコミットする場合、追加されたフルサイズのイメージではなく、イメージのサイズが同様に増加することを確認します。
  3. 画像の高速アセンブリ-10秒。
  4. 生成されたイメージをさまざまなサイトの最終製品として使用する機能(テストから実稼働まで)。




dockerfileの代わりにdapp



これらの要件を満たすには、標準のDockerメカニズムであるDockerfileでは不十分です。 Dockerの作成者にはこの理由が公式にあり、プロジェクトでは、一般的な(プライベートではなく)問題の解決と高レベルの移植性など、基本的かつ非常に論理的な原則として受け入れられています。



そのため、独自のユーティリティ-dapp (Rubyで、MITライセンスの下で配布)を作成しました。 この段階では、彼女は画像の組み立て方法を知っているだけであり、開発の計画にはCI / CDサイクル全体のサポートが含まれています。 dappの設計と実装では、使いやすさと速度/効率が優先されます。



2019年8月13日更新: dappプロジェクトの名前がwerfに変更れ、そのコードが完全にGoに書き換えられ、ドキュメントが大幅に改善されました。



dappでコンパイルされたイメージの構成は、1つのリポジトリ→1つのプロジェクト→1つのDappfileの原則に関するDappfileで説明されています。 現在、このファイルの形式はRuby DSLですが、よりシンプルで使いやすいYAMLに切り替える予定です。



dappにはどのような機能がありますか?



1.ステージとキャッシュ



Dappは、Dockerイメージを構築するための4段階のパターンを実装します。



  1. before_install:OS設定など。これは(数十の異なるプロジェクトの分析結果による)コミットの1%未満を占めます。
  2. インストール:アプリケーションの依存関係-コミットの約5%。
  3. before_setup;
  4. セットアップ:構成-約2%。


これらの段階の結果はキャッシュされるため、画像の再構築速度が大幅に向上します。





2.外部コンテキスト



アセンブリ時のコンテナの場合、いわゆる「外部コンテキスト」が使用可能です。これらは、アセンブリ時に使用されるが最終イメージから除外されるマウントされたディレクトリです。 これらのディレクトリに情報を保存し、次のビルドに使用できます。



使用例は、ディレクトリ/ var / lib / aptです。apt-get更新後のコンテンツは、次のアセンブリにも必要ですが、イメージ自体(追加データ)には必要ありません。



3. Git



Gitからの変更のサポートも、最適化と柔軟性のアイデアに従って行われます。 イメージの最初のアセンブリでは、すべてのアプリケーションソースコード(gitアーカイブ)がイメージに追加され、後続のアセンブリではデルタのみ、つまり Gitパッチが適用されます。 パッチの内容は、パフォーマンスを向上させるためにキャッシュされます。







ファイル/ディレクトリを指定することができます。変更する場合は、インストール段階を実行する必要があります。





4.アーティファクト



場合によっては、プロジェクトをビルド(一部のコンポーネントを「コンパイル」)するために、最終アプリケーションで使用されない大規模なサードパーティツールが必要です(つまり、イメージに保存する必要はありません)。 これは、Cなどの言語でのソースのアセンブリだけでなく、たとえばNode.jsを使用したアセットの生成にも適用されます。 この問題は、いわゆる「アーティファクト」を使用して実装されます。 dapp buildコマンドが実行されると、アーティファクト(つまり、イメージのビルドに必要なサードパーティツール)を含む追加のDockerイメージが作成されます。 このアーティファクトのファイルは、外部コンテキストを使用して、追加から実際の(最終)イメージに追加されます。 アーティファクトについては、キャッシュもサポートされています。



5.シェフのサポート



画像の組み立てにおけるモジュール性は大きな利点をもたらしますが、シェル(Bash)のフレームワークでの実装は恩恵のない作業です。 しかし、構成管理システムで美しく作られています:Chef→Berkshelf、Puppet→Librarian ... Chefを使用しているため、dappにサポートを追加しました。 このサポートは、作成されたDockerイメージ内でレシピを実行する機能を意味します。



技術的には、ChefクックブックがGitリポジトリ内の特別なディレクトリ(.dapp_chef)に配置されるようにすべてが編成されます。 dapp buildコマンドが実行されると、必要なものはすべてDockerコンテナ内にマウントされたディレクトリに収集されます。 さらに、完全にインストールされたChef(chefdk)がコンテナにマウントされます。 次に、Chefが起動し、クックブックのコンテナーが構成されます。 結果のイメージはレシピに従って構成されますが、chefdkまたはcookbookは含まれません。





6.複数の画像



Dappfileで採用されている形式を使用すると、1つのファイルで多数の画像をすぐに記述できます。



オープンソースとしてのdapp



dappをほぼ2年間使用および開発してきましたが、CI / CDプロセスの構成と関連タスクの解決に役立つ、有用なオープンソースソリューションを作成したいと考えています。 ソースコードはGitHubで入手でき、 問題プルリクエストも歓迎します 。 ドキュメントはこちらから入手できます



ところで、仕事があります!



dappの場合、テクノロジーエバンジェリストになることを夢見ているユニークな愛好家を探しています。 このようなツール、DevOpsの経験、プロジェクト管理、有能な技術テキストの作成に興味がある場合は、長々と説明せずに、info @ flant.ruまでご連絡ください。



ビデオとスライド



スピーチのビデオ(約1時間)がYouTube公開されました (リンクは13分から始まり、マイクに関する技術的な問題が停止し、導入部分でCIに関する一般的なレポートが繰り返されます



レポートのプレゼンテーション:







PS



ブログのトピックに関するその他のレポート:






All Articles