From b3992973d676ae6451a44bacd531946bdddbe8b5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 12 Jan 2023 18:16:52 +0100 Subject: [PATCH] Extract builder from app Building is different from running --- lib/mrsk/commander.rb | 5 +++++ lib/mrsk/commands/app.rb | 12 ------------ lib/mrsk/commands/builder.rb | 15 +++++++++++++++ lib/tasks/mrsk/app.rake | 22 ---------------------- lib/tasks/mrsk/builder.rake | 27 +++++++++++++++++++++++++++ lib/tasks/mrsk/mrsk.rake | 4 ++-- 6 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 lib/mrsk/commands/builder.rb create mode 100644 lib/tasks/mrsk/builder.rake diff --git a/lib/mrsk/commander.rb b/lib/mrsk/commander.rb index e0dabe10..e6cffd9b 100644 --- a/lib/mrsk/commander.rb +++ b/lib/mrsk/commander.rb @@ -1,5 +1,6 @@ require "mrsk/configuration" require "mrsk/commands/app" +require "mrsk/commands/builder" require "mrsk/commands/prune" require "mrsk/commands/traefik" require "mrsk/commands/registry" @@ -20,6 +21,10 @@ class Mrsk::Commander @app ||= Mrsk::Commands::App.new(config) end + def builder + @builder ||= Mrsk::Commands::Builder.new(config) + end + def traefik @traefik ||= Mrsk::Commands::Traefik.new(config) end diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 0eece1e0..7e613507 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -1,14 +1,6 @@ require "mrsk/commands/base" class Mrsk::Commands::App < Mrsk::Commands::Base - def push - docker :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", config.absolute_image, "." - end - - def pull - docker :pull, config.absolute_image - end - def run(role: :web) role = config.role(role) @@ -64,10 +56,6 @@ class Mrsk::Commands::App < Mrsk::Commands::Base docker :image, :prune, "-a", "-f", *service_filter end - def create_new_builder - docker :buildx, :create, "--use", "--name", "mrsk" - end - private def service_filter [ "--filter", "label=service=#{config.service}" ] diff --git a/lib/mrsk/commands/builder.rb b/lib/mrsk/commands/builder.rb new file mode 100644 index 00000000..f6e9caf2 --- /dev/null +++ b/lib/mrsk/commands/builder.rb @@ -0,0 +1,15 @@ +require "mrsk/commands/base" + +class Mrsk::Commands::Builder < Mrsk::Commands::Base + def create + docker :buildx, :create, "--use", "--name", "mrsk" + end + + def push + docker :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", config.absolute_image, "." + end + + def pull + docker :pull, config.absolute_image + end +end diff --git a/lib/tasks/mrsk/app.rake b/lib/tasks/mrsk/app.rake index 684cdf1d..5f8aef3f 100644 --- a/lib/tasks/mrsk/app.rake +++ b/lib/tasks/mrsk/app.rake @@ -2,28 +2,6 @@ require_relative "setup" namespace :mrsk do namespace :app do - desc "Deliver a newly built app image to servers" - task deliver: %i[ push pull ] - - desc "Build locally and push app image to registry" - task :push do - run_locally do - begin - info "Building multi-architecture images may take a while (run with VERBOSE=1 for progress logging)" - execute *MRSK.app.push - rescue SSHKit::Command::Failed => e - error "Missing compatible buildx builder, so creating a new one first" - execute *MRSK.app.create_new_builder - execute *MRSK.app.push - end - end unless ENV["VERSION"] - end - - desc "Pull app image from the registry onto servers" - task :pull do - on(MRSK.config.hosts) { execute *MRSK.app.pull } - end - desc "Run app on servers (or start them if they've already been run)" task :run do MRSK.config.roles.each do |role| diff --git a/lib/tasks/mrsk/builder.rake b/lib/tasks/mrsk/builder.rake new file mode 100644 index 00000000..34bcc17c --- /dev/null +++ b/lib/tasks/mrsk/builder.rake @@ -0,0 +1,27 @@ +require_relative "setup" + +namespace :mrsk do + namespace :builder do + desc "Deliver a newly built app image to servers" + task deliver: %i[ push pull ] + + desc "Build locally and push app image to registry" + task :push do + run_locally do + begin + info "Building multi-architecture images may take a while (run with VERBOSE=1 for progress logging)" + execute *MRSK.builder.push + rescue SSHKit::Command::Failed => e + error "Missing compatible buildx builder, so creating a new one first" + execute *MRSK.builder.create + execute *MRSK.builder.push + end + end unless ENV["VERSION"] + end + + desc "Pull app image from the registry onto servers" + task :pull do + on(MRSK.config.hosts) { execute *MRSK.builder.pull } + end + end +end diff --git a/lib/tasks/mrsk/mrsk.rake b/lib/tasks/mrsk/mrsk.rake index b1de448c..35a317cd 100644 --- a/lib/tasks/mrsk/mrsk.rake +++ b/lib/tasks/mrsk/mrsk.rake @@ -2,10 +2,10 @@ require_relative "setup" namespace :mrsk do desc "Deploy app for the first time to a fresh server" - task fresh: %w[ server:bootstrap registry:login app:deliver traefik:run app:stop app:run ] + task fresh: %w[ server:bootstrap registry:login builder:deliver traefik:run app:stop app:run ] desc "Push the latest version of the app, ensure Traefik is running, then restart app" - task deploy: %w[ registry:login app:deliver traefik:run app:stop app:run prune ] + task deploy: %w[ registry:login builder:deliver traefik:run app:stop app:run prune ] desc "Rollback to VERSION=x that was already run as a container on servers" task rollback: %w[ app:restart ]