discourse_docker/image/auto_build.rb

162 lines
4.6 KiB
Ruby

require "pty"
require "optparse"
images = {
base_deps_amd64: {
name: "base",
tag: "discourse/base:build_deps_amd64",
extra_args: "--target discourse_dependencies",
},
base_deps_arm64: {
name: "base",
tag: "discourse/base:build_deps_arm64",
extra_args: "--platform linux/arm64 --target discourse_dependencies",
},
base_slim_main_amd64: {
name: "base",
tag: "discourse/base:build_slim_main_amd64",
extra_args: "--target discourse_slim",
use_cache: true,
},
base_slim_stable_amd64: {
name: "base",
tag: "discourse/base:build_slim_main_amd64",
extra_args: "--target discourse_slim --build-arg=\"DISCOURSE_BRANCH=stable\"",
use_cache: true,
},
base_slim_main_arm64: {
name: "base",
tag: "discourse/base:build_slim_main_arm64",
extra_args: "--platform linux/arm64 --target discourse_slim",
use_cache: true,
},
base_slim_stable_arm64: {
name: "base",
tag: "discourse/base:build_slim_stable_arm64",
extra_args:
"--platform linux/arm64 --target discourse_slim --build-arg=\"DISCOURSE_BRANCH=stable\"",
use_cache: true,
},
base_release_main_amd64: {
name: "base",
tag: "discourse/base:build_release_main_amd64",
extra_args: "--build-arg=\"DISCOURSE_BRANCH=main\" --target discourse_release",
use_cache: true,
},
base_release_main_amd64_pg_15: {
name: "base",
tag: "discourse/base:build_release_main_amd64_pg_15",
extra_args:
"--build-arg=\"DISCOURSE_BRANCH=main\" --target discourse_release --build-arg PG_MAJOR=15",
use_cache: true,
},
base_release_main_arm64: {
name: "base",
tag: "discourse/base:build_release_main_arm64",
extra_args:
"--platform linux/arm64 --build-arg=\"DISCOURSE_BRANCH=main\" --target discourse_release",
use_cache: true,
},
base_release_main_arm64_pg_15: {
name: "base",
tag: "discourse/base:build_release_main_arm64_pg_15",
extra_args:
"--build-arg=\"DISCOURSE_BRANCH=main\" --target discourse_release --build-arg PG_MAJOR=15",
use_cache: true,
},
base_release_stable_amd64: {
name: "base",
tag: "discourse/base:build_release_stable_amd64",
extra_args: "--build-arg=\"DISCOURSE_BRANCH=stable\" --target discourse_release",
use_cache: true,
},
base_release_stable_arm64: {
name: "base",
tag: "discourse/base:build_release_stable_arm64",
extra_args:
"--platform linux/arm64 --build-arg=\"DISCOURSE_BRANCH=stable\" --target discourse_release",
use_cache: true,
},
discourse_test_build_amd64: {
name: "discourse_test",
tag: "discourse/discourse_test:build_amd64",
extra_args: "--build-arg=\"from_tag=build_release_main_amd64\"",
},
discourse_test_build_arm64: {
name: "discourse_test",
tag: "discourse/discourse_test:build_arm64",
extra_args: "--platform linux/arm64 --build-arg=\"from_tag=build_release_main_arm64\"",
},
discourse_dev_amd64: {
name: "discourse_dev",
tag: "discourse/discourse_dev:build_amd64",
extra_args: "--build-arg=\"from_tag=build_slim_main_amd64\"",
},
discourse_dev_arm64: {
name: "discourse_dev",
tag: "discourse/discourse_dev:build_arm64",
extra_args: "--platform linux/arm64 --build-arg=\"from_tag=build_slim_main_arm64\"",
},
}
def run(command)
lines = []
PTY.spawn(command) do |stdout, stdin, pid|
begin
stdout.each do |line|
lines << line
puts line
end
rescue Errno::EIO
# we are done
end
Process.wait(pid)
end
raise "'#{command}' exited with status #{$?.exitstatus}" if $?.exitstatus != 0
lines
end
def build(image, cli_args)
lines =
run(
"cd #{image[:name]} && docker buildx build . --load #{image[:use_cache] == true ? "" : "--no-cache"} --tag #{image[:tag]} #{image[:extra_args] ? image[:extra_args] : ""} #{cli_args}",
)
if lines[-1] =~ /successfully built/
raise "Error building the image for #{image[:name]}: #{lines[-1]}"
end
end
def dev_deps()
run(
"sed -e 's/\(db_name: discourse\)/\1_development/' ../templates/postgres.template.yml > discourse_dev/postgres.template.yml",
)
run("cp ../templates/redis.template.yml discourse_dev/redis.template.yml")
run("cp base/install-rust discourse_dev/install-rust")
end
if ARGV.length == 0
puts <<~TEXT
Usage:
ruby auto_build.rb IMAGE
Available images:
#{images.keys.join(", ")}
TEXT
exit 1
else
image = ARGV[0].to_sym
if !images.include?(image)
$stderr.puts "Image not found"
exit 1
end
puts "Building #{images[image]}"
dev_deps() if image == :discourse_dev_amd64 || image == :discourse_dev_arm64
build(images[image], ARGV[1..-1].join(" "))
end