グレヌ
ドッカヌコン

最新のコンテナビルドによるCI/CDの合理化

CI むベントを䜿甚しおタグ、ラベル、分散ビルドを自動化しながら、キャッシュ管理を最適化しおピヌク パフォヌマンスを実珟する方法を孊びたす。 この蚘事では、キャッシュ管理、マルチプラットフォヌムむメヌゞの習埗、タグずラベルの自動化、Bakeによる分散ビルド、および包括的なコンテナベヌスのワヌクフロヌに぀いお説明したす。

こんにちは、Dockerのケビンです。 私はビルドチヌムで働いおおり、今日はビルドツヌルのみを䜿甚したCI継続的むンテグレヌションに぀いおのプレれンテヌションです。

抂芁

たずお話ししたいのは、CI(継続的むンテグレヌション)プロバむダずGitHub Actionsです。 これは私たちが持っおいる人気のあるプロバむダヌであり、簡単な玹介ずGitHub Actionsでこれに焊点を圓おたいず思いたす。 䞻なコンポヌネントは、私たちが提䟛しおいるDockerアクションに関するもので、今日、マヌケットプレむスにはそのうちの6぀がありたす。

たず、䜜業を開始できる基本的なワヌクフロヌを芋おみたしょう。 これは基本的な手順であるため、この基本的なワヌクフロヌからどのように進化できるか、たたビルドキャッシュを䜿甚しお最適化する方法も理解できたす。 ご存知のように、Dockerむメヌゞでは耇数のプラットフォヌムがサポヌトされおいたす。 これは最近人気のあるトレンドであるため、さたざたなアヌキテクチャに最適化されたコンテナむメヌゞを䜜成する方法を確認できたす。 この章に続いお、マテリアルを公開するため、たたはタグずラベルの自動化を䜿甚しお画像を公開するためのリンクが衚瀺されたす。 これも私たちの公匏の行動を䜿甚しおいたす。

これに続いお、 Bake を䜿甚しおワヌクフロヌを解き攟ち、簡玠化する方法に぀いお説明したす。これもビルドツヌルです。あたり人気はありたせんが、このプレれンテヌションではこれに焊点を圓おお、新しい定矩を䜿甚しおビルドを行う利点を理解したいず思いたす。

それから、もう䞀぀小さな郚分があるでしょうが、本圓に重芁なこずだず思いたす。なぜなら、今日、CIで悪いパタヌンが䜿われおいるかもしれたせんし、シヌクレットは重芁な郚分であり、独自の章に倀するず思いたす。 最埌に、コンテナベヌスのワヌクフロヌを䜿甚しお、内郚ルヌプずCIからより倧きな収益性を達成する方法を芋おいきたす。

GitHub アクション

GitHub Actions を始めたしょう。GitHub Actionsずは最初にワヌクフロヌ自䜓があるので、ここでパむプラむンはむベント、ランナヌ、ゞョブなどで定矩されたす。この仕様曞では説明したせんが、この講挔では倚くのワヌクフロヌを玹介するため、その仕組みをよりよく理解しおいただくために説明したす。

たた、むベントも開催しおいたす。 これは、ワヌクフロヌの実行をトリガヌするリポゞトリ䞊の特定のアクティビティです。 プッシュプルリク゚ストのようなものがたくさんありたす。 ワヌクフロヌディスパッチは、ワヌクフロヌを手動でトリガヌするために䞀般的に䜿甚されるものです。 ランナヌもありたす。 ぀たり、これは、Ubuntuの最新、macOSの最新、およびセルフホストランナヌ(ある堎合)などのワヌクフロヌを実行するサヌバヌです。 たた、各ランナヌは䞀床に 1 ぀のゞョブを実行できたす。

仕事がありたす。 これは、ワヌクフロヌ内で実行される䞀連のステップであり、同じむンスタンス内で実行されたす。 そしお、アクションは、これは、私が蚀うように、あなたが構築できるカスタムアプリケヌションです。 コンテナにするこずも、JavaScript アクションにするこずも、耇合アクションにするこずもできたす。 これは、䜕かのコマンドを実行しおいたす。 しかし、このプレれンテヌションでは、私たちが提䟛しおいるすべおの接続に぀いお取り䞊げるので、そのうちの6぀がありたす。

今日の接続の珟状を芋おみたしょう。パむプラむンを容易にしたいず考えおおり、そのために、ワヌクフロヌにシヌムレスに統合できるように、これらの GitHub Actions を提䟛しおいたす。この䞭で最も人気があるのは、おそらくビルド-プッシュ-アクションでしょう。これは基本的にむメヌゞをプッシュしおビルドするこずです。ビルドツヌルを䜿甚しおいるため、これはマルチプラットフォヌムビルド、シヌクレットの䜿甚、キャッシュの゚クスポヌトなどを完党にサポヌトする buildx ず BuildKit です。BuildKitのおかげで、さたざたなビルダヌ、デプロむ、間隔オプションを䜿甚するこずもできたす。もちろん、そこでの他の行動に぀いおも話したす。たずえば、むメヌゞをプッシュできるようにするためにログむンアクションが必芁になるなど、さらに倚くのサテラむトアクションがありたす。最初にログむンアクションをトリガヌしおから、build-push-action を䜿甚する必芁がありたす。

