Adds Makefile functions to build.rb
[discourse_docker.git] / image / build.rb
1 # simple build file to be used locally by Sam
2 #
3 require 'pty'
4 require 'optparse'
5
6 def run(command)
7 lines = []
8 PTY.spawn(command) do |stdin, stdout, pid|
9 begin
10 stdin.each do |line|
11 lines << line
12 puts line
13 end
14 rescue Errno::EIO
15 # we are done
16 end
17 end
18
19 lines
20 end
21
22 def ensure_docker_squash
23 docker_squash = "https://github.com/goldmann/docker-squash/archive/master.zip"
24 run ("pip install --user #{$docker_squash} --upgrade")
25 end
26
27
28 def build(image, version)
29 lines = run("cd #{image[:name]} && docker build --build-arg version=#{version} .")
30 img = lines[-1]["successfully built ".length..-1].strip
31
32 if image[:squash]
33
34 layers_to_squash = run("docker history #{img} | wc -l").first.to_i - (1 + image[:layers_to_keep])
35
36 if layers_to_keep != nil
37 run("docker-squash -t #{image[:tag]} --verbose -f #{layers_to_squash} #{img}")
38 else
39 run("docker-squash -t #{image[:tag]} --verbose #{img}")
40 end
41
42 else
43 run("docker tag #{img} #{image[:tag]}")
44 end
45 end
46
47 def bump(image, image_version)
48 run("sed -i '' -e 's/^\(# NAME:\).*$$/\1 discourse\/#{image_dir}/' #{image_dir}/Dockerfile")
49 run("sed -i '' -e 's/^\(# VERSION:\).*$$/\1 #{image_version}/' #{image_dir}/Dockerfile")
50 run("sed -i '' -e 's/^\(FROM discourse\/[^:]*:\).*/\1#{image_version}/' #{image_dir}/Dockerfile")
51 end
52
53 options = {}
54 OptionParser.new do |parser|
55 parser.on("-i", "--image image",
56 "Build the image. No parameter means [base discourse discourse_test].") do |i|
57 options[:image] = [i]
58 end
59 parser.on("-b", "--bump version",
60 "Bumps the version in the Dockerfiles specified by --image") do |v|
61 options[:version] = [v]
62 end
63 end.parse!
64
65 DEFAULT_IMAGES = %i[base discourse discourse_test discourse_dev discourse_bench]
66
67 todo = options[:image] || DEFAULT_IMAGES
68 version = options[:version] || '1.3.7'
69
70 if ENV["USER"] != "root"
71 STDERR.puts "Build script must be ran as root due to docker-squash"
72 exit 1
73 end
74
75 ensure_docker_squash
76
77 images = {
78 base: { name: 'base', tag: "discourse/base:#{version}", squash: true },
79 discourse: { name: 'discourse', tag: "discourse/discourse:#{version}", squash: true, layers_to_keep: 1 },
80 discourse_test: { name: 'discourse_test', tag: "discourse/discourse_test:#{version}", squash: true, layers_to_keep: 2 },
81 discourse_dev: { name: 'discourse_dev', tag: "discourse/discourse_dev:#{version}", squash: false },
82 discourse_bench: { name: 'discourse_bench', tag: "discourse/discourse_bench:#{version}", squash: false }
83 }
84
85 todo.each do |image|
86 puts images[image]
87 bump(images[image][:name], options[:version]) if options[:version]
88 run "(cd base && ./download_phantomjs)" if image == 'base'
89 build(images[image], version)
90 end