feat: Introduce a build dev command
which will build a "dirty" image using the working directory. This command is different from `build push` in two important ways: - the image tags will have a suffix of `-dirty` - the export action is "docker", pushing to the local docker image store The command also supports the `--output` option just added to `build push` to override that default. This command is intended to allow developers to quickly iterate on a docker image built from their local working directory while avoiding any confusion with a pristine image built from a git clone, and keeping those images on the local dev system by default.
This commit is contained in:
@@ -298,6 +298,30 @@ class CliBuildTest < CliTestCase
|
||||
end
|
||||
end
|
||||
|
||||
test "dev" do
|
||||
with_build_directory do |build_directory|
|
||||
Kamal::Commands::Hook.any_instance.stubs(:hook_exists?).returns(true)
|
||||
|
||||
run_command("dev", "--verbose").tap do |output|
|
||||
assert_no_match(/Cloning repo into build directory/, output)
|
||||
assert_match(/docker --version && docker buildx version/, output)
|
||||
assert_match(/docker buildx build --output=type=docker --platform linux\/amd64 --builder kamal-local-docker-container -t dhh\/app:999-dirty -t dhh\/app:latest-dirty --label service="app" --file Dockerfile \. as .*@localhost/, output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test "dev --output=local" do
|
||||
with_build_directory do |build_directory|
|
||||
Kamal::Commands::Hook.any_instance.stubs(:hook_exists?).returns(true)
|
||||
|
||||
run_command("dev", "--output=local", "--verbose").tap do |output|
|
||||
assert_no_match(/Cloning repo into build directory/, output)
|
||||
assert_match(/docker --version && docker buildx version/, output)
|
||||
assert_match(/docker buildx build --output=type=local --platform linux\/amd64 --builder kamal-local-docker-container -t dhh\/app:999-dirty -t dhh\/app:latest-dirty --label service="app" --file Dockerfile \. as .*@localhost/, output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def run_command(*command, fixture: :with_accessories)
|
||||
stdouted { Kamal::Cli::Build.start([ *command, "-c", "test/fixtures/deploy_#{fixture}.yml" ]) }
|
||||
|
||||
@@ -72,7 +72,7 @@ class CommandsBuilderTest < ActiveSupport::TestCase
|
||||
test "build args" do
|
||||
builder = new_builder_command(builder: { "args" => { "a" => 1, "b" => 2 } })
|
||||
assert_equal \
|
||||
"-t dhh/app:123 -t dhh/app:latest --label service=\"app\" --build-arg a=\"1\" --build-arg b=\"2\" --file Dockerfile",
|
||||
"--label service=\"app\" --build-arg a=\"1\" --build-arg b=\"2\" --file Dockerfile",
|
||||
builder.target.build_options.join(" ")
|
||||
end
|
||||
|
||||
@@ -81,7 +81,7 @@ class CommandsBuilderTest < ActiveSupport::TestCase
|
||||
FileUtils.touch("Dockerfile")
|
||||
builder = new_builder_command(builder: { "secrets" => [ "token_a", "token_b" ] })
|
||||
assert_equal \
|
||||
"-t dhh/app:123 -t dhh/app:latest --label service=\"app\" --secret id=\"token_a\" --secret id=\"token_b\" --file Dockerfile",
|
||||
"--label service=\"app\" --secret id=\"token_a\" --secret id=\"token_b\" --file Dockerfile",
|
||||
builder.target.build_options.join(" ")
|
||||
end
|
||||
end
|
||||
@@ -90,7 +90,7 @@ class CommandsBuilderTest < ActiveSupport::TestCase
|
||||
Pathname.any_instance.expects(:exist?).returns(true).once
|
||||
builder = new_builder_command(builder: { "dockerfile" => "Dockerfile.xyz" })
|
||||
assert_equal \
|
||||
"-t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile.xyz",
|
||||
"--label service=\"app\" --file Dockerfile.xyz",
|
||||
builder.target.build_options.join(" ")
|
||||
end
|
||||
|
||||
@@ -105,7 +105,7 @@ class CommandsBuilderTest < ActiveSupport::TestCase
|
||||
test "build target" do
|
||||
builder = new_builder_command(builder: { "target" => "prod" })
|
||||
assert_equal \
|
||||
"-t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile --target prod",
|
||||
"--label service=\"app\" --file Dockerfile --target prod",
|
||||
builder.target.build_options.join(" ")
|
||||
end
|
||||
|
||||
@@ -137,7 +137,7 @@ class CommandsBuilderTest < ActiveSupport::TestCase
|
||||
builder = new_builder_command(builder: { "ssh" => "default=$SSH_AUTH_SOCK" })
|
||||
|
||||
assert_equal \
|
||||
"-t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile --ssh default=$SSH_AUTH_SOCK",
|
||||
"--label service=\"app\" --file Dockerfile --ssh default=$SSH_AUTH_SOCK",
|
||||
builder.target.build_options.join(" ")
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user