ご芧のずおり、actions-toolkitがありたす。 それはそれ自䜓が行動ではありたせん。 これは、すべおの操䜜に䜿甚しおいるラむブラリにすぎたせん。 これは、ビルドツヌルに関するいく぀かのナヌティリティず共通のロゞックを提䟛したす。 これは、必芁に応じお䜿甚できる最小限のラッパヌであり、私たちがそれらず察話するのを容易にするAPIです。 そしおもちろん、このツヌルキットは、今日の私たちのすべおの行動によっお消費されたす。

基本的なワヌクフロヌ

基本的なワヌクフロヌを芋おみたしょう。 たず、このワヌクフロヌはワヌクフロヌ ディスパッチ むベントでトリガヌされたす。 手動で呌び出されるだけで、リポゞトリに移動するだけで枈みたす。 このワヌクフロヌは、特定のむベントなしで手動で構成し、これには 2 ぀の公匏アクションが䜿甚されたす。 login-action ず build-push-action がありたす。 したがっお、login-actionはDocker Hubでそこにログむンしたす。 その埌、build-push-action を䜿甚しおむメヌゞにタグを付け、むメヌゞをプッシュできたす。 だから、これは本圓に簡単です。 私は埌でマルチプラットフォヌムに぀いお話したいので、このようなプロゞェクトを持぀のは簡単なので、単玔なGoプロゞェクトを䜿甚しおいたす。 これは単玔なWebサヌバヌです。 その背埌には掟手なものは䜕もありたせん。

ビルドを実行する

このビルドを実行しおみたしょう。 実際にこれを実際に芋るためにラむブデモを行いたかったのですが、このプレれンテヌションのスクリヌンショットになりたす。 ご芧の通り、玄 24 秒かかりたした。 䜕かを構築するのは悪くありたせんが、実際にキャッシュを掻甚するず、はるかにうたくいくこずができたす。 したがっお、そこにビルドログを芋るず、このステヌゞがキャッシュされおいないこずがわかりたす。 このワヌクフロヌを実行するたびに実行されたす。 このステヌゞは実行され、キャッシュされる制限はありたせん。 したがっお、これにキャッシングを掻甚できたす。

キャッシュの最適化

キャッシュを䜿甚しおワヌクフロヌをより適切に最適化できたす。 たず、キャッシュを゚クスポヌトするためのキャッシュ実装の芳点から、BuildKitが提䟛するものを確認できたす。 今日、ビルドキットで利甚できる倚くのバック゚ンドがありたす。 ご存知のように、BuildKitは、ビルドを行うず、ビルド結果を自動的に独自の内郚キャッシュにキャッシュしたす。 しかし、GitHubランナヌがよく知っおいるように、このキャッシュは存圚せず、氞続化されおいたせん。 BuildKitの考え方は、ビルドキャッシュを倖郚の堎所に゚クスポヌトし、将来のビルドでむンポヌトできるようにするこずです。 したがっお、実行の間には、次のキャッシュバック゚ンドが利甚可胜ですが、今日䜿甚するものもありたす。

これは、GitHub APIを䜿甚しおいるGHA1、GitHub Action1 です。 基本的には公匏のGitHubキャッシュアクションず同じです。 これは同じ皮類のAPIを䜿甚しおいたす。 ワヌクフロヌでこのキャッシュを有効にするには、䞀連の buildx アクションを远加するだけです。 この䞀連の buildx アクションは、珟圚利甚可胜なすべおの BuildKit 機胜を掻甚するためのコンテナビルダヌを䜜成したす。 そのため、Docker゚ンゞン内に埋め蟌たれたBuildKitでは珟圚利甚できないBuildKitの最新のテヌブルを䜿甚しおいたす。

これで、キャッシュ呜什を蚭定しお、「このキャッシュを䜿甚したい」ず蚀うこずができたす。 このキャッシュをGHAに゚クスポヌトするようにプッシュしたす。 このキャッシュは、GitHub Actionsバック゚ンドからも読み取るこずができたす。 したがっお、このコヌドをビルドするず、このキャッシュはキャッシュメタデヌタずレむダヌの䞡方を GitHub キャッシュサヌビスに保存したす。 これは、内郚的には Azure Blob ストレヌゞです。 その䞊、圌らは独自のAPIを持っおおり、これはもちろん公匏のGitHub Actionsで䜿甚されおいるのず同じバック゚ンドです。

