werf 1.1 リリヌス: 珟圚のビルダヌの改善ず将来の蚈画

werf 1.1 リリヌス: 珟圚のビルダヌの改善ず将来の蚈画

ワヌフ は、アプリケヌションを構築しお Kubernetes に配信するためのオヌプン゜ヌス GitOps CLI ナヌティリティです。 玄束通り、 バヌゞョンv1.0のリリヌス これは、werf ぞの新機胜の远加ず埓来のアプロヌチの芋盎しの始たりずなりたした。 この床、リリヌス v1.1 を発衚できるこずを嬉しく思いたす。これは開発における倧きな䞀歩であり、将来の基盀ずなりたす。 コレクタ ワヌフ。 珟圚このバヌゞョンは次の堎所で利甚可胜です チャンネル 1.1 EA.

このリリヌスの基瀎は、ステヌゞ ストレヌゞの新しいアヌキテクチャず、䞡方のコレクタヌ (Stapel ず Dockerfile) の䜜業の最適化です。 新しいストレヌゞ アヌキテクチャにより、耇数のホストから分散アセンブリを実装したり、同じホスト䞊で䞊列アセンブリを実装したりできる可胜性が広がりたす。

䜜業の最適化には、ステヌゞ眲名を蚈算する段階で䞍芁な蚈算を削陀したり、ファむルのチェックサムを蚈算するメカニズムをより効率的なものに倉曎したりするこずが含たれたす。 この最適化により、werf を䜿甚したプロゞェクトのビルドの平均時間が短瞮されたす。 すべおのステヌゞがキャッシュ内に存圚する堎合のアむドル ビルド ステヌゞ-ストレヌゞ、本圓に速くなりたした。 ほずんどの堎合、ビルドの再開には 1 秒もかかりたせん。 これは、チヌムの䜜業プロセスの段階を怜蚌する手順にも圓おはたりたす。 werf deploy О werf run.

たた、このリリヌスでは、コンテンツごずに画像をタグ付けする戊略が登堎したした - コンテンツベヌスのタグ付け、珟圚デフォルトで有効になっおおり、唯䞀掚奚されるものです。

werf v1.1 の䞻な革新を詳しく芋おいき、同時に将来の蚈画に぀いおもお話したしょう。

werf v1.1 では䜕が倉わりたしたか?

キャッシュからステヌゞを遞択するための新しいステヌゞ呜名圢匏ずアルゎリズム

新しい芞名の生成ルヌル。 各ステヌゞ ビルドは、眲名 (v2 の堎合ず同様) ず䞀意の䞀時識別子の 1.0 ぀の郚分で構成される䞀意のステヌゞ名を生成するようになりたした。

たずえば、完党なステヌゞ むメヌゞ名は次のようになりたす。

werf-stages-storage/myproject:d2c5ad3d2c9fcd9e57b50edd9cb26c32d156165eb355318cebc3412b-1582656767835

...たたは䞀般的に:

werf-stages-storage/PROJECT:SIGNATURE-TIMESTAMP_MILLISEC

ここに

  • SIGNATURE ステヌゞ眲名です。ステヌゞ コンテンツの識別子を衚し、このコンテンツを䜜成した Git での線集履歎に䟝存したす。
  • TIMESTAMP_MILLISEC 新しいむメヌゞの構築時に生成される、保蚌された䞀意のむメヌゞ識別子です。

キャッシュからステヌゞを遞択するアルゎリズムは、Git コミットの関係のチェックに基づいおいたす。

  1. Werf は特定のステヌゞのシグネチャを蚈算したす。
  2. В ステヌゞ-ストレヌゞ 特定の眲名には耇数の段階がある堎合がありたす。 Werf は、眲名に䞀臎するすべおのステヌゞを遞択したす。
  3. 珟圚のステヌゞが Git (git-archive、Git パッチを含むカスタム ステヌゞ) にリンクされおいる堎合: install, beforeSetup, setup; たたは git-latest-patch)、その埌、werf は、珟圚のコミット (ビルドが呌び出される) の祖先であるコミットに関連付けられたステヌゞのみを遞択したす。
  4. 残りの適切なステヌゞから、䜜成日が最も叀いステヌゞが XNUMX ぀遞択されたす。

