From bafbde52feb41730365fd1bc4f118bca0faed282 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 15 Jan 2023 10:35:15 +0100 Subject: [PATCH] Add build args --- README.md | 22 ++++++++++++++++++++++ lib/mrsk/commands/builder.rb | 8 +++----- lib/mrsk/commands/builder/base.rb | 18 ++++++++++++++++++ lib/mrsk/commands/builder/multiarch.rb | 10 +++------- lib/mrsk/commands/builder/native.rb | 10 +++------- test/builder_command_test.rb | 15 +++++++++++++++ 6 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 lib/mrsk/commands/builder/base.rb diff --git a/README.md b/README.md index 460eeb68..31ffb3ac 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,28 @@ builder: multiarch: false ``` +### Configuring build args for new images + +Some images might need an argument passed in during build time, like a GITHUB_TOKEN to give access to private gem repositories. This can be done like so: + +```yaml +builder: + args: + GITHUB_TOKEN: +``` + +This build arg can then be used in the Dockerfile: + +``` +# Private repositories need an access token during the build +ARG GITHUB_TOKEN +ENV BUNDLE_GITHUB__COM=x-access-token:$GITHUB_TOKEN + +# Install application gems +COPY Gemfile Gemfile.lock ./ +RUN bundle install +``` + ## Commands ### Remote execution diff --git a/lib/mrsk/commands/builder.rb b/lib/mrsk/commands/builder.rb index d0ba65b9..ce18fc63 100644 --- a/lib/mrsk/commands/builder.rb +++ b/lib/mrsk/commands/builder.rb @@ -10,14 +10,12 @@ class Mrsk::Commands::Builder < Mrsk::Commands::Base def target case - when config.builder.nil? - multiarch - when config.builder["multiarch"] == false + when config.builder && config.builder["multiarch"] == false native - when config.builder["local"] && config.builder["remote"] + when config.builder && config.builder["local"] && config.builder["remote"] multiarch_remote else - raise ArgumentError, "Builder configuration incorrect: #{config.builder.inspect}" + multiarch end end diff --git a/lib/mrsk/commands/builder/base.rb b/lib/mrsk/commands/builder/base.rb new file mode 100644 index 00000000..56bb5c33 --- /dev/null +++ b/lib/mrsk/commands/builder/base.rb @@ -0,0 +1,18 @@ +require "mrsk/commands/base" + +class Mrsk::Commands::Builder::Base < Mrsk::Commands::Base + delegate :argumentize, to: Mrsk::Configuration + + def pull + docker :pull, config.absolute_image + end + + def build_args + argumentize "--build-args", args + end + + private + def args + config.builder["args"] || {} + end +end diff --git a/lib/mrsk/commands/builder/multiarch.rb b/lib/mrsk/commands/builder/multiarch.rb index ed9dd213..91e1e6bc 100644 --- a/lib/mrsk/commands/builder/multiarch.rb +++ b/lib/mrsk/commands/builder/multiarch.rb @@ -1,6 +1,6 @@ -require "mrsk/commands/base" +require "mrsk/commands/builder/base" -class Mrsk::Commands::Builder::Multiarch < Mrsk::Commands::Base +class Mrsk::Commands::Builder::Multiarch < Mrsk::Commands::Builder::Base def create docker :buildx, :create, "--use", "--name", builder_name end @@ -10,11 +10,7 @@ class Mrsk::Commands::Builder::Multiarch < Mrsk::Commands::Base end def push - docker :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", config.absolute_image, "." - end - - def pull - docker :pull, config.absolute_image + docker :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", config.absolute_image, *build_args, "." end def info diff --git a/lib/mrsk/commands/builder/native.rb b/lib/mrsk/commands/builder/native.rb index 6de05381..d32c68ac 100644 --- a/lib/mrsk/commands/builder/native.rb +++ b/lib/mrsk/commands/builder/native.rb @@ -1,6 +1,6 @@ -require "mrsk/commands/base" +require "mrsk/commands/builder/base" -class Mrsk::Commands::Builder::Native < Mrsk::Commands::Base +class Mrsk::Commands::Builder::Native < Mrsk::Commands::Builder::Base def create # No-op on native end @@ -11,14 +11,10 @@ class Mrsk::Commands::Builder::Native < Mrsk::Commands::Base def push combine \ - docker(:build, "-t", config.absolute_image, "."), + docker(:build, "-t", *build_args, config.absolute_image, "."), docker(:push, config.absolute_image) end - def pull - docker :pull, config.absolute_image - end - def info # No-op on native end diff --git a/test/builder_command_test.rb b/test/builder_command_test.rb index 2890c910..77fac68d 100644 --- a/test/builder_command_test.rb +++ b/test/builder_command_test.rb @@ -21,4 +21,19 @@ class BuilderCommandTest < ActiveSupport::TestCase builder = Mrsk::Commands::Builder.new(Mrsk::Configuration.new(@config.merge({ builder: { "local" => { }, "remote" => { } } }))) assert builder.remote? end + + test "build args" do + builder = Mrsk::Commands::Builder.new(Mrsk::Configuration.new(@config.merge({ builder: { "args" => { "a" => 1, "b" => 2 } } }))) + assert_equal [ "--build-args", "a=1", "--build-args", "b=2" ], builder.target.build_args + end + + test "native push with build args" do + builder = Mrsk::Commands::Builder.new(Mrsk::Configuration.new(@config.merge({ builder: { "multiarch" => false, "args" => { "a" => 1, "b" => 2 } } }))) + assert_equal [ :docker, :build, "-t", "--build-args", "a=1", "--build-args", "b=2", "dhh/app:123", ".", "&&", :docker, :push, "dhh/app:123" ], builder.push + end + + test "multiarch push with build args" do + builder = Mrsk::Commands::Builder.new(Mrsk::Configuration.new(@config.merge({ builder: { "args" => { "a" => 1, "b" => 2 } } }))) + assert_equal [ :docker, :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", "dhh/app:123", "--build-args", "a=1", "--build-args", "b=2", "." ], builder.push + end end