このプロゞェクトをビルドする堎合、新しいオプションでどのように機胜するかを芋おみたしょう。 ご芧のずおり、キャッシュを蚭定しおから8秒かかるため、これははるかに優れおいたす。 ビルド時間を 67%節玄したので、これはかなり玠晎らしいこずです。 ログを芋るず、ビルドステヌゞからの呜什がキャッシュされおいるこずがわかりたす。 GitHub キャッシュ バック゚ンドず GitHub Actions を䜿甚するず、この CI を䜿甚するずきに珟圚䜿甚できる最も簡単なリモヌト キャッシュです。 別の CI プロバむダヌを䜿甚しおいる堎合は、たずえば、S3 バック゚ンド、AZ BLOB バック゚ンド、たたは必芁に応じお別のストレヌゞバック゚ンドを䜿甚できたす。 ただし、認蚌レむダヌが必芁です。 このようなものが必芁です。 GitHub Actions を䜿甚するず、これをすぐに利甚できるため、他に䜕も必芁ありたせん。

先に進む前に、キャッシュずGitHub Actionに぀いお泚意しなければならないこずがありたす。 キャッシュには、リポゞトリ党䜓で共有される 10 ギガバむトのサむズ制限がありたす。 そのため、GitHubはキャッシュを保存したすが、サむズを超えるずキャッシュの削陀を開始したす。 キャッシュをリサむクルするず、党䜓的に実行時間が遅くなる可胜性があるため、泚意が必芁です。 ゚クスポヌトする必芁があるものは、デフォルトでは、Dockerファむルの最埌のステヌゞを゚クスポヌトするだけです。 しかし、䟋えば mode=max のようにすべおを゚クスポヌトしたい堎合は、これに泚意する必芁がありたす。

スコヌプキヌがありたす。 したがっお、スコヌプ キヌはデフォルトで BuildKit ずいう名前になっおいるため、これがキャッシュが属するキヌです。 たずえば、モノラルリポゞトリに倚くのプロゞェクトが含たれおいる堎合に䟿利です。 たずえば、このキャッシュをfooに、他のキャッシュをbarに配眮しお、䞀緒に子にならないようにしたいず蚀うこずができたす。たた、モノリポゞトリを䜿甚しお耇数のプロゞェクトに制限するこずもできたす。 デフォルトでは、今日の BuildKit は GitHub Actions キャッシュ内のキャッシュ マりントを゚クスポヌトしたせん。 これを行う堎合は、この GitHub Actions を䜿甚しお回避策があるため、キャッシュ マりントを゚クスポヌトできたす。

マルチプラットフォヌムビルド

次に、マルチプラットフォヌムビルドに぀いお少しお話ししたしょう。 ご存知のように、Dockerむメヌゞは耇数のプラットフォヌムをサポヌトしおいるため、1぀のむメヌゞに耇数のバリアントずOS䞊の耇数のプラットフォヌムを含めるこずができたす。 これは特にCIで人気のあるトレンドなので、今日はこれをお芋せしたいず思いたす。

マルチプラットフォヌムビルドを行うには、基本的には単䞀の入力を提䟛するだけです。 この堎合、私はただx96、Armビルドが欲しいず蚀いたす。 これを行うには、これを指定するだけで、堎合によっおは、Dockerfileの蚘述方法に倧きく䟝存したす。 したがっお、゚ミュレヌタヌもむンストヌルする必芁があり、そのために、私たちが提䟛するセットアップQEMUアクションを䜿甚するこずもできたす。 それはあなたのビルドの゚ミュレヌタをむンストヌルするだけです。 ご芧のずおりにこのビルドを実行するず、はい、3分ですが、これは良くありたせん

远加のプラットフォヌムを構築するだけでも倧倉なこずですが、アむデアはありたすか? 誰かがなぜそんなに時間がかかるのか考えおいたすか? いいえ。たぶん、わかりたした、私自身も考えを持っおいるので、ログが答えをくれるかもしれたせん。 芋おみたしょう。 だから、はい、私たちは犯人を芋぀けたず思いたす。 ご芧のずおり、Arm の 1 ぀はこのプロゞェクトのビルドだけで玄 3 分かかり、もう 1 ぀は 30 秒かかりたす。 ですから、はい、これが問題です。 ゚ミュレヌションは有眪です。 基本的に、ご存知かもしれたせんが、Gitむベントむンフラストラクチャでは、Ubuntuの最新のランナヌはx96 アヌキテクチャです。 したがっお、Armビルドを行うずきは、゚ミュレヌションのみを䜿甚したす。 たた、゚ミュレヌションはビルドを行う際の倧きなペナルティであるため、非垞に時間がかかりたす。 では、どうすればこれを解決できるのでしょうか? この問題を解決するには2぀の解決策があり、これから芋おいくのは、゚ミュレヌションを䜿甚しおこのペナルティを取り陀くためにDockerfileでクロスコンパむルを䜿甚する方法です。

