diff --git a/lib/kamal/commands/builder.rb b/lib/kamal/commands/builder.rb index cd2980fbf..f784b6f98 100644 --- a/lib/kamal/commands/builder.rb +++ b/lib/kamal/commands/builder.rb @@ -2,7 +2,7 @@ class Kamal::Commands::Builder < Kamal::Commands::Base delegate :create, :remove, :push, :clean, :pull, :info, :inspect_builder, :validate_image, :first_mirror, to: :target - delegate :local?, :remote?, to: "config.builder" + delegate :local?, :remote?, :cloud?, to: "config.builder" include Clone @@ -17,6 +17,8 @@ def target else remote end + elsif cloud? + cloud else local end @@ -34,6 +36,10 @@ def hybrid @hybrid ||= Kamal::Commands::Builder::Hybrid.new(config) end + def cloud + @cloud ||= Kamal::Commands::Builder::Cloud.new(config) + end + def ensure_local_dependencies_installed if name.native? diff --git a/lib/kamal/commands/builder/cloud.rb b/lib/kamal/commands/builder/cloud.rb new file mode 100644 index 000000000..e2de0cbca --- /dev/null +++ b/lib/kamal/commands/builder/cloud.rb @@ -0,0 +1,8 @@ +class Kamal::Commands::Builder::Cloud < Kamal::Commands::Builder::Base + private + def builder_name + # Expected format: "cloud docker-org-name/builder-name" + docker_cloud_build_parts = driver.sub(/^cloud /, "").split("/") + "cloud-#{docker_cloud_build_parts[0]}-#{docker_cloud_build_parts[1]}" + end +end diff --git a/lib/kamal/configuration/builder.rb b/lib/kamal/configuration/builder.rb index 970c47d18..e7474ae60 100644 --- a/lib/kamal/configuration/builder.rb +++ b/lib/kamal/configuration/builder.rb @@ -53,6 +53,10 @@ def local? !local_disabled? && (arches.empty? || local_arches.any?) end + def cloud? + driver.start_with? "cloud" + end + def cached? !!builder_config["cache"] end @@ -137,7 +141,7 @@ def build_directory end def docker_driver? - driver == "docker" + driver == "docker" || driver == "cloud" end private diff --git a/lib/kamal/configuration/docs/builder.yml b/lib/kamal/configuration/docs/builder.yml index 230b39eef..ec215a6a9 100644 --- a/lib/kamal/configuration/docs/builder.yml +++ b/lib/kamal/configuration/docs/builder.yml @@ -102,6 +102,9 @@ builder: # # The build driver to use, defaults to `docker-container`: driver: docker + # + # If you want to use Docker Build Cloud (https://www.docker.com/products/build-cloud/), you can set the driver to: + driver: cloud org-name/builder-name # Provenance # diff --git a/test/commands/builder_test.rb b/test/commands/builder_test.rb index 85703f546..c5e23ea84 100644 --- a/test/commands/builder_test.rb +++ b/test/commands/builder_test.rb @@ -61,6 +61,14 @@ class CommandsBuilderTest < ActiveSupport::TestCase builder.push.join(" ") end + test "cloud builder" do + builder = new_builder_command(builder: { "arch" => [ "#{local_arch}" ], "driver" => "cloud docker-org-name/builder-name" }) + assert_equal "cloud", builder.name + assert_equal \ + "docker buildx build --push --platform linux/#{local_arch} --builder cloud-docker-org-name-builder-name -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile .", + builder.push.join(" ") + end + test "build args" do builder = new_builder_command(builder: { "args" => { "a" => 1, "b" => 2 } }) assert_equal \