Add option for two-part configs with the destination option

This commit is contained in:
David Heinemeier Hansson
2023-01-17 13:35:55 +01:00
parent 98af1d3d96
commit 9a84460754
8 changed files with 75 additions and 16 deletions

View File

@@ -1,9 +1,9 @@
require "mrsk"
MRSK = Mrsk::Commander.new \
config_file: Pathname.new(File.expand_path("config/deploy.yml"))
module Mrsk::Cli
end
# SSHKit uses instance eval, so we need a global const for ergonomics
MRSK = Mrsk::Commander.new
require "mrsk/cli/main"

View File

@@ -10,12 +10,23 @@ module Mrsk::Cli
class_option :verbose, type: :boolean, aliases: "-v", desc: "Detailed logging"
class_option :config_file, aliases: "-c", default: "config/deploy.yml", desc: "Path to config file (default: config/deploy.yml)"
class_option :destination, aliases: "-d", desc: "Specify destination to be used for config file (west -> deploy.west.yml)"
def initialize(*)
super
MRSK.verbose = options[:verbose]
initialize_commander(options)
end
private
def initialize_commander(options)
MRSK.tap do |commander|
commander.config_file = Pathname.new(File.expand_path(options[:config_file]))
commander.destination = options[:destination]
commander.verbose = options[:verbose]
end
end
def print_runtime
started_at = Time.now
yield

View File

@@ -6,15 +6,14 @@ require "mrsk/commands/traefik"
require "mrsk/commands/registry"
class Mrsk::Commander
attr_reader :config
attr_accessor :verbose
attr_accessor :config_file, :destination, :verbose
def initialize(config_file:)
@config_file = config_file
def initialize(config_file: nil, destination: nil, verbose: false)
@config_file, @destination, @verbose = config_file, destination, verbose
end
def config
@config ||= Mrsk::Configuration.load_file(@config_file).tap { |config| setup_with(config) }
@config ||= Mrsk::Configuration.create_from(config_file, destination: destination).tap { |config| setup_with(config) }
end

View File

@@ -9,17 +9,32 @@ class Mrsk::Configuration
delegate :service, :image, :servers, :env, :labels, :registry, :builder, to: :config, allow_nil: true
class << self
def load_file(file)
if file.exist?
new YAML.load(ERB.new(IO.read(file)).result).symbolize_keys
else
raise "Configuration file not found in #{file}"
end
def create_from(base_config_file, destination: nil)
new(load_config_file(base_config_file).tap do |config|
if destination
config.merge! \
load_config_file destination_config_file(base_config_file, destination)
end
end)
end
def argumentize(argument, attributes, redacted: false)
attributes.flat_map { |k, v| [ argument, redacted ? Mrsk::Utils.redact("#{k}=#{v}") : "#{k}=#{v}" ] }
end
private
def load_config_file(file)
if file.exist?
YAML.load(ERB.new(IO.read(file)).result).symbolize_keys
else
raise "Configuration file not found in #{file}"
end
end
def destination_config_file(base_config_file, destination)
dir, basename = base_config_file.split
dir.join basename.to_s.remove(".yml") + ".#{destination}.yml"
end
end
def initialize(config, validate: true)