たず、Dockerfileに戻りたしょう。 ログで確認したように、ビルド状態はそれぞれのプラットフォヌムに察しおビルドされたす。 そしおこの堎合、Goでクロスコンパむルを䜿甚するのは非垞に簡単です。 䞀連の倉数を枡すだけで、タヌゲットアヌキテクチャを䜿甚するこずができたす。 Dockerfile のグロヌバル スコヌプで匕数を提䟛したす。 したがっお、フロント゚ンドでは、この匕数のセットを䜿甚するず、特定のタヌゲットが䜿甚されたす。 この堎合、クロスコンパむルを䜿甚しお、ネむティブプラットフォヌムを䜿甚しおビルドを行い、タヌゲット匕数を䜿甚しおGoコンパむラでクロスコンパむルを行いたす。

しかし、これを掚枬するにはどうすればよいでしょうか? そのために、Dockerfileでダッシュダッシュプラットフォヌムを䜿甚できるため、ビルドプラットフォヌムに厳密になりたす。 これはビルドが実行される堎所であり、タヌゲットOSずタヌゲットアヌキテクチャを指定できたす。 その埌、GOOS ず GOARCH を指定できるため、定矩するタヌゲット プラットフォヌムず䞀臎したす。 さお、ビルドなので、どれくらいの時間がかかるかを確認する必芁がありたす。 今は 47 秒です。そのほうがいいです。 これは、クロスコンパむルを䜿甚しおいるためです。

ここでログを芋るず、AMD 64 ずArmの 64 が同時にかかっおいるこずがわかりたす。 そこにはただいく぀かのペナルティがありたす。 以前のこずを思い出すず、玄 24 秒かかりたした。同じランナヌで 2 ぀のビルドが発生しおいるため、 31 秒かかりたす。 したがっお、同じむンスタンスに 2 ぀のビルドがありたす。 たずえば、このビルドを耇数のランナヌに分散しおペナルティを枛らし、埌で結果をマヌゞできるようにするこずができたす。 しかし、それは埌で芋るこずになりたす。 もちろん、クロスコンパむルはプログラミング蚀語によっおは適切でない堎合があるこずに留意しおください。 たずえば、Goを䜿甚するず、それは非垞に簡単です。 Rustを䜿甚するず、それも簡単になりたす。 しかし、これができる堎合、䜿甚できる唯䞀の実行可胜な゜リュヌションは、ARM䞊にネむティブノヌドを持぀こずです。 AMDにはネむティブノヌドがあり、たずえば 64、それぞれに基づいお構築できたすが、ワヌクフロヌでより高床なセットアップが必芁です。 したがっお、これにはいく぀かの制玄がありたす。

むメヌゞタグを管理する

マルチプラットフォヌムビルドの方法を芋おきたので、むメヌゞをプッシュするずきにむメヌゞタグをレベルで管理する方法を確認できたす。 少し耇雑になるかもしれたせん。 CIでは、それがよく芋られたす。 GitHub Actionの冒頭には、リポゞトリに同様のタグがプッシュされおいるかどうかに応じお、プッシュするタグのリストを指定するためだけに、倧きなスクリプトのチャンクを持぀こずができるこずがわかりたす。 たたは、たずえば゚ッゞリリヌスを䜿甚する堎合、mainに䜕かがあり、これで条件を抜出するためにブランチの名前をプッシュしたいず蚀うでしょう。 だから、これはちょっずした苊痛です。 手間を省くために、ワヌクフロヌのタグずレベルの䜜成を自動化できるGitHub Actionを開発したした。

芋おみたしょう。 メタデヌタアクションを䜿甚しおビルドする前に、抜出ステップを定矩する必芁がありたす。 したがっお、画像入力のみが必芁です。 この堎合は、リポゞトリです。 これは単玔なリポゞトリです。 GHCRにプッシュしたい堎合は倚くのむメヌゞを䜿甚でき、同時にDocker Hubも定矩できたす。 専甚のタグがある堎合は、その埌にbuild-push-actionに適甚する必芁があるレベルのタグが生成されたす。 この堎合、前の手順の入力でタグを蚭定したした。 たずえば、メむンブランチにプッシュするず、このタグのリストが生成されたす。 したがっお、mainず呌ばれるものは1぀だけあり、自動的に生成されるOCI圢匏の仕様ラベルのリストもありたす。 この皮のこずをオプトアりトする方法はありたせんが、ご芧のずおり、説明がありたす。 これは GitHub API から取埗されたす。 これはリポゞトリの説明です。 たた、取埗されおそこに配眮されおいるリポゞトリのタむトルもあるため、この皮のアクションを䜿甚しおむメヌゞに䜕が含たれおいるかを远跡できたす。 これはかなり䟿利だず思いたす。 たずえば、コンテナ・むメヌゞにむメヌゞのREADMEが衚瀺されるず、OCIラベルが利甚され、たずえば、READMEに意味のある情報が衚瀺されたす。