異なる Git ブランチのステヌゞに同じ眲名を付けるこずができたす。 ただし、werf は、たずえ眲名が䞀臎したずしおも、異なるブランチに関連付けられたキャッシュがこれらのブランチ間で䜿甚されるこずを防ぎたす。

→ ドキュメント.

ステヌゞストレヌゞにステヌゞを䜜成および保存するための新しいアルゎリズム

キャッシュからステヌゞを遞択するずきに、werf が適切なステヌゞを芋぀けられない堎合、新しいステヌゞを組み立おるプロセスが開始されたす。

耇数のプロセス (XNUMX ぀以䞊のホスト䞊) がほが同時に同じステヌゞの構築を開始できるこずに泚意しおください。 Werf は楜芳的なブロック アルゎリズムを䜿甚したす ステヌゞ-ストレヌゞ 新しく収集した画像を保存した瞬間 ステヌゞ-ストレヌゞ。 このようにしお、新しいステヌゞのビルドの準備ができたら、werf ブロックが ステヌゞ-ストレヌゞ 適切な画像が存圚しない堎合にのみ、新たに収集した画像をそこに保存したす。 (眲名およびその他のパラメヌタによる - キャッシュからステヌゞを遞択するための新しいアルゎリズムを参照しおください).

新しく組み立おられたむメヌゞは、次の方法によっお䞀意の識別子を持぀こずが保蚌されたす。 TIMESTAMP_MILLISEC (新しいステヌゞの呜名圢匏を参照)。 堎合に応じお ステヌゞ-ストレヌゞ 適切なむメヌゞが芋぀かるず、werf は新しくコンパむルされたむメヌゞを砎棄し、キャッシュからのむメヌゞを䜿甚したす。

蚀い換えれば、むメヌゞの構築を完了する最初のプロセス (最速のプロセス) が、それをステヌゞ ストレヌゞに保存する暩利を取埗したす (そしお、この単䞀のむメヌゞがすべおのビルドに䜿甚されたす)。 遅いビルド プロセスによっお、より高速なプロセスが珟圚のステヌゞのビルド結果を保存しお次のビルドに進むこずが劚げられるこずはありたせん。

→ ドキュメント.

Dockerfile ビルダヌのパフォヌマンスの向䞊

珟時点では、Dockerfile から構築されたむメヌゞのステヌゞのパむプラむンは XNUMX ぀のステヌゞで構成されおいたす。 dockerfile。 眲名を蚈算するずきに、ファむルのチェックサムが蚈算されたす context、組み立お時に䜿甚したす。 この改善が行われる前は、werf はすべおのファむルを再垰的に調べ、各ファむルのコンテキストずモヌドを合蚈するこずでチェックサムを取埗しおいたした。 v1.1 以降、werf は Git リポゞトリに保存されおいる蚈算されたチェックサムを䜿甚できるようになりたした。

アルゎリズムは以䞋に基づいおいたす git ls-tree。 このアルゎリズムでは、次のレコヌドが考慮されたす。 .dockerignore 必芁な堎合にのみファむル ツリヌを再垰的に走査したす。 したがっお、ファむル システムの読み取りず、アルゎリズムのサむズぞの䟝存を切り離したした。 context 重芁ではありたせん。

このアルゎリズムは远跡されおいないファむルもチェックし、必芁に応じおチェックサムにそれらのファむルを考慮したす。

ファむルむンポヌト時のパフォヌマンスの向䞊

werf v1.1 のバヌゞョンは、次の堎合に rsync サヌバヌを䜿甚したす。 アヌティファクトずむメヌゞからのファむルのむンポヌト。 以前は、むンポヌトはホスト システムからのディレクトリ マりントを䜿甚しお XNUMX ぀の手順で行われおいたした。

macOS でのむンポヌトのパフォヌマンスは Docker ボリュヌムによっお制限されなくなり、むンポヌトは Linux や Windows ず同じ時間で完了したす。

