diff --git a/lib/kamal/cli/build.rb b/lib/kamal/cli/build.rb index ac73d11d..c655c6ae 100644 --- a/lib/kamal/cli/build.rb +++ b/lib/kamal/cli/build.rb @@ -30,9 +30,18 @@ class Kamal::Cli::Build < Kamal::Cli::Base say "Building with uncommitted changes:\n #{uncommitted_changes}", :yellow end + # Get the command here to ensure the Dir.chdir doesn't interfere with it + push = KAMAL.builder.push + run_locally do begin - execute *KAMAL.builder.buildx_inspect + context_hosts = capture_with_info(*KAMAL.builder.context_hosts).split("\n") + + if context_hosts != KAMAL.builder.config_context_hosts + warn "Context hosts have changed, so re-creating builder, was: #{context_hosts.join(", ")}], now: #{KAMAL.builder.config_context_hosts.join(", ")}" + cli.remove + cli.create + end rescue SSHKit::Command::Failed => e if e.message =~ /(context not found|no builder|does not exist)/ warn "Missing compatible builder, so creating a new one first" @@ -42,9 +51,6 @@ class Kamal::Cli::Build < Kamal::Cli::Base end end - # Get the command here to ensure the Dir.chdir doesn't interfere with it - push = KAMAL.builder.push - KAMAL.with_verbosity(:debug) do Dir.chdir(KAMAL.config.builder.build_directory) { execute *push } end @@ -66,7 +72,7 @@ class Kamal::Cli::Build < Kamal::Cli::Base desc "create", "Create a build setup" def create - if (remote_host = KAMAL.config.builder.remote) + if (remote_host = KAMAL.config.builder.remote_host) connect_to_remote_host(remote_host) end diff --git a/lib/kamal/cli/templates/deploy.yml b/lib/kamal/cli/templates/deploy.yml index 119961b9..2602c66d 100644 --- a/lib/kamal/cli/templates/deploy.yml +++ b/lib/kamal/cli/templates/deploy.yml @@ -18,10 +18,6 @@ registry: password: - KAMAL_REGISTRY_PASSWORD -# Configure builder setup. -builder: - arch: amd64 - # Inject ENV variables into containers (secrets come from .env). # Remember to run `kamal env push` after making changes! # env: @@ -34,6 +30,16 @@ builder: # ssh: # user: app +# Configure builder setup. +# builder: +# args: +# RUBY_VERSION: 3.2.0 +# secrets: +# - GITHUB_TOKEN +# remote: +# arch: amd64 +# host: ssh://app@192.168.0.1 + # Use accessory services (secrets come from .env). # accessories: # db: diff --git a/lib/kamal/commands/builder.rb b/lib/kamal/commands/builder.rb index e69e3c2f..13c3d829 100644 --- a/lib/kamal/commands/builder.rb +++ b/lib/kamal/commands/builder.rb @@ -1,8 +1,8 @@ require "active_support/core_ext/string/filters" class Kamal::Commands::Builder < Kamal::Commands::Base - delegate :create, :remove, :push, :clean, :pull, :info, :buildx_inspect, :validate_image, :first_mirror, to: :target - delegate :local?, :remote?, to: "config.builder" + delegate :create, :remove, :push, :clean, :pull, :info, :context_hosts, :config_context_hosts, :validate_image, + :first_mirror, to: :target include Clone @@ -11,27 +11,43 @@ class Kamal::Commands::Builder < Kamal::Commands::Base end def target - if remote? - if local? - hybrid + if config.builder.multiarch? + if config.builder.remote? + if config.builder.local? + multiarch_remote + else + native_remote + end else - remote + multiarch end else - local + if config.builder.cached? + native_cached + else + native + end end end - def remote - @remote ||= Kamal::Commands::Builder::Remote.new(config) + def native + @native ||= Kamal::Commands::Builder::Native.new(config) end - def local - @local ||= Kamal::Commands::Builder::Local.new(config) + def native_cached + @native ||= Kamal::Commands::Builder::Native::Cached.new(config) end - def hybrid - @hybrid ||= Kamal::Commands::Builder::Hybrid.new(config) + def native_remote + @native ||= Kamal::Commands::Builder::Native::Remote.new(config) + end + + def multiarch + @multiarch ||= Kamal::Commands::Builder::Multiarch.new(config) + end + + def multiarch_remote + @multiarch_remote ||= Kamal::Commands::Builder::Multiarch::Remote.new(config) end diff --git a/lib/kamal/commands/builder/base.rb b/lib/kamal/commands/builder/base.rb index 027b26c2..cedfeadf 100644 --- a/lib/kamal/commands/builder/base.rb +++ b/lib/kamal/commands/builder/base.rb @@ -1,41 +1,20 @@ + class Kamal::Commands::Builder::Base < Kamal::Commands::Base class BuilderError < StandardError; end ENDPOINT_DOCKER_HOST_INSPECT = "'{{.Endpoints.docker.Host}}'" delegate :argumentize, to: Kamal::Utils - delegate \ - :args, :secrets, :dockerfile, :target, :arches, :local_arches, :remote_arches, :remote, - :cache_from, :cache_to, :ssh, :driver, :docker_driver?, - to: :builder_config + delegate :args, :secrets, :dockerfile, :target, :local_arch, :local_host, :remote_arch, :remote_host, :cache_from, :cache_to, :ssh, to: :builder_config def clean docker :image, :rm, "--force", config.absolute_image end - def push - docker :buildx, :build, - "--push", - *platform_options(arches), - *([ "--builder", builder_name ] unless docker_driver?), - *build_options, - build_context - end - def pull docker :pull, config.absolute_image end - def info - combine \ - docker(:context, :ls), - docker(:buildx, :ls) - end - - def buildx_inspect - docker :buildx, :inspect, builder_name unless docker_driver? - end - def build_options [ *build_tags, *build_cache, *build_labels, *build_args, *build_secrets, *build_dockerfile, *build_target, *build_ssh ] end @@ -53,6 +32,14 @@ class Kamal::Commands::Builder::Base < Kamal::Commands::Base ) end + def context_hosts + :true + end + + def config_context_hosts + [] + end + def first_mirror docker(:info, "--format '{{index .RegistryConfig.Mirrors 0}}'") end @@ -104,8 +91,4 @@ class Kamal::Commands::Builder::Base < Kamal::Commands::Base def context_host(builder_name) docker :context, :inspect, builder_name, "--format", ENDPOINT_DOCKER_HOST_INSPECT end - - def platform_options(arches) - argumentize "--platform", arches.map { |arch| "linux/#{arch}" }.join(",") if arches.any? - end end diff --git a/lib/kamal/commands/builder/hybrid.rb b/lib/kamal/commands/builder/hybrid.rb deleted file mode 100644 index 5434169a..00000000 --- a/lib/kamal/commands/builder/hybrid.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Kamal::Commands::Builder::Hybrid < Kamal::Commands::Builder::Remote - def create - combine \ - create_local_buildx, - create_remote_context, - append_remote_buildx - end - - private - def builder_name - "kamal-hybrid-#{driver}-#{remote.gsub(/[^a-z0-9_-]/, "-")}" - end - - def create_local_buildx - docker :buildx, :create, *platform_options(local_arches), "--name", builder_name, "--driver=#{driver}" - end - - def append_remote_buildx - docker :buildx, :create, *platform_options(remote_arches), "--append", "--name", builder_name, builder_name - end -end diff --git a/lib/kamal/commands/builder/local.rb b/lib/kamal/commands/builder/local.rb deleted file mode 100644 index c4215e33..00000000 --- a/lib/kamal/commands/builder/local.rb +++ /dev/null @@ -1,14 +0,0 @@ -class Kamal::Commands::Builder::Local < Kamal::Commands::Builder::Base - def create - docker :buildx, :create, "--name", builder_name, "--driver=#{driver}" unless docker_driver? - end - - def remove - docker :buildx, :rm, builder_name unless docker_driver? - end - - private - def builder_name - "kamal-local-#{driver}" - end -end diff --git a/lib/kamal/commands/builder/multiarch.rb b/lib/kamal/commands/builder/multiarch.rb new file mode 100644 index 00000000..ae1d423f --- /dev/null +++ b/lib/kamal/commands/builder/multiarch.rb @@ -0,0 +1,41 @@ +class Kamal::Commands::Builder::Multiarch < Kamal::Commands::Builder::Base + def create + docker :buildx, :create, "--use", "--name", builder_name + end + + def remove + docker :buildx, :rm, builder_name + end + + def info + combine \ + docker(:context, :ls), + docker(:buildx, :ls) + end + + def push + docker :buildx, :build, + "--push", + "--platform", platform_names, + "--builder", builder_name, + *build_options, + build_context + end + + def context_hosts + docker :buildx, :inspect, builder_name, "> /dev/null" + end + + private + def builder_name + "kamal-#{config.service}-multiarch" + end + + def platform_names + if local_arch + "linux/#{local_arch}" + else + "linux/amd64,linux/arm64" + end + end +end diff --git a/lib/kamal/commands/builder/multiarch/remote.rb b/lib/kamal/commands/builder/multiarch/remote.rb new file mode 100644 index 00000000..d60bee77 --- /dev/null +++ b/lib/kamal/commands/builder/multiarch/remote.rb @@ -0,0 +1,61 @@ +class Kamal::Commands::Builder::Multiarch::Remote < Kamal::Commands::Builder::Multiarch + def create + combine \ + create_contexts, + create_local_buildx, + append_remote_buildx + end + + def remove + combine \ + remove_contexts, + super + end + + def context_hosts + chain \ + context_host(builder_name_with_arch(local_arch)), + context_host(builder_name_with_arch(remote_arch)) + end + + def config_context_hosts + [ local_host, remote_host ].compact + end + + private + def builder_name + super + "-remote" + end + + def builder_name_with_arch(arch) + "#{builder_name}-#{arch}" + end + + def create_local_buildx + docker :buildx, :create, "--name", builder_name, builder_name_with_arch(local_arch), "--platform", "linux/#{local_arch}" + end + + def append_remote_buildx + docker :buildx, :create, "--append", "--name", builder_name, builder_name_with_arch(remote_arch), "--platform", "linux/#{remote_arch}" + end + + def create_contexts + combine \ + create_context(local_arch, local_host), + create_context(remote_arch, remote_host) + end + + def create_context(arch, host) + docker :context, :create, builder_name_with_arch(arch), "--description", "'#{builder_name} #{arch} native host'", "--docker", "'host=#{host}'" + end + + def remove_contexts + combine \ + remove_context(local_arch), + remove_context(remote_arch) + end + + def remove_context(arch) + docker :context, :rm, builder_name_with_arch(arch) + end +end diff --git a/lib/kamal/commands/builder/native.rb b/lib/kamal/commands/builder/native.rb new file mode 100644 index 00000000..599bdc0f --- /dev/null +++ b/lib/kamal/commands/builder/native.rb @@ -0,0 +1,20 @@ +class Kamal::Commands::Builder::Native < Kamal::Commands::Builder::Base + def create + # No-op on native without cache + end + + def remove + # No-op on native without cache + end + + def info + # No-op on native + end + + def push + combine \ + docker(:build, *build_options, build_context), + docker(:push, config.absolute_image), + docker(:push, config.latest_image) + end +end diff --git a/lib/kamal/commands/builder/native/cached.rb b/lib/kamal/commands/builder/native/cached.rb new file mode 100644 index 00000000..8f65d5f3 --- /dev/null +++ b/lib/kamal/commands/builder/native/cached.rb @@ -0,0 +1,25 @@ +class Kamal::Commands::Builder::Native::Cached < Kamal::Commands::Builder::Native + def create + docker :buildx, :create, "--name", builder_name, "--use", "--driver=docker-container" + end + + def remove + docker :buildx, :rm, builder_name + end + + def push + docker :buildx, :build, + "--push", + *build_options, + build_context + end + + def context_hosts + docker :buildx, :inspect, builder_name, "> /dev/null" + end + + private + def builder_name + "kamal-#{config.service}-native-cached" + end +end diff --git a/lib/kamal/commands/builder/native/remote.rb b/lib/kamal/commands/builder/native/remote.rb new file mode 100644 index 00000000..9d03b8db --- /dev/null +++ b/lib/kamal/commands/builder/native/remote.rb @@ -0,0 +1,67 @@ +class Kamal::Commands::Builder::Native::Remote < Kamal::Commands::Builder::Native + def create + chain \ + create_context, + create_buildx + end + + def remove + chain \ + remove_context, + remove_buildx + end + + def info + chain \ + docker(:context, :ls), + docker(:buildx, :ls) + end + + def push + docker :buildx, :build, + "--push", + "--platform", platform, + "--builder", builder_name, + *build_options, + build_context + end + + def context_hosts + context_host(builder_name_with_arch) + end + + def config_context_hosts + [ remote_host ] + end + + + private + def builder_name + "kamal-#{config.service}-native-remote" + end + + def builder_name_with_arch + "#{builder_name}-#{remote_arch}" + end + + def platform + "linux/#{remote_arch}" + end + + def create_context + docker :context, :create, + builder_name_with_arch, "--description", "'#{builder_name} #{remote_arch} native host'", "--docker", "'host=#{remote_host}'" + end + + def remove_context + docker :context, :rm, builder_name_with_arch + end + + def create_buildx + docker :buildx, :create, "--name", builder_name, builder_name_with_arch, "--platform", platform + end + + def remove_buildx + docker :buildx, :rm, builder_name + end +end diff --git a/lib/kamal/commands/builder/remote.rb b/lib/kamal/commands/builder/remote.rb deleted file mode 100644 index b4644047..00000000 --- a/lib/kamal/commands/builder/remote.rb +++ /dev/null @@ -1,40 +0,0 @@ -class Kamal::Commands::Builder::Remote < Kamal::Commands::Builder::Base - def create - chain \ - create_remote_context, - create_buildx - end - - def remove - chain \ - remove_remote_context, - remove_buildx - end - - def info - chain \ - docker(:context, :ls), - docker(:buildx, :ls) - end - - private - def builder_name - "kamal-remote-#{driver}-#{remote.gsub(/[^a-z0-9_-]/, "-")}" - end - - def create_remote_context - docker :context, :create, builder_name, "--description", "'#{builder_name} host'", "--docker", "'host=#{remote}'" - end - - def remove_remote_context - docker :context, :rm, builder_name - end - - def create_buildx - docker :buildx, :create, "--name", builder_name, builder_name - end - - def remove_buildx - docker :buildx, :rm, builder_name - end -end diff --git a/lib/kamal/configuration/builder.rb b/lib/kamal/configuration/builder.rb index 0daf7e74..74c8d1c6 100644 --- a/lib/kamal/configuration/builder.rb +++ b/lib/kamal/configuration/builder.rb @@ -19,36 +19,16 @@ class Kamal::Configuration::Builder builder_config end - def remote - builder_config["remote"] - end - - def arches - Array(builder_config.fetch("arch", default_arch)) - end - - def local_arches - @local_arches ||= if remote - arches & [ Kamal::Utils.docker_arch ] - else - arches - end - end - - def remote_arches - @remote_arches ||= if remote - arches - local_arches - else - [] - end - end - - def remote? - remote_arches.any? + def multiarch? + builder_config["multiarch"] != false end def local? - arches.empty? || local_arches.any? + !!builder_config["local"] + end + + def remote? + !!builder_config["remote"] end def cached? @@ -75,8 +55,20 @@ class Kamal::Configuration::Builder builder_config["context"] || "." end - def driver - builder_config.fetch("driver", "docker-container") + def local_arch + builder_config["local"]["arch"] if local? + end + + def local_host + builder_config["local"]["host"] if local? + end + + def remote_arch + builder_config["remote"]["arch"] if remote? + end + + def remote_host + builder_config["remote"]["host"] if remote? end def cache_from @@ -122,23 +114,7 @@ class Kamal::Configuration::Builder end end - def docker_driver? - driver == "docker" - end - private - def valid? - if docker_driver? - raise ArgumentError, "Invalid builder configuration: the `docker` driver does not not support remote builders" if remote - raise ArgumentError, "Invalid builder configuration: the `docker` driver does not not support caching" if cached? - raise ArgumentError, "Invalid builder configuration: the `docker` driver does not not support multiple arches" if arches.many? - end - - if @options["cache"] && @options["cache"]["type"] - raise ArgumentError, "Invalid cache type: #{@options["cache"]["type"]}" unless [ "gha", "registry" ].include?(@options["cache"]["type"]) - end - end - def cache_image builder_config["cache"]&.fetch("image", nil) || "#{image}-build-cache" end @@ -174,8 +150,4 @@ class Kamal::Configuration::Builder def pwd_sha Digest::SHA256.hexdigest(Dir.pwd)[0..12] end - - def default_arch - docker_driver? ? [] : [ "amd64", "arm64" ] - end end diff --git a/lib/kamal/configuration/docs/builder.yml b/lib/kamal/configuration/docs/builder.yml index 5455f1a2..b1071105 100644 --- a/lib/kamal/configuration/docs/builder.yml +++ b/lib/kamal/configuration/docs/builder.yml @@ -1,10 +1,10 @@ # Builder # -# The builder configuration controls how the application is built with `docker build` +# The builder configuration controls how the application is built with `docker build` or `docker buildx build` # # If no configuration is specified, Kamal will: -# 1. Create a buildx context called `kamal-local-docker-container`, using the docker-container driver -# 2. Use `docker build` to build a multiarch image for linux/amd64,linux/arm64 with that context +# 1. Create a buildx context called `kamal--multiarch` +# 2. Use `docker buildx build` to build a multiarch image for linux/amd64,linux/arm64 with that context # # See https://kamal-deploy.org/docs/configuration/builder-examples/ for more information @@ -12,29 +12,36 @@ # # Options go under the builder key in the root configuration. builder: - # Driver - # - # The build driver to use, defaults to `docker-container` - driver: docker - # Arch + # Multiarch # - # The architectures to build for, defaults to `[ amd64, arm64 ]` - # Unless you are using the docker driver, when it defaults to the local architecture - # You can set an array or just a single value - arch: - - amd64 + # Enables multiarch builds, defaults to `true` + multiarch: false + + # Local configuration + # + # The build configuration for local builds, only used if multiarch is enabled (the default) + # + # If there is no remote configuration, by default we build for amd64 and arm64. + # If you only want to build for one architecture, you can specify it here. + # The docker socket is optional and uses the default docker host socket when not specified + local: + arch: amd64 + host: /var/run/docker.sock # Remote configuration # - # If you have a remote builder, you can configure it here - remote: ssh://docker@docker-builder + # The build configuration for remote builds, also only used if multiarch is enabled. + # The arch is required and can be either amd64 or arm64. + remote: + arch: arm64 + host: ssh://docker@docker-builder # Builder cache # # The type must be either 'gha' or 'registry' # - # The image is only used for registry cache. Not compatible with the docker driver + # The image is only used for registry cache cache: type: registry options: mode=max diff --git a/lib/kamal/configuration/validator.rb b/lib/kamal/configuration/validator.rb index 2ac8482d..3374e004 100644 --- a/lib/kamal/configuration/validator.rb +++ b/lib/kamal/configuration/validator.rb @@ -28,11 +28,7 @@ class Kamal::Configuration::Validator elsif key == "hosts" validate_servers! value elsif example_value.is_a?(Array) - if key == "arch" - validate_array_of_or_type! value, example_value.first.class - else - validate_array_of! value, example_value.first.class - end + validate_array_of! value, example_value.first.class elsif example_value.is_a?(Hash) case key.to_s when "options", "args" @@ -75,16 +71,6 @@ class Kamal::Configuration::Validator value.is_a?(String) || value.is_a?(Symbol) || value.is_a?(Numeric) || value.is_a?(TrueClass) || value.is_a?(FalseClass) end - def validate_array_of_or_type!(value, type) - if value.is_a?(Array) - validate_array_of! value, type - else - validate_type! value, type - end - rescue Kamal::ConfigurationError - type_error(Array, type) - end - def validate_array_of!(array, type) validate_type! array, Array diff --git a/lib/kamal/configuration/validator/builder.rb b/lib/kamal/configuration/validator/builder.rb index 4bd815bf..ebccdf81 100644 --- a/lib/kamal/configuration/validator/builder.rb +++ b/lib/kamal/configuration/validator/builder.rb @@ -5,7 +5,5 @@ class Kamal::Configuration::Validator::Builder < Kamal::Configuration::Validator if config["cache"] && config["cache"]["type"] error "Invalid cache type: #{config["cache"]["type"]}" unless [ "gha", "registry" ].include?(config["cache"]["type"]) end - - error "Builder arch not set" unless config["arch"].present? end end diff --git a/lib/kamal/utils.rb b/lib/kamal/utils.rb index 46736ba5..a6ba5702 100644 --- a/lib/kamal/utils.rb +++ b/lib/kamal/utils.rb @@ -81,16 +81,4 @@ module Kamal::Utils def join_commands(commands) commands.map(&:strip).join(" ") end - - def docker_arch - arch = `docker info --format '{{.Architecture}}'`.strip - case arch - when /aarch64/ - "arm64" - when /x86_64/ - "amd64" - else - arch - end - end end diff --git a/test/cli/build_test.rb b/test/cli/build_test.rb index 826bd713..ed3cfcdb 100644 --- a/test/cli/build_test.rb +++ b/test/cli/build_test.rb @@ -21,12 +21,16 @@ class CliBuildTest < CliTestCase .with(:git, "-C", anything, :status, "--porcelain") .returns("") + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) + .with(:docker, :buildx, :inspect, "kamal-app-multiarch", "> /dev/null") + .returns("") + run_command("push", "--verbose").tap do |output| assert_hook_ran "pre-build", output, **hook_variables assert_match /Cloning repo into build directory/, output assert_match /git -C #{Dir.tmpdir}\/kamal-clones\/app-#{pwd_sha} clone #{Dir.pwd}/, output assert_match /docker --version && docker buildx version/, output - assert_match /docker buildx build --push --platform linux\/amd64 --builder kamal-local-docker-container -t dhh\/app:999 -t dhh\/app:latest --label service="app" --file Dockerfile \. as .*@localhost/, output + assert_match /docker buildx build --push --platform linux\/amd64,linux\/arm64 --builder kamal-app-multiarch -t dhh\/app:999 -t dhh\/app:latest --label service="app" --file Dockerfile \. as .*@localhost/, output end end end @@ -49,7 +53,7 @@ class CliBuildTest < CliTestCase SSHKit::Backend::Abstract.any_instance.expects(:execute).with(:git, "-C", build_directory, :submodule, :update, "--init") SSHKit::Backend::Abstract.any_instance.expects(:execute) - .with(:docker, :buildx, :build, "--push", "--platform", "linux/amd64", "--builder", "kamal-local-docker-container", "-t", "dhh/app:999", "-t", "dhh/app:latest", "--label", "service=\"app\"", "--file", "Dockerfile", ".") + .with(:docker, :buildx, :build, "--push", "--platform", "linux/amd64,linux/arm64", "--builder", "kamal-app-multiarch", "-t", "dhh/app:999", "-t", "dhh/app:latest", "--label", "service=\"app\"", "--file", "Dockerfile", ".") SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) .with(:git, "-C", anything, :"rev-parse", :HEAD) @@ -74,7 +78,7 @@ class CliBuildTest < CliTestCase assert_no_match /Cloning repo into build directory/, output assert_hook_ran "pre-build", output, **hook_variables assert_match /docker --version && docker buildx version/, output - assert_match /docker buildx build --push --platform linux\/amd64 --builder kamal-local-docker-container -t dhh\/app:999 -t dhh\/app:latest --label service="app" --file Dockerfile . as .*@localhost/, output + assert_match /docker buildx build --push --platform linux\/amd64,linux\/arm64 --builder kamal-app-multiarch -t dhh\/app:999 -t dhh\/app:latest --label service="app" --file Dockerfile . as .*@localhost/, output end end @@ -120,10 +124,10 @@ class CliBuildTest < CliTestCase .with(:docker, "--version", "&&", :docker, :buildx, "version") SSHKit::Backend::Abstract.any_instance.expects(:execute) - .with(:docker, :buildx, :create, "--name", "kamal-local-docker-container", "--driver=docker-container") + .with(:docker, :buildx, :create, "--use", "--name", "kamal-app-multiarch") - SSHKit::Backend::Abstract.any_instance.expects(:execute) - .with(:docker, :buildx, :inspect, "kamal-local-docker-container") + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) + .with(:docker, :buildx, :inspect, "kamal-app-multiarch", "> /dev/null") .raises(SSHKit::Command::Failed.new("no builder")) SSHKit::Backend::Abstract.any_instance.expects(:execute).with { |*args| args.first.start_with?("git") } @@ -137,7 +141,7 @@ class CliBuildTest < CliTestCase .returns("") SSHKit::Backend::Abstract.any_instance.expects(:execute) - .with(:docker, :buildx, :build, "--push", "--platform", "linux/amd64", "--builder", "kamal-local-docker-container", "-t", "dhh/app:999", "-t", "dhh/app:latest", "--label", "service=\"app\"", "--file", "Dockerfile", ".") + .with(:docker, :buildx, :build, "--push", "--platform", "linux/amd64,linux/arm64", "--builder", "kamal-app-multiarch", "-t", "dhh/app:999", "-t", "dhh/app:latest", "--label", "service=\"app\"", "--file", "Dockerfile", ".") run_command("push").tap do |output| assert_match /WARN Missing compatible builder, so creating a new one first/, output @@ -161,7 +165,7 @@ class CliBuildTest < CliTestCase error = assert_raises(Kamal::Cli::HookError) { run_command("push") } assert_equal "Hook `pre-build` failed:\nfailed", error.message - assert @executions.none? { |args| args[0..2] == [ :docker, :build ] } + assert @executions.none? { |args| args[0..2] == [ :docker, :buildx, :build ] } end test "pull" do @@ -203,23 +207,23 @@ class CliBuildTest < CliTestCase test "create" do run_command("create").tap do |output| - assert_match /docker buildx create --name kamal-local-docker-container --driver=docker-container/, output + assert_match /docker buildx create --use --name kamal-app-multiarch/, output end end test "create remote" do run_command("create", fixture: :with_remote_builder).tap do |output| assert_match "Running /usr/bin/env true on 1.1.1.5", output - assert_match "docker context create kamal-remote-docker-container-ssh---app-1-1-1-5 --description 'kamal-remote-docker-container-ssh---app-1-1-1-5 host' --docker 'host=ssh://app@1.1.1.5'", output - assert_match "docker buildx create --name kamal-remote-docker-container-ssh---app-1-1-1-5 kamal-remote-docker-container-ssh---app-1-1-1-5", output + assert_match "docker context create kamal-app-native-remote-amd64 --description 'kamal-app-native-remote amd64 native host' --docker 'host=ssh://app@1.1.1.5'", output + assert_match "docker buildx create --name kamal-app-native-remote kamal-app-native-remote-amd64 --platform linux/amd64", output end end test "create remote with custom ports" do run_command("create", fixture: :with_remote_builder_and_custom_ports).tap do |output| assert_match "Running /usr/bin/env true on 1.1.1.5", output - assert_match "docker context create kamal-remote-docker-container-ssh---app-1-1-1-5-2122 --description 'kamal-remote-docker-container-ssh---app-1-1-1-5-2122 host' --docker 'host=ssh://app@1.1.1.5:2122'", output - assert_match "docker buildx create --name kamal-remote-docker-container-ssh---app-1-1-1-5-2122 kamal-remote-docker-container-ssh---app-1-1-1-5-2122", output + assert_match "docker context create kamal-app-native-remote-amd64 --description 'kamal-app-native-remote amd64 native host' --docker 'host=ssh://app@1.1.1.5:2122'", output + assert_match "docker buildx create --name kamal-app-native-remote kamal-app-native-remote-amd64 --platform linux/amd64", output end end @@ -236,7 +240,7 @@ class CliBuildTest < CliTestCase test "remove" do run_command("remove").tap do |output| - assert_match /docker buildx rm kamal-local/, output + assert_match /docker buildx rm kamal-app-multiarch/, output end end @@ -246,7 +250,7 @@ class CliBuildTest < CliTestCase .returns("docker builder info") run_command("details").tap do |output| - assert_match /Builder: local/, output + assert_match /Builder: multiarch/, output assert_match /docker builder info/, output end end diff --git a/test/cli/cli_test_case.rb b/test/cli/cli_test_case.rb index c522a32f..231da3d0 100644 --- a/test/cli/cli_test_case.rb +++ b/test/cli/cli_test_case.rb @@ -36,8 +36,9 @@ class CliTestCase < ActiveSupport::TestCase .with { |arg1, arg2| arg1 == :mkdir && arg2 == ".kamal/locks/app" } SSHKit::Backend::Abstract.any_instance.stubs(:execute) .with { |arg1, arg2| arg1 == :rm && arg2 == ".kamal/locks/app/details" } - SSHKit::Backend::Abstract.any_instance.stubs(:execute) - .with(:docker, :buildx, :inspect, "kamal-local-docker-container") + SSHKit::Backend::Abstract.any_instance.stubs(:capture_with_info) + .with { |*args| args[0..2] == [ :docker, :buildx, :inspect ] } + .returns("") end def assert_hook_ran(hook, output, version:, service_version:, hosts:, command:, subcommand: nil, runtime: false) diff --git a/test/cli/main_test.rb b/test/cli/main_test.rb index 2b87191c..60192cf6 100644 --- a/test/cli/main_test.rb +++ b/test/cli/main_test.rb @@ -121,6 +121,10 @@ class CliMainTest < CliTestCase .with(:git, "-C", anything, :status, "--porcelain") .returns("") + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) + .with(:docker, :buildx, :inspect, "kamal-app-multiarch", "> /dev/null") + .returns("") + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) .with(:docker, :info, "--format '{{index .RegistryConfig.Mirrors 0}}'") .returns("") @@ -155,6 +159,10 @@ class CliMainTest < CliTestCase .with(:git, "-C", anything, :status, "--porcelain") .returns("") + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) + .with(:docker, :buildx, :inspect, "kamal-app-multiarch", "> /dev/null") + .returns("") + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) .with(:docker, :info, "--format '{{index .RegistryConfig.Mirrors 0}}'") .returns("") diff --git a/test/commands/accessory_test.rb b/test/commands/accessory_test.rb index 40002988..94c1bebc 100644 --- a/test/commands/accessory_test.rb +++ b/test/commands/accessory_test.rb @@ -5,7 +5,6 @@ class CommandsAccessoryTest < ActiveSupport::TestCase @config = { service: "app", image: "dhh/app", registry: { "server" => "private.registry", "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], - builder: { "arch" => "amd64" }, accessories: { "mysql" => { "image" => "private.registry/mysql:8.0", diff --git a/test/commands/app_test.rb b/test/commands/app_test.rb index bee7dc34..502501cd 100644 --- a/test/commands/app_test.rb +++ b/test/commands/app_test.rb @@ -5,7 +5,7 @@ class CommandsAppTest < ActiveSupport::TestCase ENV["RAILS_MASTER_KEY"] = "456" Kamal::Configuration.any_instance.stubs(:run_id).returns("12345678901234567890123456789012") - @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], env: { "secret" => [ "RAILS_MASTER_KEY" ] }, builder: { "arch" => "amd64" } } + @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], env: { "secret" => [ "RAILS_MASTER_KEY" ] } } end teardown do diff --git a/test/commands/auditor_test.rb b/test/commands/auditor_test.rb index 2aaafd67..5b7a34c5 100644 --- a/test/commands/auditor_test.rb +++ b/test/commands/auditor_test.rb @@ -8,7 +8,7 @@ class CommandsAuditorTest < ActiveSupport::TestCase freeze_time @config = { - service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, builder: { "arch" => "amd64" }, servers: [ "1.1.1.1" ] + service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ] } @auditor = new_command diff --git a/test/commands/builder_test.rb b/test/commands/builder_test.rb index c43c5c85..f3faa5f6 100644 --- a/test/commands/builder_test.rb +++ b/test/commands/builder_test.rb @@ -2,54 +2,54 @@ require "test_helper" class CommandsBuilderTest < ActiveSupport::TestCase setup do - @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], builder: { "arch" => "amd64" } } + @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ] } end - test "target linux/amd64 locally by default" do + test "target multiarch by default" do builder = new_builder_command(builder: { "cache" => { "type" => "gha" } }) - assert_equal "local", builder.name + assert_equal "multiarch", builder.name assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", + "docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-app-multiarch -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", builder.push.join(" ") end - test "target specified arch locally by default" do - builder = new_builder_command(builder: { "arch" => [ "amd64" ] }) - assert_equal "local", builder.name + test "target native when multiarch is off" do + builder = new_builder_command(builder: { "multiarch" => false }) + assert_equal "native", builder.name assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile .", + "docker build -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile . && docker push dhh/app:123 && docker push dhh/app:latest", builder.push.join(" ") end - test "build with caching" do - builder = new_builder_command(builder: { "cache" => { "type" => "gha" } }) - assert_equal "local", builder.name + test "target native cached when multiarch is off and cache is set" do + builder = new_builder_command(builder: { "multiarch" => false, "cache" => { "type" => "gha" } }) + assert_equal "native/cached", builder.name assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", + "docker buildx build --push -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", builder.push.join(" ") end - test "hybrid build if remote is set and building multiarch" do - builder = new_builder_command(builder: { "arch" => [ "amd64", "arm64" ], "remote" => "ssh://app@127.0.0.1", "cache" => { "type" => "gha" } }) - assert_equal "hybrid", builder.name + test "target multiarch remote when local and remote is set" do + builder = new_builder_command(builder: { "local" => {}, "remote" => {}, "cache" => { "type" => "gha" } }) + assert_equal "multiarch/remote", builder.name assert_equal \ - "docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-hybrid-docker-container-ssh---app-127-0-0-1 -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", + "docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-app-multiarch-remote -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", builder.push.join(" ") end - test "target remote when remote set and arch is non local" do - builder = new_builder_command(builder: { "arch" => [ "#{remote_arch}" ], "remote" => "ssh://app@host", "cache" => { "type" => "gha" } }) - assert_equal "remote", builder.name + test "target multiarch local when arch is set" do + builder = new_builder_command(builder: { "local" => { "arch" => "amd64" } }) + assert_equal "multiarch", builder.name assert_equal \ - "docker buildx build --push --platform linux/#{remote_arch} --builder kamal-remote-docker-container-ssh---app-host -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", + "docker buildx build --push --platform linux/amd64 --builder kamal-app-multiarch -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile .", builder.push.join(" ") end - test "target local when remote set and arch is local" do - builder = new_builder_command(builder: { "arch" => [ "#{local_arch}" ], "remote" => "ssh://app@host", "cache" => { "type" => "gha" } }) - assert_equal "local", builder.name + test "target native remote when only remote is set" do + builder = new_builder_command(builder: { "remote" => { "arch" => "amd64" }, "cache" => { "type" => "gha" } }) + assert_equal "native/remote", builder.name assert_equal \ - "docker buildx build --push --platform linux/#{local_arch} --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", + "docker buildx build --push --platform linux/amd64 --builder kamal-app-native-remote -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile .", builder.push.join(" ") end @@ -93,21 +93,28 @@ class CommandsBuilderTest < ActiveSupport::TestCase test "build context" do builder = new_builder_command(builder: { "context" => ".." }) assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile ..", + "docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-app-multiarch -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile ..", builder.push.join(" ") end - test "push with build args" do + test "native push with build args" do + builder = new_builder_command(builder: { "multiarch" => false, "args" => { "a" => 1, "b" => 2 } }) + assert_equal \ + "docker build -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --build-arg a=\"1\" --build-arg b=\"2\" --file Dockerfile . && docker push dhh/app:123 && docker push dhh/app:latest", + builder.push.join(" ") + end + + test "multiarch push with build args" do builder = new_builder_command(builder: { "args" => { "a" => 1, "b" => 2 } }) assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --build-arg a=\"1\" --build-arg b=\"2\" --file Dockerfile .", + "docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-app-multiarch -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --build-arg a=\"1\" --build-arg b=\"2\" --file Dockerfile .", builder.push.join(" ") end - test "push with build secrets" do - builder = new_builder_command(builder: { "secrets" => [ "a", "b" ] }) + test "native push with build secrets" do + builder = new_builder_command(builder: { "multiarch" => false, "secrets" => [ "a", "b" ] }) assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --secret id=\"a\" --secret id=\"b\" --file Dockerfile .", + "docker build -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --secret id=\"a\" --secret id=\"b\" --file Dockerfile . && docker push dhh/app:123 && docker push dhh/app:latest", builder.push.join(" ") end @@ -123,13 +130,76 @@ class CommandsBuilderTest < ActiveSupport::TestCase assert_equal "docker inspect -f '{{ .Config.Labels.service }}' dhh/app:123 | grep -x app || (echo \"Image dhh/app:123 is missing the 'service' label\" && exit 1)", new_builder_command.validate_image.join(" ") end - test "context build" do + test "multiarch context build" do builder = new_builder_command(builder: { "context" => "./foo" }) assert_equal \ - "docker buildx build --push --platform linux/amd64 --builder kamal-local-docker-container -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile ./foo", + "docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-app-multiarch -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile ./foo", builder.push.join(" ") end + test "native context build" do + builder = new_builder_command(builder: { "multiarch" => false, "context" => "./foo" }) + assert_equal \ + "docker build -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile ./foo && docker push dhh/app:123 && docker push dhh/app:latest", + builder.push.join(" ") + end + + test "cached context build" do + builder = new_builder_command(builder: { "multiarch" => false, "context" => "./foo", "cache" => { "type" => "gha" } }) + assert_equal \ + "docker buildx build --push -t dhh/app:123 -t dhh/app:latest --cache-to type=gha --cache-from type=gha --label service=\"app\" --file Dockerfile ./foo", + builder.push.join(" ") + end + + test "remote context build" do + builder = new_builder_command(builder: { "remote" => { "arch" => "amd64" }, "context" => "./foo" }) + assert_equal \ + "docker buildx build --push --platform linux/amd64 --builder kamal-app-native-remote -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile ./foo", + builder.push.join(" ") + end + + test "multiarch context hosts" do + command = new_builder_command + assert_equal "docker buildx inspect kamal-app-multiarch > /dev/null", command.context_hosts.join(" ") + assert_equal "", command.config_context_hosts.join(" ") + end + + test "native context hosts" do + command = new_builder_command(builder: { "multiarch" => false }) + assert_equal :true, command.context_hosts + assert_equal "", command.config_context_hosts.join(" ") + end + + test "native cached context hosts" do + command = new_builder_command(builder: { "multiarch" => false, "cache" => { "type" => "registry" } }) + assert_equal "docker buildx inspect kamal-app-native-cached > /dev/null", command.context_hosts.join(" ") + assert_equal "", command.config_context_hosts.join(" ") + end + + test "native remote context hosts" do + command = new_builder_command(builder: { "remote" => { "arch" => "amd64", "host" => "ssh://host" } }) + assert_equal "docker context inspect kamal-app-native-remote-amd64 --format '{{.Endpoints.docker.Host}}'", command.context_hosts.join(" ") + assert_equal [ "ssh://host" ], command.config_context_hosts + end + + test "multiarch remote context hosts" do + command = new_builder_command(builder: { + "remote" => { "arch" => "amd64", "host" => "ssh://host" }, + "local" => { "arch" => "arm64" } + }) + assert_equal "docker context inspect kamal-app-multiarch-remote-arm64 --format '{{.Endpoints.docker.Host}}' ; docker context inspect kamal-app-multiarch-remote-amd64 --format '{{.Endpoints.docker.Host}}'", command.context_hosts.join(" ") + assert_equal [ "ssh://host" ], command.config_context_hosts + end + + test "multiarch remote context hosts with local host" do + command = new_builder_command(builder: { + "remote" => { "arch" => "amd64", "host" => "ssh://host" }, + "local" => { "arch" => "arm64", "host" => "unix:///var/run/docker.sock" } + }) + assert_equal "docker context inspect kamal-app-multiarch-remote-arm64 --format '{{.Endpoints.docker.Host}}' ; docker context inspect kamal-app-multiarch-remote-amd64 --format '{{.Endpoints.docker.Host}}'", command.context_hosts.join(" ") + assert_equal [ "unix:///var/run/docker.sock", "ssh://host" ], command.config_context_hosts + end + test "mirror count" do command = new_builder_command assert_equal "docker info --format '{{index .RegistryConfig.Mirrors 0}}'", command.first_mirror.join(" ") @@ -137,18 +207,10 @@ class CommandsBuilderTest < ActiveSupport::TestCase private def new_builder_command(additional_config = {}) - Kamal::Commands::Builder.new(Kamal::Configuration.new(@config.deep_merge(additional_config), version: "123")) + Kamal::Commands::Builder.new(Kamal::Configuration.new(@config.merge(additional_config), version: "123")) end def build_directory "#{Dir.tmpdir}/kamal-clones/app/kamal/" end - - def local_arch - Kamal::Utils.docker_arch - end - - def remote_arch - Kamal::Utils.docker_arch == "arm64" ? "amd64" : "arm64" - end end diff --git a/test/commands/docker_test.rb b/test/commands/docker_test.rb index db2ed45c..0c0e976b 100644 --- a/test/commands/docker_test.rb +++ b/test/commands/docker_test.rb @@ -3,7 +3,7 @@ require "test_helper" class CommandsDockerTest < ActiveSupport::TestCase setup do @config = { - service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], builder: { "arch" => "amd64" } + service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ] } @docker = Kamal::Commands::Docker.new(Kamal::Configuration.new(@config)) end diff --git a/test/commands/hook_test.rb b/test/commands/hook_test.rb index 60438c66..c0e6e98f 100644 --- a/test/commands/hook_test.rb +++ b/test/commands/hook_test.rb @@ -8,7 +8,7 @@ class CommandsHookTest < ActiveSupport::TestCase @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], - builder: { "arch" => "amd64" }, traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } + traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } } @performer = Kamal::Git.email.presence || `whoami`.chomp diff --git a/test/commands/lock_test.rb b/test/commands/lock_test.rb index 02871922..fc2b15ab 100644 --- a/test/commands/lock_test.rb +++ b/test/commands/lock_test.rb @@ -4,7 +4,7 @@ class CommandsLockTest < ActiveSupport::TestCase setup do @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], - builder: { "arch" => "amd64" }, traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } + traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } } end diff --git a/test/commands/prune_test.rb b/test/commands/prune_test.rb index 430a13db..c4a56a9a 100644 --- a/test/commands/prune_test.rb +++ b/test/commands/prune_test.rb @@ -4,7 +4,7 @@ class CommandsPruneTest < ActiveSupport::TestCase setup do @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], - builder: { "arch" => "amd64" }, traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } + traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } } end diff --git a/test/commands/registry_test.rb b/test/commands/registry_test.rb index 17376fef..c25d7585 100755 --- a/test/commands/registry_test.rb +++ b/test/commands/registry_test.rb @@ -8,7 +8,6 @@ class CommandsRegistryTest < ActiveSupport::TestCase "password" => "secret", "server" => "hub.docker.com" }, - builder: { "arch" => "amd64" }, servers: [ "1.1.1.1" ] } @registry = Kamal::Commands::Registry.new Kamal::Configuration.new(@config) diff --git a/test/commands/server_test.rb b/test/commands/server_test.rb index 8c465fd9..9e063f77 100644 --- a/test/commands/server_test.rb +++ b/test/commands/server_test.rb @@ -4,7 +4,7 @@ class CommandsServerTest < ActiveSupport::TestCase setup do @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], - builder: { "arch" => "amd64" }, traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } + traefik: { "args" => { "accesslog.format" => "json", "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } } end diff --git a/test/commands/traefik_test.rb b/test/commands/traefik_test.rb index 446c3077..a46fc284 100644 --- a/test/commands/traefik_test.rb +++ b/test/commands/traefik_test.rb @@ -5,7 +5,7 @@ class CommandsTraefikTest < ActiveSupport::TestCase @image = "traefik:test" @config = { - service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], builder: { "arch" => "amd64" }, + service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], traefik: { "image" => @image, "args" => { "accesslog.format" => "json", "api.insecure" => true, "metrics.prometheus.buckets" => "0.1,0.3,1.2,5.0" } } } diff --git a/test/configuration/accessory_test.rb b/test/configuration/accessory_test.rb index 3f939607..581cdab3 100644 --- a/test/configuration/accessory_test.rb +++ b/test/configuration/accessory_test.rb @@ -8,7 +8,6 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase "web" => [ "1.1.1.1", "1.1.1.2" ], "workers" => [ "1.1.1.3", "1.1.1.4" ] }, - builder: { "arch" => "amd64" }, env: { "REDIS_URL" => "redis://x/y" }, accessories: { "mysql" => { diff --git a/test/configuration/builder_test.rb b/test/configuration/builder_test.rb index 3df477c9..4b37b5e8 100644 --- a/test/configuration/builder_test.rb +++ b/test/configuration/builder_test.rb @@ -4,33 +4,56 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase setup do @deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, - builder: { "arch" => "amd64" }, servers: [ "1.1.1.1" ] + servers: [ "1.1.1.1" ] + } + + @deploy_with_builder_option = { + service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, + servers: [ "1.1.1.1" ], + builder: {} } end + test "multiarch?" do + assert_equal true, config.builder.multiarch? + end + + test "setting multiarch to false" do + @deploy_with_builder_option[:builder] = { "multiarch" => false } + + assert_equal false, config_with_builder_option.builder.multiarch? + end + test "local?" do - assert_equal true, config.builder.local? + assert_equal false, config.builder.local? end test "remote?" do assert_equal false, config.builder.remote? end - test "remote" do - assert_nil config.builder.remote + test "remote_arch" do + assert_nil config.builder.remote_arch + end + + test "remote_host" do + assert_nil config.builder.remote_host end test "setting both local and remote configs" do - @deploy[:builder] = { - "arch" => [ "amd64", "arm64" ], - "remote" => "ssh://root@192.168.0.1" + @deploy_with_builder_option[:builder] = { + "local" => { "arch" => "arm64", "host" => "unix:///Users/<%= `whoami`.strip %>/.docker/run/docker.sock" }, + "remote" => { "arch" => "amd64", "host" => "ssh://root@192.168.0.1" } } - assert_equal true, config.builder.local? - assert_equal true, config.builder.remote? + assert_equal true, config_with_builder_option.builder.local? + assert_equal true, config_with_builder_option.builder.remote? - assert_equal [ "amd64", "arm64" ], config.builder.arches - assert_equal "ssh://root@192.168.0.1", config.builder.remote + assert_equal "amd64", config_with_builder_option.builder.remote_arch + assert_equal "ssh://root@192.168.0.1", config_with_builder_option.builder.remote_host + + assert_equal "arm64", config_with_builder_option.builder.local_arch + assert_equal "unix:///Users/<%= `whoami`.strip %>/.docker/run/docker.sock", config_with_builder_option.builder.local_host end test "cached?" do @@ -38,10 +61,10 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "invalid cache type specified" do - @deploy[:builder]["cache"] = { "type" => "invalid" } + @deploy_with_builder_option[:builder] = { "cache" => { "type" => "invalid" } } assert_raises(Kamal::ConfigurationError) do - config.builder + config_with_builder_option.builder end end @@ -54,32 +77,32 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "setting gha cache" do - @deploy[:builder] = { "arch" => "amd64", "cache" => { "type" => "gha", "options" => "mode=max" } } + @deploy_with_builder_option[:builder] = { "cache" => { "type" => "gha", "options" => "mode=max" } } - assert_equal "type=gha", config.builder.cache_from - assert_equal "type=gha,mode=max", config.builder.cache_to + assert_equal "type=gha", config_with_builder_option.builder.cache_from + assert_equal "type=gha,mode=max", config_with_builder_option.builder.cache_to end test "setting registry cache" do - @deploy[:builder] = { "arch" => "amd64", "cache" => { "type" => "registry", "options" => "mode=max,image-manifest=true,oci-mediatypes=true" } } + @deploy_with_builder_option[:builder] = { "cache" => { "type" => "registry", "options" => "mode=max,image-manifest=true,oci-mediatypes=true" } } - assert_equal "type=registry,ref=dhh/app-build-cache", config.builder.cache_from - assert_equal "type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=dhh/app-build-cache", config.builder.cache_to + assert_equal "type=registry,ref=dhh/app-build-cache", config_with_builder_option.builder.cache_from + assert_equal "type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=dhh/app-build-cache", config_with_builder_option.builder.cache_to end test "setting registry cache when using a custom registry" do - @deploy[:registry]["server"] = "registry.example.com" - @deploy[:builder] = { "arch" => "amd64", "cache" => { "type" => "registry", "options" => "mode=max,image-manifest=true,oci-mediatypes=true" } } + @deploy_with_builder_option[:registry]["server"] = "registry.example.com" + @deploy_with_builder_option[:builder] = { "cache" => { "type" => "registry", "options" => "mode=max,image-manifest=true,oci-mediatypes=true" } } - assert_equal "type=registry,ref=registry.example.com/dhh/app-build-cache", config.builder.cache_from - assert_equal "type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=registry.example.com/dhh/app-build-cache", config.builder.cache_to + assert_equal "type=registry,ref=registry.example.com/dhh/app-build-cache", config_with_builder_option.builder.cache_from + assert_equal "type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=registry.example.com/dhh/app-build-cache", config_with_builder_option.builder.cache_to end test "setting registry cache with image" do - @deploy[:builder] = { "arch" => "amd64", "cache" => { "type" => "registry", "image" => "kamal", "options" => "mode=max" } } + @deploy_with_builder_option[:builder] = { "cache" => { "type" => "registry", "image" => "kamal", "options" => "mode=max" } } - assert_equal "type=registry,ref=kamal", config.builder.cache_from - assert_equal "type=registry,mode=max,ref=kamal", config.builder.cache_to + assert_equal "type=registry,ref=kamal", config_with_builder_option.builder.cache_from + assert_equal "type=registry,mode=max,ref=kamal", config_with_builder_option.builder.cache_to end test "args" do @@ -87,9 +110,9 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "setting args" do - @deploy[:builder]["args"] = { "key" => "value" } + @deploy_with_builder_option[:builder] = { "args" => { "key" => "value" } } - assert_equal({ "key" => "value" }, config.builder.args) + assert_equal({ "key" => "value" }, config_with_builder_option.builder.args) end test "secrets" do @@ -97,9 +120,9 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "setting secrets" do - @deploy[:builder]["secrets"] = [ "GITHUB_TOKEN" ] + @deploy_with_builder_option[:builder] = { "secrets" => [ "GITHUB_TOKEN" ] } - assert_equal [ "GITHUB_TOKEN" ], config.builder.secrets + assert_equal [ "GITHUB_TOKEN" ], config_with_builder_option.builder.secrets end test "dockerfile" do @@ -107,9 +130,9 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "setting dockerfile" do - @deploy[:builder]["dockerfile"] = "Dockerfile.dev" + @deploy_with_builder_option[:builder] = { "dockerfile" => "Dockerfile.dev" } - assert_equal "Dockerfile.dev", config.builder.dockerfile + assert_equal "Dockerfile.dev", config_with_builder_option.builder.dockerfile end test "context" do @@ -117,9 +140,9 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "setting context" do - @deploy[:builder]["context"] = ".." + @deploy_with_builder_option[:builder] = { "context" => ".." } - assert_equal "..", config.builder.context + assert_equal "..", config_with_builder_option.builder.context end test "ssh" do @@ -127,13 +150,17 @@ class ConfigurationBuilderTest < ActiveSupport::TestCase end test "setting ssh params" do - @deploy[:builder]["ssh"] = "default=$SSH_AUTH_SOCK" + @deploy_with_builder_option[:builder] = { "ssh" => "default=$SSH_AUTH_SOCK" } - assert_equal "default=$SSH_AUTH_SOCK", config.builder.ssh + assert_equal "default=$SSH_AUTH_SOCK", config_with_builder_option.builder.ssh end private def config Kamal::Configuration.new(@deploy) end + + def config_with_builder_option + Kamal::Configuration.new(@deploy_with_builder_option) + end end diff --git a/test/configuration/env/tags_test.rb b/test/configuration/env/tags_test.rb index 0fb649d1..c36b6057 100644 --- a/test/configuration/env/tags_test.rb +++ b/test/configuration/env/tags_test.rb @@ -5,7 +5,6 @@ class ConfigurationEnvTagsTest < ActiveSupport::TestCase @deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ { "1.1.1.1" => "odd" }, { "1.1.1.2" => "even" }, { "1.1.1.3" => [ "odd", "three" ] } ], - builder: { "arch" => "amd64" }, env: { "clear" => { "REDIS_URL" => "redis://x/y", "THREE" => "false" }, "tags" => { @@ -65,7 +64,6 @@ class ConfigurationEnvTagsTest < ActiveSupport::TestCase deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ { "1.1.1.1" => [ "first", "second" ] } ], - builder: { "arch" => "amd64" }, env: { "tags" => { "first" => { "TYPE" => "first" }, @@ -84,7 +82,6 @@ class ConfigurationEnvTagsTest < ActiveSupport::TestCase deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ { "1.1.1.1" => "secrets" } ], - builder: { "arch" => "amd64" }, env: { "tags" => { "secrets" => { "secret" => [ "PASSWORD" ] } @@ -102,7 +99,6 @@ class ConfigurationEnvTagsTest < ActiveSupport::TestCase deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ { "1.1.1.1" => "clearly" } ], - builder: { "arch" => "amd64" }, env: { "tags" => { "clearly" => { "clear" => { "FOO" => "bar" } } diff --git a/test/configuration/role_test.rb b/test/configuration/role_test.rb index 37c26fcd..da9a3d1c 100644 --- a/test/configuration/role_test.rb +++ b/test/configuration/role_test.rb @@ -5,7 +5,6 @@ class ConfigurationRoleTest < ActiveSupport::TestCase @deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1", "1.1.1.2" ], - builder: { "arch" => "amd64" }, env: { "REDIS_URL" => "redis://x/y" } } diff --git a/test/configuration/ssh_test.rb b/test/configuration/ssh_test.rb index 76d1ae9a..f49c0055 100644 --- a/test/configuration/ssh_test.rb +++ b/test/configuration/ssh_test.rb @@ -5,7 +5,6 @@ class ConfigurationSshTest < ActiveSupport::TestCase @deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, - builder: { "arch" => "amd64" }, env: { "REDIS_URL" => "redis://x/y" }, servers: [ "1.1.1.1", "1.1.1.2" ], volumes: [ "/local/path:/container/path" ] diff --git a/test/configuration/sshkit_test.rb b/test/configuration/sshkit_test.rb index 1608e6ee..dc8c2258 100644 --- a/test/configuration/sshkit_test.rb +++ b/test/configuration/sshkit_test.rb @@ -6,7 +6,6 @@ class ConfigurationSshkitTest < ActiveSupport::TestCase service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, env: { "REDIS_URL" => "redis://x/y" }, - builder: { "arch" => "amd64" }, servers: [ "1.1.1.1", "1.1.1.2" ], volumes: [ "/local/path:/container/path" ] } diff --git a/test/configuration/validation_test.rb b/test/configuration/validation_test.rb index ac409e84..b7bd6b6a 100644 --- a/test/configuration/validation_test.rb +++ b/test/configuration/validation_test.rb @@ -90,8 +90,10 @@ class ConfigurationValidationTest < ActiveSupport::TestCase test "builder" do assert_error "builder: unknown key: foo", builder: { "foo" => "bar" } - assert_error "builder/remote: should be a string", builder: { "remote" => { "foo" => "bar" } } - assert_error "builder/arch: should be an array or a string", builder: { "arch" => {} } + assert_error "builder/remote: should be a hash", builder: { "remote" => true } + assert_error "builder/remote: unknown key: foo", builder: { "remote" => { "foo" => "bar" } } + assert_error "builder/local: unknown key: foo", builder: { "local" => { "foo" => "bar" } } + assert_error "builder/remote/arch: should be a string", builder: { "remote" => { "arch" => [] } } assert_error "builder/args: should be a hash", builder: { "args" => [ "foo" ] } assert_error "builder/cache/options: should be a string", builder: { "cache" => { "options" => [] } } end @@ -101,7 +103,6 @@ class ConfigurationValidationTest < ActiveSupport::TestCase valid_config = { service: "app", image: "app", - builder: { "arch" => "amd64" }, registry: { "username" => "user", "password" => "secret" }, servers: [ "1.1.1.1" ] } diff --git a/test/configuration_test.rb b/test/configuration_test.rb index aa78dda9..043a4c8c 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -8,7 +8,6 @@ class ConfigurationTest < ActiveSupport::TestCase @deploy = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, - builder: { "arch" => "amd64" }, env: { "REDIS_URL" => "redis://x/y" }, servers: [ "1.1.1.1", "1.1.1.2" ], volumes: [ "/local/path:/container/path" ] @@ -122,7 +121,7 @@ class ConfigurationTest < ActiveSupport::TestCase test "version from uncommitted context" do ENV.delete("VERSION") - config = Kamal::Configuration.new(@deploy.tap { |c| c[:builder]["context"] = "." }) + config = Kamal::Configuration.new(@deploy.tap { |c| c[:builder] = { "context" => "." } }) Kamal::Git.expects(:revision).returns("git-version") Kamal::Git.expects(:uncommitted_changes).returns("M file\n") @@ -268,7 +267,7 @@ class ConfigurationTest < ActiveSupport::TestCase ssh_options: { user: "root", port: 22, log_level: :fatal, keepalive: true, keepalive_interval: 30 }, sshkit: {}, volume_args: [ "--volume", "/local/path:/container/path" ], - builder: { "arch" => "amd64" }, + builder: {}, logging: [ "--log-opt", "max-size=\"10m\"" ], healthcheck: { "cmd"=>"curl -f http://localhost:3000/up || exit 1", "interval" => "1s", "path"=>"/up", "port"=>3000, "max_attempts" => 7, "cord" => "/tmp/kamal-cord", "log_lines" => 50 } } diff --git a/test/fixtures/deploy.erb.yml b/test/fixtures/deploy.erb.yml index 9b9d202d..a668fb3a 100644 --- a/test/fixtures/deploy.erb.yml +++ b/test/fixtures/deploy.erb.yml @@ -9,5 +9,3 @@ registry: server: registry.digitalocean.com username: <%= "my-user" %> password: <%= "my-password" %> -builder: - arch: amd64 diff --git a/test/fixtures/deploy_for_dest.yml b/test/fixtures/deploy_for_dest.yml index 1784d95f..96740aec 100644 --- a/test/fixtures/deploy_for_dest.yml +++ b/test/fixtures/deploy_for_dest.yml @@ -4,5 +4,3 @@ registry: server: registry.digitalocean.com username: <%= "my-user" %> password: <%= "my-password" %> -builder: - arch: amd64 diff --git a/test/fixtures/deploy_for_required_dest.yml b/test/fixtures/deploy_for_required_dest.yml index 1102df95..28438363 100644 --- a/test/fixtures/deploy_for_required_dest.yml +++ b/test/fixtures/deploy_for_required_dest.yml @@ -4,6 +4,4 @@ registry: server: registry.digitalocean.com username: <%= "my-user" %> password: <%= "my-password" %> -builder: - arch: amd64 require_destination: true diff --git a/test/fixtures/deploy_primary_web_role_override.yml b/test/fixtures/deploy_primary_web_role_override.yml index aa52f5ed..694a9be7 100644 --- a/test/fixtures/deploy_primary_web_role_override.yml +++ b/test/fixtures/deploy_primary_web_role_override.yml @@ -17,6 +17,4 @@ registry: server: registry.digitalocean.com username: user password: pw -builder: - arch: amd64 primary_role: web_tokyo diff --git a/test/fixtures/deploy_simple.yml b/test/fixtures/deploy_simple.yml index c143f800..520c138e 100644 --- a/test/fixtures/deploy_simple.yml +++ b/test/fixtures/deploy_simple.yml @@ -6,5 +6,3 @@ servers: registry: username: user password: pw -builder: - arch: amd64 diff --git a/test/fixtures/deploy_with_accessories.yml b/test/fixtures/deploy_with_accessories.yml index 29f502ec..dd78e9f4 100644 --- a/test/fixtures/deploy_with_accessories.yml +++ b/test/fixtures/deploy_with_accessories.yml @@ -10,8 +10,6 @@ servers: registry: username: user password: pw -builder: - arch: amd64 accessories: mysql: diff --git a/test/fixtures/deploy_with_aliases.yml b/test/fixtures/deploy_with_aliases.yml index ec7b14a0..bb54fa76 100644 --- a/test/fixtures/deploy_with_aliases.yml +++ b/test/fixtures/deploy_with_aliases.yml @@ -11,8 +11,6 @@ servers: console: hosts: - 1.1.1.5 -builder: - arch: amd64 registry: username: user password: pw diff --git a/test/fixtures/deploy_with_assets.yml b/test/fixtures/deploy_with_assets.yml index 2879d445..0b6b7cf5 100644 --- a/test/fixtures/deploy_with_assets.yml +++ b/test/fixtures/deploy_with_assets.yml @@ -6,6 +6,4 @@ servers: registry: username: user password: pw -builder: - arch: amd64 asset_path: /public/assets diff --git a/test/fixtures/deploy_with_boot_strategy.yml b/test/fixtures/deploy_with_boot_strategy.yml index 963bb7c3..7691eb2e 100644 --- a/test/fixtures/deploy_with_boot_strategy.yml +++ b/test/fixtures/deploy_with_boot_strategy.yml @@ -7,8 +7,6 @@ servers: workers: - "1.1.1.3" - "1.1.1.4" -builder: - arch: amd64 registry: username: user diff --git a/test/fixtures/deploy_with_env_tags.yml b/test/fixtures/deploy_with_env_tags.yml index 6822b49d..f0a24760 100644 --- a/test/fixtures/deploy_with_env_tags.yml +++ b/test/fixtures/deploy_with_env_tags.yml @@ -11,8 +11,6 @@ servers: - 1.1.1.4: site1 - 1.2.1.3: site2 - 1.2.1.4: [ site2 experimental ] -builder: - arch: amd64 env: clear: TEST: "root" diff --git a/test/fixtures/deploy_with_extensions.yml b/test/fixtures/deploy_with_extensions.yml index 4a5f934a..7d6a9db2 100644 --- a/test/fixtures/deploy_with_extensions.yml +++ b/test/fixtures/deploy_with_extensions.yml @@ -21,6 +21,4 @@ registry: server: registry.digitalocean.com username: user password: pw -builder: - arch: amd64 primary_role: web_tokyo diff --git a/test/fixtures/deploy_with_low_percentage_boot_strategy.yml b/test/fixtures/deploy_with_low_percentage_boot_strategy.yml index 8698b89f..9b6a3c64 100644 --- a/test/fixtures/deploy_with_low_percentage_boot_strategy.yml +++ b/test/fixtures/deploy_with_low_percentage_boot_strategy.yml @@ -7,8 +7,6 @@ servers: workers: - "1.1.1.3" - "1.1.1.4" -builder: - arch: amd64 registry: username: user diff --git a/test/fixtures/deploy_with_multiple_traefik_roles.yml b/test/fixtures/deploy_with_multiple_traefik_roles.yml index a1270583..a36a409f 100644 --- a/test/fixtures/deploy_with_multiple_traefik_roles.yml +++ b/test/fixtures/deploy_with_multiple_traefik_roles.yml @@ -26,8 +26,6 @@ servers: hosts: - 1.1.1.3 - 1.1.1.4 -builder: - arch: amd64 env: REDIS_URL: redis://x/y registry: diff --git a/test/fixtures/deploy_with_percentage_boot_strategy.yml b/test/fixtures/deploy_with_percentage_boot_strategy.yml index 8698b89f..9b6a3c64 100644 --- a/test/fixtures/deploy_with_percentage_boot_strategy.yml +++ b/test/fixtures/deploy_with_percentage_boot_strategy.yml @@ -7,8 +7,6 @@ servers: workers: - "1.1.1.3" - "1.1.1.4" -builder: - arch: amd64 registry: username: user diff --git a/test/fixtures/deploy_with_remote_builder.yml b/test/fixtures/deploy_with_remote_builder.yml index 6555ee6f..44103499 100644 --- a/test/fixtures/deploy_with_remote_builder.yml +++ b/test/fixtures/deploy_with_remote_builder.yml @@ -32,11 +32,10 @@ accessories: port: 6379 directories: - data:/data -builder: - arch: amd64 readiness_delay: 0 builder: - arch: <%= Kamal::Utils.docker_arch == "arm64" ? "amd64" : "arm64" %> - remote: ssh://app@1.1.1.5 + remote: + arch: amd64 + host: ssh://app@1.1.1.5 diff --git a/test/fixtures/deploy_with_remote_builder_and_custom_ports.yml b/test/fixtures/deploy_with_remote_builder_and_custom_ports.yml index 0b39259c..d1e81836 100644 --- a/test/fixtures/deploy_with_remote_builder_and_custom_ports.yml +++ b/test/fixtures/deploy_with_remote_builder_and_custom_ports.yml @@ -32,8 +32,6 @@ accessories: port: 6379 directories: - data:/data -builder: - arch: amd64 readiness_delay: 0 @@ -42,5 +40,6 @@ ssh: port: 22 builder: - arch: <%= Kamal::Utils.docker_arch == "arm64" ? "amd64" : "arm64" %> - remote: ssh://app@1.1.1.5:2122 + remote: + arch: amd64 + host: ssh://app@1.1.1.5:2122 diff --git a/test/fixtures/deploy_with_roles.yml b/test/fixtures/deploy_with_roles.yml index 1eb8cc5c..0e405241 100644 --- a/test/fixtures/deploy_with_roles.yml +++ b/test/fixtures/deploy_with_roles.yml @@ -14,5 +14,3 @@ registry: server: registry.digitalocean.com username: user password: pw -builder: - arch: amd64 diff --git a/test/fixtures/deploy_with_secrets.yml b/test/fixtures/deploy_with_secrets.yml index 35145a3e..a03cecbf 100644 --- a/test/fixtures/deploy_with_secrets.yml +++ b/test/fixtures/deploy_with_secrets.yml @@ -9,5 +9,3 @@ registry: env: secret: - PASSWORD -builder: - arch: amd64 diff --git a/test/fixtures/deploy_with_two_roles_one_host.yml b/test/fixtures/deploy_with_two_roles_one_host.yml index 939ff7e5..cae05469 100644 --- a/test/fixtures/deploy_with_two_roles_one_host.yml +++ b/test/fixtures/deploy_with_two_roles_one_host.yml @@ -13,5 +13,3 @@ registry: server: registry.digitalocean.com username: user password: pw -builder: - arch: amd64 diff --git a/test/fixtures/deploy_with_uncommon_hostnames.yml b/test/fixtures/deploy_with_uncommon_hostnames.yml index 112f7b39..71e7a601 100644 --- a/test/fixtures/deploy_with_uncommon_hostnames.yml +++ b/test/fixtures/deploy_with_uncommon_hostnames.yml @@ -6,5 +6,3 @@ servers: registry: username: user password: pw -builder: - arch: amd64 diff --git a/test/fixtures/deploy_without_clone.yml b/test/fixtures/deploy_without_clone.yml index c322155f..abb1224a 100644 --- a/test/fixtures/deploy_without_clone.yml +++ b/test/fixtures/deploy_without_clone.yml @@ -36,5 +36,4 @@ accessories: readiness_delay: 0 builder: - arch: amd64 context: "." diff --git a/test/fixtures/deploy_workers_only.yml b/test/fixtures/deploy_workers_only.yml index d83adeeb..75cbbde1 100644 --- a/test/fixtures/deploy_workers_only.yml +++ b/test/fixtures/deploy_workers_only.yml @@ -10,5 +10,3 @@ primary_role: workers registry: username: user password: pw -builder: - arch: amd64 diff --git a/test/integration/docker/deployer/app/config/deploy.yml b/test/integration/docker/deployer/app/config/deploy.yml index 887de825..397a49ca 100644 --- a/test/integration/docker/deployer/app/config/deploy.yml +++ b/test/integration/docker/deployer/app/config/deploy.yml @@ -23,8 +23,7 @@ registry: username: root password: root builder: - driver: docker - arch: <%= Kamal::Utils.docker_arch %> + multiarch: false args: COMMIT_SHA: <%= `git rev-parse HEAD` %> healthcheck: diff --git a/test/integration/docker/deployer/app_with_roles/config/deploy.yml b/test/integration/docker/deployer/app_with_roles/config/deploy.yml index c15af55b..d4d75771 100644 --- a/test/integration/docker/deployer/app_with_roles/config/deploy.yml +++ b/test/integration/docker/deployer/app_with_roles/config/deploy.yml @@ -22,8 +22,7 @@ registry: username: root password: root builder: - driver: docker - arch: <%= Kamal::Utils.docker_arch %> + multiarch: false args: COMMIT_SHA: <%= `git rev-parse HEAD` %> healthcheck: diff --git a/test/integration/main_test.rb b/test/integration/main_test.rb index a1e81493..742e111c 100644 --- a/test/integration/main_test.rb +++ b/test/integration/main_test.rb @@ -77,7 +77,7 @@ class MainTest < IntegrationTest assert_equal "app-#{version}", config[:service_with_version] assert_equal [], config[:volume_args] assert_equal({ user: "root", port: 22, keepalive: true, keepalive_interval: 30, log_level: :fatal }, config[:ssh_options]) - assert_equal({ "driver" => "docker", "arch" => "amd64", "args" => { "COMMIT_SHA" => version } }, config[:builder]) + assert_equal({ "multiarch" => false, "args" => { "COMMIT_SHA" => version } }, config[:builder]) assert_equal [ "--log-opt", "max-size=\"10m\"" ], config[:logging] assert_equal({ "cmd"=>"wget -qO- http://localhost > /dev/null || exit 1", "interval"=>"1s", "max_attempts"=>3, "port"=>3000, "path"=>"/up", "cord"=>"/tmp/kamal-cord", "log_lines"=>50 }, config[:healthcheck]) end