そしお、v1 タグを抌すず、v1.0。0、最新の v1を生成したす。0。0 も同様です。 少しわかりにくいかもしれたせんが、内郚で䜕が起こっおいるのかを説明したしょう。 この皮のカスタマむズされたタグを䜿甚するず、アクションがどのように元に戻すのか疑問に思うかもしれたせん。 デフォルトでは、tags 入力を指定しない堎合、デフォルト倀は type=schedule ず type=ref で、event=branch タグたたは PR が指定されたす。 したがっお、type=scheduleは、ワヌクフロヌにのみスケゞュヌルむベントがある堎合に䜿甚され、名前をタグ付けしたす。 タグにはデフォルトで適切な名前が付けられ、Git 参照の䞋の ref はブランチず同様に、リク゚ストのタグにもなりたす。 特定のナヌスケヌスには他にもルヌルがあり、たずえば、Git フロヌの䞀般的なパタヌンは、同様のタグをプッシュしおプロゞェクトをリリヌスするこずです。

私たちの堎合、画像タグず最新のタグを蚭定するだけでなく、メゞャヌ/マむナヌのようなものが必芁な堎合もあれば、メゞャヌのみが必芁な堎合もありたす。 これを行うには、タグに適甚するルヌルを指定する必芁がありたす。 この堎合、たずえば、フルバヌゞョンが欲しいず蚀いたすが、䞀郚のナヌザヌはパッチを気にせず、むメヌゞでメゞャヌマむナヌのみを䜿甚するため、メゞャヌ/マむナヌも蚭定しおほしいず蚀いたす。 したがっお、この堎合、type=semverタグの呚りでは、たずえば、v1を抌すず生成されたす。0。0、それは蚀うでしょう、私は 1を持っおいたす。0。0, 私はv1を持っおいたす。0、 ず latest、およびコミット SHA が蚭定された SHA。

これは自動的に生成されたす。 気にする必芁はない。 それはあなたのためにこれを蚭定したす。 たずえば、プルリク゚ストの堎合は Snd が生成され、この堎合は PR196が生成され、SHA の堎合も同様です。 これは䜕かを抌すたびに蚭定されおいるので、これはかなり䟿利です。 他にもケヌスがありたす。 Pythonずバヌゞョン管理に固有のものがありたす。 たた、゚ッゞケヌスに䜿甚されおいる他のものもあり、䟋えば、プレフィックスサフィックスの䞋にようなフレヌバヌを入れたいずしたす。 䟋えば、AlpineバヌゞョンのむメヌゞやDebianバヌゞョンが必芁だずしたしょう。 Debianなどのプレフィックスを付けるこずができたす。 だから、倚くのルヌルがありたす。 リポゞトリには膚倧なドキュメントがありたすので、ご芧ください。

焌く

Bakeの話をしたいのですが、ご芧の通りワヌクフロヌはかなり巚倧で、このワヌクフロヌのサむズを倧幅に瞮小したいず思いたす。 ベむクはこれを助けおくれたす。 始める前に、Bakeが䜕であるかわからないかもしれないので、buildコマンドでルヌトに戻りたす。 ご存知のように、今日のビルドコマンドでこのようなものを持぀こずができたす。

かなり倧きいです。 buildコマンドには倚くのフラグが甚意されおおり、これをロヌカル環境からCIに移怍するず、コピヌペヌストが必芁になる可胜性があるため、この皮のこずを単玔化したいず考えおいたす。 䞡方を維持する必芁があるので、それは玠晎らしいこずではありたせん。 あなたのワヌクフロヌでは、おそらく、ロヌカルコマンドをビルドプッシュアクション内の入力に移怍する必芁があるため、このようなものがあるでしょう。 これは非垞に倧きいです。 それは理想的ではありたせん。 私たちは䞡方を維持する必芁がありたす。 嫌です。 たた、プロゞェクトをビルドするためには、コントリビュヌティングノヌトのドキュメントを曎新する必芁がありたすので、それはあたり良くありたせん。 Bake を䜿えば、代わりにこのようなこずができたす。 ですから、䟋えば、このプッシュフラグを定矩するだけで、䜕かを䜜りたい、䜕かを䜜りたい、それをプッシュしたい、ずいうフラグを定矩する必芁がありたす。

そこで、先に進む前に、たずベむクの定矩ずは䜕かに぀いおお話ししたいず思いたす。 これがBakeを䜿甚するための出発点です。 したがっお、Bakeでは、ナヌザヌがプロゞェクト、特に定矩ファむルを䜿甚しお誰でも簡単に呌び出すこずができる再利甚可胜なビルドフロヌを定矩できるようにしたいず考えおいたす。 したがっお、この定矩ファむルは、HCLファむル、JSONファむル、たたはComposeファむルである可胜性がありたす。 耇数のファむルを指定でき、もちろん、それらは特定の順序でメッシュ化され、䜕も指定しない堎合はデフォルトでこれらになりたす。 ぀たり、Compose自䜓のように芋え、bakeコマンドを実行する堎所で利甚可胜なデフォルトのファむルを調べたした。

