Files
kamal/lib/kamal/configuration/builder.rb
2024-08-29 20:16:34 +01:00

154 lines
3.0 KiB
Ruby

class Kamal::Configuration::Builder
include Kamal::Configuration::Validation
attr_reader :config, :builder_config
delegate :image, :service, to: :config
delegate :server, to: :"config.registry"
def initialize(config:)
@config = config
@builder_config = config.raw_config.builder || {}
@image = config.image
@server = config.registry.server
@service = config.service
validate! builder_config, with: Kamal::Configuration::Validator::Builder
end
def to_h
builder_config
end
def multiarch?
builder_config["multiarch"] != false
end
def local?
!!builder_config["local"]
end
def remote?
!!builder_config["remote"]
end
def cached?
!!builder_config["cache"]
end
def args
builder_config["args"] || {}
end
def secrets
builder_config["secrets"] || []
end
def dockerfile
builder_config["dockerfile"] || "Dockerfile"
end
def target
builder_config["target"]
end
def context
builder_config["context"] || "."
end
def local_arch
builder_config["local"]["arch"] if local?
end
def local_host
builder_config["local"]["host"] if local?
end
def remote_arch
builder_config["remote"]["arch"] if remote?
end
def remote_host
builder_config["remote"]["host"] if remote?
end
def cache_from
if cached?
case builder_config["cache"]["type"]
when "gha"
cache_from_config_for_gha
when "registry"
cache_from_config_for_registry
end
end
end
def cache_to
if cached?
case builder_config["cache"]["type"]
when "gha"
cache_to_config_for_gha
when "registry"
cache_to_config_for_registry
end
end
end
def ssh
builder_config["ssh"]
end
def git_clone?
Kamal::Git.used? && builder_config["context"].nil?
end
def clone_directory
@clone_directory ||= File.join Dir.tmpdir, "kamal-clones", [ service, pwd_sha ].compact.join("-")
end
def build_directory
@build_directory ||=
if git_clone?
File.join clone_directory, repo_basename, repo_relative_pwd
else
"."
end
end
private
def cache_image
builder_config["cache"]&.fetch("image", nil) || "#{image}-build-cache"
end
def cache_image_ref
[ server, cache_image ].compact.join("/")
end
def cache_from_config_for_gha
"type=gha"
end
def cache_from_config_for_registry
[ "type=registry", "ref=#{cache_image_ref}" ].compact.join(",")
end
def cache_to_config_for_gha
[ "type=gha", builder_config["cache"]&.fetch("options", nil) ].compact.join(",")
end
def cache_to_config_for_registry
[ "type=registry", builder_config["cache"]&.fetch("options", nil), "ref=#{cache_image_ref}" ].compact.join(",")
end
def repo_basename
File.basename(Kamal::Git.root)
end
def repo_relative_pwd
Dir.pwd.delete_prefix(Kamal::Git.root)
end
def pwd_sha
Digest::SHA256.hexdigest(Dir.pwd)[0..12]
end
end