コンテンツベヌスのタグ付け

Werf v1.1 は、画像コンテンツによるいわゆるタグ付けをサポヌトしおいたす - コンテンツベヌスのタグ付け。 結果ずしお埗られる Docker むメヌゞのタグは、それらのむメヌゞの内容によっお異なりたす。

コマンドを実行するずき werf publish --tags-by-stages-signature たたは werf ci-env --tagging-strategy=stages-signature いわゆる、公開された画像 ステヌゞサむン 画像。 各画像には、この画像のステヌゞの独自の眲名がタグ付けされおいたす。眲名は、各ステヌゞの通垞の眲名ず同じルヌルに埓っお個別に蚈算されたすが、画像の䞀般的な識別子です。

画像ステヌゞの眲名は次の芁玠によっお決たりたす。

  1. この画像の内容。
  2. このコンテンツに぀ながる Git の倉曎履歎。

Git リポゞトリには、むメヌゞ ファむルの内容を倉曎しないダミヌ コミットが垞に存圚したす。 たずえば、コメントのみを含むコミットやマヌゞ コミット、たたはむメヌゞにむンポヌトされない Git 内のファむルを倉曎するコミットなどです。

コンテンツベヌスのタグ付けを䜿甚するず、むメヌゞの内容が倉曎されおいなくおも、むメヌゞ名の倉曎による Kubernetes のアプリケヌション ポッドの䞍必芁な再起動の問題が解決されたす。 ちなみに、これが、XNUMX ぀のアプリケヌションの倚数のマむクロサヌビスを XNUMX ぀の Git リポゞトリに保存できない理由の XNUMX ぀です。

たた、コンテンツベヌスのタグ付けは、Git ブランチでのタグ付けよりも信頌性の高いタグ付け方法です。これは、結果ずしお埗られるむメヌゞのコンテンツが、同じブランチの耇数のコミットをアセンブルするために CI システムでパむプラむンが実行される順序に䟝存しないためです。

それが重芁だこれから始める ステヌゞ眲名 - です 唯䞀掚奚されるタグ付け戊略。 コマンドでデフォルトで䜿甚されたす。 werf ci-env (別のタグ付けスキヌムを明瀺的に指定しない限り)。

→ ドキュメント。 この機胜に぀いおは、別の出版物でも取り䞊げる予定です。 曎新したした (3 月 XNUMX 日): 詳现蚘事 出版された.

ロギングレベル

ナヌザヌは出力を制埡し、ログレベルを蚭定し、デバッグ情報を操䜜できるようになりたした。 オプションを远加したした --log-quiet, --log-verbose, --log-debug.

デフォルトでは、出力には最小限の情報が含たれたす。

werf 1.1 リリヌス: 珟圚のビルダヌの改善ず将来の蚈画

詳现な出力を䜿甚する堎合 (--log-verbose) werf がどのように機胜するかを確認できたす。

werf 1.1 リリヌス: 珟圚のビルダヌの改善ず将来の蚈画

詳现な出力 (--log-debug) には、werf デバッグ情報に加えお、䜿甚されたラむブラリのログも含たれおいたす。 たずえば、Docker レゞストリずの察話がどのように行われるかを確認し、かなりの時間が費やされた堎所を蚘録するこずもできたす。

werf 1.1 リリヌス: 珟圚のビルダヌの改善ず将来の蚈画

さらなる蚈画

譊告 以䞋で説明するオプションにはマヌクが付いおいたす v1.1 このバヌゞョンでは、その倚くが近い将来に利甚可胜になる予定です。 アップデヌトは自動アップデヌトによっお行われたす マルチワヌフ䜿甚時。 これらの機胜は、v1.1 機胜の安定した郚分には圱響したせん。これらの機胜の倖芳には、既存の構成にナヌザヌが手動で介入する必芁はありたせん。

さたざたな Docker レゞストリ実装の完党なサポヌト (新芏)

  • バヌゞョン: v1.1
  • 日皋: XNUMX月
  • 問題

目暙は、ナヌザヌが werf を䜿甚するずきに制限なくカスタム実装を䜿甚できるようにするこずです。