ご芧の通り、私はHCLの隣に小さなハヌトを掲げおいたす、なぜなら、それがこの講挔で私が話すこずだからです。 HCLはこの皮のこずに察しお非垞に匷力です。 したがっお、HCL圢匏は、Terraformのようなブロック定矩を介しおサポヌトしたす。 それはほずんど同じこずです。 倉数をビルド匕数ずしお䜿甚するこずも、Dockerfile が Bake ファむルの属性倀で倉数を補間するこずもできたす。 䞀般的な玔粋な事埌関数のセットもありたす。 go-cty で利甚可胜な任意の関数を䜿甚できたすが、独自のナヌザヌ定矩関数を䜿甚するこずもできたす。

HCL 定矩の䟋を芋おみたしょう。 これは芋た目なので、基本的にカスタムビルドグルヌプのサポヌトが远加されたす。 ご芧のずおり、異なるタヌゲット グルヌプを䜿甚しおプロゞェクト党䜓でコヌドを再利甚する方が適切です。 タヌゲットは、たずえば、むメヌゞ、むメヌゞ all があり、グルヌプで Docker ビルド コマンドに指定するのず同じオプションを持぀ 1 ぀の Docker ビルド呌び出しを反映しおいるこずがわかりたす。

ご芧のずおり、defaultず呌ばれるものは、targetオプションを䜿甚しおタヌゲットのリストを指定できたす。 タヌゲットは、inherit オプションをタヌゲットのリストに蚭定するこずで、ビルド オプションを継承するこずもできたす。 たずえば、画像はすべお画像の1぀から継承されるため、画像のオプションから継承できたす。 これは、Terraformず非垞によく䌌おおり、倉数を定矩する方法を提䟛しおいたす。 したがっお、HCLファむル圢匏は、タグ付きのこのような倉数ブロック定矩もサポヌトしおいたす。 たた、珟圚の環境によっお提䟛される倀を持぀倉数を定矩するためにも䜿甚できたす。 したがっお、環境倉数を䜿甚するず、この倀は倉数倉数に眮き換えられたす。

次に、たずえば、むメヌゞをすべおタヌゲットにビルドしたいず思いたす。 私はただむメヌゞを定矩する必芁がありたす すべおのDocker buildx bake image all、それだけです。 それはたさに私が望むものを構築したす。 これは、内郚ルヌプを効率化し、他の環境に掻甚するのに非垞に䟿利です。

簡単なものを芋おみたしょう—前のものは巚倧なものでした。 参照がどのように行われおいるかを倧たかに確認できたす。 それでは、基本的なワヌクフロヌに戻りたしょう。 私たちは始たりであり、Bakeの定矩ずワヌクフロヌにいたす。 ここでは、ベむクアクションだけを䜿甚する必芁がありたす。 そのため、Bake にもアクションがありたすが、これはタグの䞋にはたったくありたせん。 プッシュを䜿甚するだけで、デフォルトでは、そこに衚瀺されおいる画像名が䜿甚されたす crazymax.com。 ハッシュタグ、この画像を蚭定したす。

これを芋おきたので、アクションの内郚に衚瀺される正芏衚珟もあるので、䜕が起こっおいるのか、䜕が考慮されおいるのか、䟋えば倉数が枡されおいるのかがわかりたす。 そのため、ビルドプッシュ、ベむクアクションの内郚で確認できるため、ダッシュダッシュプリントタグを䜿甚しお正芏衚珟を瀺しおいたす。

今、ベむクに぀いお秘密を亀えおお話ししたいず思いたす。 CIに関する悪い慣行が倚すぎお、機密情報や資栌情報を枡すためにビルド匕数を䜿甚しおいる人を芋かけたす。 だから、それは時々画像自䜓の䞭にあるかもしれないので、良くありたせん。 ただ、ビルド時ではありたせん。 したがっお、このような堎合は、ビルド時にシヌクレットを䜿甚する必芁がありたす。 シヌクレットはそれを䜿甚する簡単な方法です。

先に進む前に、プロゞェクトをテストするためにDockerfileに新しいステヌゞを远加したいず思いたすが、Bake定矩内に新しいタヌゲットを远加するこずもできたす。 そしお、その盎前に、ビルドずプッシュの前に、このプロゞェクトをテストしたいのです。 しかし、問題がありたす。 テストには GitHub API ぞのアクセスが必芁であるこずを知っおいたす。それ以倖の堎合はスキップされたす。

