Docker Compose v2 の統一導入

rails/buildkite-config

Docker Compose v2 の CLI を全ビルド環境で使用するよう、README とビルド設定を更新しました。これにより、Docker Compose のバージョン管理が簡素化され、CI 上での動作検証が統一されます。

背景

Docker Compose v1 から v2 への移行 が未完了だった理由は、既存の Runner が v1 で動作しているかどうかが不明だったためです。PR の説明でも「CI に聞いてみよう」と示唆されているように、実際にビルド環境で v2 が利用可能かを確認する意図があります。ドキュメントと設定を合わせて更新することで、将来的なバージョンロックを防ぎます。

技術的な変更

README のコマンド記述が v2 形式に置き換えられました。 具体的には docker-compose -f … から docker compose -f … へ変更し、ビルドと実行の例をすべて更新しています。

@@ -193,7 +193,7 @@ We'll use a Ruby version 3.3 image for the base.

-RUBY_IMAGE="ruby:3.3" docker-compose -f .buildkite/docker-compose.yml build base
+RUBY_IMAGE="ruby:3.3" docker compose -f .buildkite/docker-compose.yml build base

@@ -205,7 +205,7 @@ For example, if we wanted to run the Active Record tests for SQLite3.

-IMAGE_NAME=buildkite-base RUBY_IMAGE=ruby:3.3 docker-compose -f .buildkite/docker-compose.yml run default runner activerecord 'rake sqlite3:test'
+IMAGE_NAME=buildkite-base RUBY_IMAGE=ruby:3.3 docker compose -f .buildkite/docker-compose.yml run default runner activerecord 'rake sqlite3:test'

lib/buildkite/config/rake_command.rb のロジックが簡素化されました。 self_hosted? 判定で cli-version に "1" を設定していた部分が削除され、プラグイン呼び出しは常にデフォルト(v2)を前提にしています。

@@ -63,10 +63,6 @@ def install_plugins(service = "default", env = nil, dir = ".", build_context:)
           "tty" => "true",
         }

-        if build_context.self_hosted?
-          compose_opts["cli-version"] = "1"
-        end
-
         plugin :docker_compose, compose_opts.compact
       end
     end

テストスイートが更新され、バージョン固有のケースが削除されました。 test_compose_hostedtest_compose_self_hosted が廃止され、汎用的な test_compose のみが残ります。テスト本体も ENV["BUILDKITE_COMPUTE_TYPE"] の設定や cli-version アサーションが無くなり、期待通り v2 のプラグイン構成が生成されることだけを検証しています。

@@ -191,10 +191,7 @@ def test_artifacts
     assert_equal ".buildkite.tgz", download["compressed"]
   end

-  def test_compose_hosted
-    @before_env_compute_type = ENV["BUILDKITE_COMPUTE_TYPE"]
-    ENV["BUILDKITE_COMPUTE_TYPE"] = "hosted"
-
+  def test_compose
     pipeline = PipelineFixture.new do
       build_context.ruby = Buildkite::Config::RubyConfig.new(prefix: "ruby:", version: Gem::Version.new("3.2"))
       use Buildkite::Config::RakeCommand
@@ -221,43 +218,6 @@ def test_compose_hosted
     assert_equal "true", compose["tty"]
     assert_equal ".buildkite/docker-compose.yml", compose["config"]
     assert_equal ["runner", "test"], compose["shell"]
-  ensure
-    ENV["BUILDKITE_COMPUTE_TYPE"] = @before_env_compute_type
-  end
-
-  def test_compose_self_hosted
-    @before_env_compute_type = ENV["BUILDKITE_COMPUTE_TYPE"]
-    ENV["BUILDKITE_COMPUTE_TYPE"] = "self-hosted"
-
-    pipeline = PipelineFixture.new do
-      build_context.ruby = Buildkite::Config::RubyConfig.new(prefix: "ruby:", version: Gem::Version.new("3.2"))
-      use Buildkite::Config::RakeCommand
-
-      build_context.stub(:rails_version, Gem::Version.new("7.1")) do
-        rake "test", task: "test:all"
-      end
-    end
-
-    plugins = pipeline.to_h["steps"][0]["plugins"]
-
-    compose = plugins.find { |plugin|
-      plugin.key?(plugins_map[:compose])
-    }.fetch(plugins_map[:compose])
-
-    %w[env run cli-version config shell tty].each do |key|
-      assert_includes compose, key
-    end
-
-    assert_includes compose["env"], "PRE_STEPS"
-    assert_includes compose["env"], "RACK"
-
-    assert_equal "default", compose["run"]
-    assert_equal "1", compose["cli-version"]
-    assert_equal "true", compose["tty"]
-    assert_equal ".buildkite/docker-compose.yml", compose["config"]

設計判断

バージョン固有の条件分岐を撤廃し、Docker Compose v2 を唯一の前提とした設計 が採用されました。cli-version オプションは v1 用にのみ設定されていましたが、削除することでコードパスが一本化され、設定ミスや環境差異による不具合リスクが低減します。README の更新とテスト簡素化は、同一 CLI を前提とした一貫性のあるドキュメントと検証を実現します。

まとめ

本 PR は Docker Compose v2 を全ビルド環境で使用するよう統一し、README と内部実装・テストをシンプルに整理しました。バージョン依存のロジックが除去されたことで、将来のメンテナンス負荷が軽減され、CI 上での挙動が一貫します。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
299d0b06

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的な変更、設計判断、まとめの5セクションが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは正しい diff ハイライトで記載されていますが、PR リンクが "[PR #184](URL)" となっており、要求された "[#184](URL)" 形式と完全には一致していません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門的なエンジニア向けの記述で、余計な初心者向け解説はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションの冒頭がトピックセンテンスで始まり、1段落1トピックが保たれ、段落は適切な長さで空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内の diff コードブロックは提供された Diff と完全に一致し、ファイル名や変更箇所も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

Docker Compose、CLI、v1/v2 などの用語は PR 内容と合致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な変更や設計判断の説明は Diff と PR の記述に根拠があり、誤りはありません。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張は PR 内容や Diff で裏付けられており、推測や捏造は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #184、Ruby バージョン 3.3 などの数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR タイトル "Use Docker Compose v2 everywhere" の意味を正しく日本語化しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

外部のバージョンサポート情報やリリース日程などは一切記載されていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現は使用されておらず、PR と食い違う表現もありません。