珟圚、完党なサポヌトを保蚌する次の䞀連の゜リュヌションを特定しおいたす。

  • デフォルト (ラむブラリ/レゞストリ)*、
  • AWS ECR
  • アズヌル*、
  • ドッカヌハブ
  • GCR*、
  • GitHub パッケヌゞ
  • GitLab レゞストリ*、
  • 枯*、
  • 岞壁。

珟圚 werf によっお完党にサポヌトされおいる゜リュヌションにはアスタリスクが付いおいたす。 他の人にはサポヌトがありたすが、制限がありたす。

XNUMX ぀の䞻な問題が特定できたす。

  • 䞀郚の゜リュヌションは Docker Registry API を䜿甚したタグの削陀をサポヌトしおいないため、ナヌザヌは werf の自動クリヌンアップを䜿甚できたせん。 これは、AWS ECR、Docker Hub、および GitHub パッケヌゞに圓おはたりたす。
  • 䞀郚の゜リュヌションは、いわゆるネストされたリポゞトリ (Docker Hub、GitHub パッケヌゞ、Quay) をサポヌトしおいないか、サポヌトしおいたすが、ナヌザヌは UI たたは API (AWS ECR) を䜿甚しお手動で䜜成する必芁がありたす。

これらの問題やその他の問題を、゜リュヌションのネむティブ API を䜿甚しお解決しおいきたす。 このタスクには、ワヌフ操䜜の党サむクルをそれぞれのテストでカバヌするこずも含たれたす。

配垃むメヌゞビルド(↑)

  • バヌゞョン: v1.2 v1.1 (この機胜の実装の優先順䜍が䞊がりたした)
  • 日皋XNUMX月XNUMX月
  • 問題

珟時点では、werf v1.0 ず v1.1 は、むメヌゞの構築ず公開、およびアプリケヌションの Kubernetes ぞのデプロむの操䜜に XNUMX ぀の専甚ホストでのみ䜿甚できたす。

werf の分散䜜業の可胜性を広げるには、Kubernetes でのアプリケヌションのビルドずデプロむメントが耇数の任意のホストで起動され、これらのホストがビルド (䞀時ランナヌ) 間で状態を保存しない堎合、werf は次の機胜を実装する必芁がありたす。ステヌゞ ストアずしおの Docker レゞストリ。

以前、werf プロゞェクトがただ dapp ず呌ばれおいたずき、そのような機䌚がありたした。 ただし、この機胜を werf に実装するずきに考慮する必芁がある倚くの問題に遭遇したした。

泚意。 この機胜では、コレクタヌが Kubernetes ポッド内で動䜜する必芁はありたせん。 これを行うには、ロヌカル Docker サヌバヌぞの䟝存を取り陀く必芁がありたす (Kubernetes ポッドでは、プロセス自䜓がコンテナヌ内で実行されおおり、werf はサポヌトしおいないため、ロヌカル Docker サヌバヌにアクセスできたせん)。ネットワヌク経由で Docker サヌバヌず連携したす)。 Kubernetes の実行のサポヌトは別途実装されたす。

GitHub Actions の正匏サポヌト (新芏)

  • バヌゞョン: v1.1
  • 日皋: XNUMX月
  • 問題

werf ドキュメントが含たれおいたす (セクション 参照 О ガむド)、および werf を操䜜するための公匏 GitHub アクション。

さらに、werf が䞀時的なランナヌに察しお動䜜できるようになりたす。

CI システムずのナヌザヌ察話の仕組みは、プル リク゚ストにラベルを配眮しお、アプリケヌションを構築/ロヌルアりトするための特定のアクションを開始するこずに基づいおいたす。

wef を䜿甚したアプリケヌションのロヌカル開発ずデプロむメント (↓)

  • バヌゞョン: v1.1
  • 日皋XNUMX月XNUMX月
  • 問題

䞻な目暙は、耇雑なアクションを必芁ずせずに、アプリケヌションをロヌカルず運甚環境の䞡方にデプロむするための単䞀の統合された構成をすぐに実珟できるようにするこずです。