どういうわけか、このワヌクフロヌにGitHubトヌクンを枡す必芁がありたす。 どうすればよいですか? これにはビルド時のシヌクレットを远加できたす。 基本的に、これは私のベむクの定矩では、公開したい秘密を定矩するだけです。 だから私は環境倉数name github tokenを䜿甚しおシヌクレット名ghトヌクンを公開したいず思いたす。 これは、secret フラグを䜿甚する堎合ず同じで、build コマンドでも䜿甚したす。 䜕も倉わらない。 たた、Dockerfileを知っおいるず、テストを実行するずきにこれらのシヌクレットを移動できたす。 たた、この環境倉数githubトヌクンは、テスト内で䜿甚されるものも䜿甚できたす。 最埌に、ワヌクフロヌでは、提䟛された GitHub トヌクン シヌクレットを䜿甚しお GitHub トヌクンを蚭定したす。 だからそれは通過し、それからそれは私のコンテナ内で盎接䜿甚するこずができたす。 だから、これはかなり䟿利です。 これは、この実行呜什でのみ䜿甚されるため、安党です。 最終的な画像には含たれたせん。 この画像をプッシュしたいずきは、このステヌゞのみに䜿甚されたす。

コンテナベヌスのワヌクフロヌ

このこずを念頭に眮いお、CIでコンテナを䜿甚するこずの倧きな可胜性を探り、内郚ルヌプずCI環境間の移怍性を向䞊させる方法を探るこずができたす。 コンテナを䜿甚するず移怍性が向䞊するため、コンテナを䜿甚するずいう考え方です。 そしお、䟋えば、新しいタヌゲットを远加するず - これを lint ず呌ぶこずにしたす - そのため、私のバック ファむルは巚倧になり始めたすが、これは䟿利です。 将来必芁に応じおこれを再利甚し、Dockerfileにもlintステヌゞを䜜成できたす。 そしお、それは私のコヌドが倧䞈倫かどうかを確認するためにgolang CI lintを実行するだけです。 そしお、私の定矩では、ワヌクフロヌで、新しいlintステップを远加したす。

今、ログを芋るず、私のlintステヌゞが通過しおいるこずがわかりたす。 倧䞈倫なのに、䜕か倉なずころがありたす。 画像を゚クスポヌトするずいうものがありたすが、私はそれを望んでいたせん。 私はただ糞くずの郚分を動かしたいだけです。 ただし、デフォルトでは、ビルドコマンドを実行するず、ビルドを行うたびにむメヌゞがロヌカルストアに曞き蟌たれたす。 ただし、䜕も゚クスポヌトせずにビルドできたす。 これを行うには、このタヌゲットを回避しお、キャッシュのみの出力タむプのみを䜿甚できたす。 この出力タむプは、基本的にビルド結果を出力するのを砎棄したすが、この特定のタヌゲットのキャッシュを曞き蟌みたす。 テストのものに぀いおも同じこずをする必芁がありたす。 前にこれを忘れおいたので、テストするず、䜕も出力されたせん。 将来、テスト定矩を゚クスポヌトしお、コヌドをカットするなどに投皿したいずしたす。 ビルド結果を゚クスポヌトするこずもできたす。 したがっお、時間を無駄にしたくない堎合や、ステヌゞでテストを実行する以倖に䜕も出力する必芁がない堎合に䟿利です。

ご芧のずおり、共通のパタヌンがありたす。 䜕かを远加するたびに、ワヌクフロヌに新しいステップが远加されたす。 そのため、ワヌクフロヌは非垞に倧きくなる可胜性がありたす。 この堎合、毎回新しいステップが必芁です。 たずえば、ここでは、テストず lint をグルヌプ化できたす。これは、この手順の目的がコヌドの怜蚌であるためです。 今できるこずは、それらを削陀するかメッシュ化しお、怜蚌するものだけを甚意し、怜蚌を呌び出すこずができるので、それを削陀するこずです。

ロヌカル環境の呚りではより抜象化されおいるため、ナヌザヌに通知したり、怜蚌を実行したりするこずができたす。 それはあなたのためにすべおを行いたす。 指瀺したり、テストを実行したり、lintを実行したり、他の䜕かを実行する必芁はないので、怜蚌するだけで終わりです。 もちろん、BuildKitのおかげで䞊列に実行されるため、makeファむルのような制埡はありたせん。 この堎合、䞊列に実行されたす。 正芏の衚珟でもわかるように、䞡方を呌び出すこずがわかりたす。

このツヌルのこのセクションにゞャンプしたくなかったのですが、それは面癜いかもしれないず思いたす。 以前は、テストずリントの郚分に぀いおは、同じランナヌ䞊で動䜜するず蚀っおいたした。 これは䟿利ですが、たずえば、テストがリ゜ヌスの制玄になるこずがわかっおいる堎合 (CPU や RAM を䜿いすぎる堎合) で、これをランナヌ間で分割しお GitHub ワヌクフロヌを利甚したい堎合などです。 これを解決するには、タヌゲットのグルヌプを分散させるこずができるので、怜蚌タヌゲットがありたすが、これをランナヌ党䜓に分散したいので、同じゞョブの䞀郚ではなく、実際には2぀のゞョブに分散したす。 これを解決するために、同じ倧きなグルヌプを維持しながら、グルヌプタヌゲットず耇数のランナヌを分散させるこずができたす。 したがっお、ロヌカルフロヌは同じたたで、ワヌクフロヌ内で少し倉曎するだけです。 そのため、行列を動的に蚭定するためのGitHubアクションのパタヌンがありたす。

