Docker Compose v2 の統一導入
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_hosted と test_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 上での挙動が一貫します。