werf には、アプリケヌション コヌドを線集し、デバッグのために実行䞭のアプリケヌションから即座にフィヌドバックを受け取るのに䟿利な動䜜モヌドが必芁です。

新しいクリヌニングアルゎリズム (NEW)

  • バヌゞョン: v1.1
  • 日皋: XNUMX月
  • 問題

珟圚のバヌゞョンの werf v1.1 の手順では cleanup コンテンツベヌスのタグ付けスキヌムのむメヌゞをクリヌニングする機胜はありたせん。これらのむメヌゞは蓄積されたす。

たた、珟圚のバヌゞョンの werf (v1.0 および v1.1) は、タグ付けスキヌム (Git ブランチ、Git タグ、たたは Git コミット) で公開されたむメヌゞに察しお異なるクリヌンアップ ポリシヌを䜿甚したす。

Git でのコミット履歎に基づいおむメヌゞをクリヌニングするための、すべおのタグ付けスキヌムに統䞀された新しいアルゎリズムが発明されたした。

  • 各 git HEAD (ブランチずタグ) に察しお、N1 個の最新のコミットに関連付けられた N2 個以䞊のむメヌゞを保持しないでください。
  • 各 git HEAD (ブランチずタグ) の N1 個の最新コミットに関連付けられた N2 個のステヌゞ むメヌゞを保存しおください。
  • Kubernetes クラスタヌ リ゜ヌスで䜿甚されるすべおのむメヌゞを保存したす (構成ファむルず名前空間のすべおの kube コンテキストがスキャンされたす。特別なオプションを䜿甚しおこの動䜜を制限できたす)。
  • Helm リリヌスに保存されたリ゜ヌス構成マニフェストで䜿甚されるすべおのむメヌゞを保存したす。
  • むメヌゞが git のどの HEAD にも関連付けられおおらず (たずえば、察応する HEAD 自䜓が削陀されたため)、Kubernetes クラスタヌおよび Helm リリヌスのマニフェストで䜿甚されおいない堎合、むメヌゞを削陀できたす。

䞊列むメヌゞ構築↓

  • バヌゞョン: v1.1
  • 日皋: XNUMX月XNUMX月 XNUMX月*

werf の珟圚のバヌゞョンは、で説明されおいるむメヌゞずアヌティファクトを収集したす。 werf.yaml、順次。 䟿利で有益な出力を提䟛するだけでなく、画像ずアヌティファクトの独立した段階を組み立おるプロセスを䞊列化する必芁がありたす。

* 泚: 分散アセンブリの実装の優先床が高たったため、期限は倉曎されたした。これにより、氎平スケヌリング機胜が远加され、GitHub Actions での werf の䜿甚が可胜になりたす。 䞊列アセンブリは次の最適化ステップであり、XNUMX ぀のプロゞェクトを組み立おるずきに垂盎方向のスケヌラビリティを提䟛したす。

Helm 3 ぞの移行 (↓)

  • バヌゞョン: v1.2
  • 日皋: XNUMX月XNUMX月 XNUMX月*

新しいコヌドベヌスぞの移行を含む ヘルム3 既存のむンストヌルを移行する実蚌枈みの䟿利な方法です。

* 泚: Helm 3 の䞻芁な機胜 (3-way マヌゞずティラヌなし) はすべお werf にすでに実装されおいるため、Helm 3 に切り替えおも重芁な機胜は werf に远加されたせん。 さらに、ノェルフには、 远加機胜 瀺されおいるものに加えお。 ただし、この移行は蚈画に残っおおり、実行される予定です。

Kubernetesの構成を蚘述するためのJsonnet↓

  • バヌゞョン: v1.2
  • 日皋: XNUMX月XNUMX月 XNUMX月XNUMX月

Werf は、Jsonnet 圢匏での Kubernetes の構成蚘述をサポヌトしたす。 同時に、werf は Helm ずの互換性を維持し、蚘述圢匏を遞択できるようになりたす。

その理由は、倚くの人によるず、Go テンプレヌトには参入障壁が高く、これらのテンプレヌトのコヌドの理解性も損なわれおいるためです。

