Docker does not respect the .dockerignore file when building from a tar. Instead by default we'll make a local clone into a tmp directory and build from there. Subsequent builds will reset the clone to match the checkout. Compared to building directly in the repo, we'll have reproducible builds. Compared to using a git archive: 1. .dockerignore is respected 2. We'll have faster builds - docker can be smarter about caching the build context on subsequent builds from a directory To build from the repo directly, set the build context to "." in the config. If there are uncommitted changes, we'll warn about them either being included or ignored depending on whether we build from the clone.
162 lines
5.3 KiB
Ruby
162 lines
5.3 KiB
Ruby
require "test_helper"
|
|
|
|
class ConfigurationBuilderTest < ActiveSupport::TestCase
|
|
setup do
|
|
@deploy = {
|
|
service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" },
|
|
servers: [ "1.1.1.1" ]
|
|
}
|
|
|
|
@config = Kamal::Configuration.new(@deploy)
|
|
|
|
@deploy_with_builder_option = {
|
|
service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" },
|
|
servers: [ "1.1.1.1" ],
|
|
builder: {}
|
|
}
|
|
|
|
@config_with_builder_option = Kamal::Configuration.new(@deploy_with_builder_option)
|
|
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 false, @config.builder.local?
|
|
end
|
|
|
|
test "remote?" do
|
|
assert_equal false, @config.builder.remote?
|
|
end
|
|
|
|
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_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_with_builder_option.builder.local?
|
|
assert_equal true, @config_with_builder_option.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
|
|
assert_equal false, @config.builder.cached?
|
|
end
|
|
|
|
test "invalid cache type specified" do
|
|
@deploy_with_builder_option[:builder] = { "cache" => { "type" => "invalid" } }
|
|
|
|
assert_raises(ArgumentError) do
|
|
@config_with_builder_option.builder
|
|
end
|
|
end
|
|
|
|
test "cache_from" do
|
|
assert_nil @config.builder.cache_from
|
|
end
|
|
|
|
test "cache_to" do
|
|
assert_nil @config.builder.cache_to
|
|
end
|
|
|
|
test "setting gha cache" do
|
|
@deploy_with_builder_option[:builder] = { "cache" => { "type" => "gha", "options" => "mode=max" } }
|
|
|
|
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_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_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
|
|
@config_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_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_with_builder_option[:builder] = { "cache" => { "type" => "registry", "image" => "kamal", "options" => "mode=max" } }
|
|
|
|
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
|
|
assert_equal({}, @config.builder.args)
|
|
end
|
|
|
|
test "setting args" do
|
|
@deploy_with_builder_option[:builder] = { "args" => { "key" => "value" } }
|
|
|
|
assert_equal({ "key" => "value" }, @config_with_builder_option.builder.args)
|
|
end
|
|
|
|
test "secrets" do
|
|
assert_equal [], @config.builder.secrets
|
|
end
|
|
|
|
test "setting secrets" do
|
|
@deploy_with_builder_option[:builder] = { "secrets" => [ "GITHUB_TOKEN" ] }
|
|
|
|
assert_equal [ "GITHUB_TOKEN" ], @config_with_builder_option.builder.secrets
|
|
end
|
|
|
|
test "dockerfile" do
|
|
assert_equal "Dockerfile", @config.builder.dockerfile
|
|
end
|
|
|
|
test "setting dockerfile" do
|
|
@deploy_with_builder_option[:builder] = { "dockerfile" => "Dockerfile.dev" }
|
|
|
|
assert_equal "Dockerfile.dev", @config_with_builder_option.builder.dockerfile
|
|
end
|
|
|
|
test "context" do
|
|
assert_equal ".", @config.builder.context
|
|
end
|
|
|
|
test "setting context" do
|
|
@deploy_with_builder_option[:builder] = { "context" => ".." }
|
|
|
|
assert_equal "..", @config_with_builder_option.builder.context
|
|
end
|
|
|
|
test "ssh" do
|
|
assert_nil @config.builder.ssh
|
|
end
|
|
|
|
test "setting ssh params" do
|
|
@deploy_with_builder_option[:builder] = { "ssh" => "default=$SSH_AUTH_SOCK" }
|
|
|
|
assert_equal "default=$SSH_AUTH_SOCK", @config_with_builder_option.builder.ssh
|
|
end
|
|
end
|