それは少し䞍可解です。 今埌はベむクアクションを䜿甚しおこれを䜿甚したいので、これを行う必芁はありたせん。 自動的に呌び出される耇数のランナヌを䜜成したす。 それが䜕をするか、この堎合、ご芧のずおり、validateグルヌプでbakeコマンドを䜿甚したす。 このグルヌプで䜿甚可胜なタヌゲットのリストを印刷し、この準備されたゞョブの特定のタヌゲット出力内に配眮し、その埌、タヌゲット倀を含むマトリックスを䜿甚できたす。 これは、䜿甚可胜なタヌゲット(testずlint)のリストであるため、各ランナヌで䞡方の怜蚌が実行されたす。 したがっお、1぀のランナヌでテストし、別のランナヌでリントしたす。

これをより適切に衚珟するのは、test ず lint の䞡方を䞊行しお実行する単䞀の怜蚌を远加する前ですが、珟圚はランナヌ間で分割されおいるため、時間がかかりたせん。 繰り返しになりたすが、 57 秒ではなく、各ランを独自のランナヌで実行するためです。 ぀たり、これはビルドを配垃する方法です。 ドキュメントには、YouTube プラットフォヌム むメヌゞのビルドを配垃する䟋がありたす。 たずえば、5぀のプラットフォヌムを5぀のランナヌに分散させるず、同じランナヌでこれを行うずリ゜ヌスを倧量に消費する可胜性があるため、これを分割するこずができたす。 たた、別のナヌスケヌスずしお、倚くの人がレゞストリにむメヌゞをプッシュするための䜕かを構築したす。 これは倚くの人がやっおいるこずですが、私たちもバむナリを入れお、このバむナリをプッシュしおリリヌスなどを埗たいず思っおいたす。 したがっお、実際にはBuildKitを䜿甚しおこれを行うこずができたす。 出力を倉曎しお、レゞストリではなく出力したいが、クラむアントでロヌカルに出力したいず蚀うだけです。 この堎合、バむナリず呌ばれるステヌゞからバむナリがロヌカル ファむル /bin に出力されたす。 そこで、専甚のワヌクフロヌを䜜成したす。 このワヌクフロヌは、タグがプッシュされたずきにトリガヌされ、その埌、このバむナリが完了したずきに、GitHubリリヌスを䜜成しおこのバむナリをプッシュしたす。

これは、たずえば、耇数のプラットフォヌムがあるなど、他のナヌスケヌスで行うこずができたす。 この堎合も同じこずができるので、マルチプラットフォヌムビルドを実行し、すべおのバむナリを抜出しお、GitHubリリヌス内に盎接プッシュできたす。 したがっお、最終的なアクションを䜿甚する必芁がありたす。 このセクションでも、Dockerfile自䜓の䞭に入れるこずもできたすが、GitHub APIず通信する必芁があるため、より倚くの䜜業が必芁になりたす。 これは、すでに利甚可胜なGitHubアクションを䜿甚するずいう簡単なものです。

結論

今日、私たちは䜕を芋たしたか? キャッシュ゚クスポヌタヌを䜿甚し、タグを自動化するためのさたざたなアヌキテクチャパむプラむン戊略を䜿甚しお効率的なむメヌゞを䜜成する方法を䜿甚したした。 私たちは、ワヌクフロヌを簡玠化し、CIのオヌバヌラむドを枛らすために、Bakeずビルドシヌクレットを䜿甚しお、Bakeに぀いお倚くのこずを話したした。 たた、ロヌカル環境ずCI環境間の移怍性を向䞊させるためだけにコンテナを䜿甚する方法も説明したす。

最埌に、コンテナを䜿ったプロゞェクトがいく぀かありたす。 たずえば、buildx がありたす。 もちろん、この皮のパタヌンを䜿甚するず、クロスコンパむル、ベンダヌの曎新、ベンダヌのチェックなど、倚くのこずを行うこずができたす。 糞くずもありたす。 新しいパタヌンを䜿甚し、メトリックを䜿甚しお、倚くのこずができたす。 Bake 内にはいく぀かのメトリクスもありたす。 このプレれンテヌションでは取り䞊げたせんでしたが、これに぀いおは玠晎らしい資料がありたす。 したがっお、今日シフトしたGitHubアクションは、Bake自䜓の内郚で同じものをシフトできたす。 これは䟿利なこずであり、このプロゞェクト内でこれを行っおいたす。 ずいうわけで、これだけです。 ありがずうございたす。

さらに詳しく