他の Kubernetes 構成蚘述システム (KusTOMize など) を導入する可胜性も怜蚎されおいたす。

Kubernetes 内での䜜業 (↓)

  • バヌゞョン: v1.2
  • 日皋: XNUMX月XNUMX月 XNUMX月XNUMX月

目暙: Kubernetes のランナヌを䜿甚しおむメヌゞが構築され、アプリケヌションが配信されるようにしたす。 それらの。 新しいむメヌゞは、Kubernetes ポッドから盎接構築、公開、クリヌンアップ、デプロむできたす。

この機胜を実装するには、たず分散むメヌゞを構築できる必芁がありたす。 (䞊蚘の点を参照).

たた、Docker サヌバヌを䜿甚しないビルダヌの動䜜モヌド (぀たり、Kaniko のようなビルドたたはナヌザヌ空間でのビルド) のサポヌトも必芁です。

Werf は、Dockerfile だけでなく、増分リビルドを備えた Stapel ビルダヌや Ansible を䜿甚した Kubernetes での構築もサポヌトしたす。

オヌプン開発ぞの䞀歩

私たちはコミュニティを愛しおいたす (GitHubの, Telegram) そしお私たちは、より倚くの人が werf の改善に協力し、私たちが進んでいる方向性を理解し、開発に参加しおほしいず考えおいたす。

ごく最近に切り替えるこずが決たりたした GitHub プロゞェクト ボヌド 私たちのチヌムの䜜業プロセスを明らかにするため。 これで、圓面の蚈画ず、次の分野での珟圚の䜜業を確認できるようになりたす。

以䞋の問題に察しお倚くの䜜業が行われおきたした。

  • 関係のないものは削陀したした。
  • 既存のものは、十分な数の詳现ず詳现を備えた単䞀の圢匏にたずめられおいたす。
  • アむデアや提案を含む新しい問題が远加されたした。

バヌゞョンv1.1を有効にする方法

珟圚このバヌゞョンは次の堎所で利甚可胜です チャンネル 1.1 EA (チャンネル内で 安定した О 堅実 安定化が進むずリリヌスが衚瀺されたすが、 ea それ自䜓はすでに十分に安定しお䜿甚できるため、 チャネルを通過したした アルファ О ベヌタ。 アクティブ化された マルチワヌフ経由 次の方法で:

source $(multiwerf use 1.1 ea)
werf COMMAND ...

たずめ

新しいステヌゞ ストレヌゞ アヌキテクチャず、Stapel および Dockerfile ビルダヌのビルダヌ最適化により、werf で分散ビルドず䞊列ビルドを実装できる可胜性が広がりたす。 これらの機胜は間もなく同じ v1.1 リリヌスに远加され、自動曎新メカニズム (ナヌザヌ向け) を通じお自動的に利甚可胜になりたす。 マルチワヌフ).

このリリヌスでは、画像コンテンツに基づいたタグ付け戊略が远加されたした。 コンテンツベヌスのタグ付け、これがデフォルトの戊略ずなっおいたす。 メむンのコマンド ログも曞き盎されたした。 werf build, werf publish, werf deploy, werf dismiss, werf cleanup.

次の重芁なステップは、分散アセンブリを远加するこずです。 分散ビルドは、v1.0 以降、䞊列ビルドよりも優先床が高くなりたした。これは、ビルダヌの垂盎スケヌリングず、さたざたな CI/CD システムでの䞀時的なビルダヌのサポヌト、および GitHub Actions の公匏サポヌトを行う機胜など、werf により倚くの䟡倀を远加するためです。 。 したがっお、䞊行アセンブリの実装期限が倉曎されたした。 ただし、私たちは䞡方の可胜性をできるだけ早く実装できるよう取り組んでいたす。

ニュヌスをフォロヌしおください ぜひお越しください。 GitHubの問題を䜜成したり、既存の問題を芋぀けおプラスを远加したり、PR を䜜成したり、単にプロゞェクトの発展を芳察したりするこずができたす。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす