buildizer 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZmJhNmZhMzlhYzZhZDRjZWYwNTFkZDJhYzU4YjNmMTk3ZjA5MWVhOQ==
4
+ NTgxMGMxNTEzOTg5MDhjMmExZGUwOWM3M2JjMmM0NjdhYjNkODBiOA==
5
5
  data.tar.gz: !binary |-
6
- MzZjZTE0MzQ3ODI2YzBkOTc5NzRjOGZhYjdhM2YyYjhhOWFjOWI4Yw==
6
+ MjRhZjU1NzlmOGM3ZjMyMzEzMDk5NDY5ZmQ0ZGJhZGY1ZGI5YjdhMQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZThhYTdlZjNmNTdmZDdmNzRhMTVjOGY1M2U3YjY1NzcxZTRhZTMwZDZiNTc2
10
- YzZmZDY1NjhlYTI2ZWIzZmEzNTZhZDQ4NDE2M2ZiZmZmYzBkMTJkOGQwNzBj
11
- YzA3MTYzMGNhY2I0YzgwOGU2Njc4MWE1OTVhZmE5M2RlYzk1OGY=
9
+ Nzk3ZjIyMzVlMmNhOTczMDk5YjQ3NjA3NTIzNjVhZGE4MTY4NjQzMWY4ZjQ5
10
+ NDc2OWIxZmYyYTE3NzgxMTE4N2ZkYjNmZDQxNzVkMzFjNzc1MWNjMWNmODI0
11
+ ZmI2MzZjYzhiYzY4MmFkMjExMTM3MDJkMDA3M2MzYTNmYmU3ZDk=
12
12
  data.tar.gz: !binary |-
13
- OTIxMGYzZDI0N2JmYmQyZDcwYjdmM2QyNGRjMjg0NzE2NTUzNTJkMDFmY2I2
14
- MGQ0NDhlNjlkMWFhNmFhYzMyOTVmZDkxZGUzNTk5NWNiOThkNzA2ZjExNzc2
15
- NjZiN2NjOGVhY2U2YjE0MDg3NDAwOWZjYzM0YzAwMTI1NzU5Mzc=
13
+ YTljMjYyZmJiZDdmY2E3MDRhNTVjNjY1ZTJmMWQ3NjUyYWU5YTAxNTU4OTE3
14
+ YjRlOTJhOTA4YTc5NjExZjk0ZWQxOTE3ZmIzMThhYjU2YTc2YmQ4OGRkMmVm
15
+ OTNlNWFmZDNmMDBmYWQ2OTE2YWE3ZWQwZGRjYzhjMDQyNjJkNDg=
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  /buildizer*.gem
4
4
  *.swp
5
5
  .tags
6
+ /.bundle
data/Gemfile.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: https://github.com/flant/shellfold.git
3
- revision: 51d8ff898ae1afbfb6463ed2e1ed25571cab347c
3
+ revision: 7429a46664b45ab246ba7a88eac24f614d1945a7
4
4
  specs:
5
5
  shellfold (0.0.3)
6
6
  mixlib-shellout (>= 2.2.6, < 3.0)
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- buildizer (0.0.6)
11
+ buildizer (0.0.7)
12
12
  net_status (>= 0.0.1, < 1.0)
13
13
  package_cloud (>= 0.2, < 1.0)
14
14
  shellfold (>= 0.0.1, < 1.0)
@@ -75,7 +75,7 @@ GEM
75
75
  rspec-core (~> 3.4.0)
76
76
  rspec-expectations (~> 3.4.0)
77
77
  rspec-mocks (~> 3.4.0)
78
- rspec-core (3.4.3)
78
+ rspec-core (3.4.4)
79
79
  rspec-support (~> 3.4.0)
80
80
  rspec-expectations (3.4.0)
81
81
  diff-lcs (>= 1.2.0, < 2.0)
@@ -97,7 +97,7 @@ GEM
97
97
  typhoeus (~> 0.6, >= 0.6.8)
98
98
  typhoeus (0.8.0)
99
99
  ethon (>= 0.8.0)
100
- websocket (1.2.2)
100
+ websocket (1.2.3)
101
101
 
102
102
  PLATFORMS
103
103
  ruby
data/lib/buildizer.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'thor'
2
2
  require 'yaml'
3
+ require 'json'
3
4
  require 'net_status'
4
5
  require 'pathname'
5
6
  require 'shellfold'
@@ -11,13 +12,16 @@ require 'buildizer/docker'
11
12
  require 'buildizer/cli'
12
13
  require 'buildizer/packager'
13
14
  require 'buildizer/target'
15
+ require 'buildizer/target/package_name_mod'
14
16
  require 'buildizer/target/base'
15
17
  require 'buildizer/target/fpm'
16
18
  require 'buildizer/target/native'
19
+ require 'buildizer/target/patch'
17
20
  require 'buildizer/builder'
18
21
  require 'buildizer/builder/base'
19
22
  require 'buildizer/builder/fpm'
20
23
  require 'buildizer/builder/native'
24
+ require 'buildizer/builder/patch'
21
25
  require 'buildizer/image'
22
26
  require 'buildizer/image/base'
23
27
  require 'buildizer/image/centos'
@@ -26,3 +30,4 @@ require 'buildizer/image/centos7'
26
30
  require 'buildizer/image/ubuntu'
27
31
  require 'buildizer/image/ubuntu1204'
28
32
  require 'buildizer/image/ubuntu1404'
33
+ require 'buildizer/image/ubuntu1604'
@@ -1,23 +1,19 @@
1
1
  module Buildizer
2
2
  module Builder
3
3
  class Base
4
+ using Refine
5
+
4
6
  attr_reader :packager
5
- attr_reader :build_path
7
+ attr_reader :work_path
6
8
  attr_reader :docker
7
9
 
8
10
  def initialize(packager)
9
11
  @packager = packager
10
12
 
11
- @build_path = Pathname.new(ENV['PREFIX'] || packager.package_path.join('build')).expand_path
12
- raise Error, message: "bad build prefix: '#{build_path}' is a file" if build_path.file?
13
- build_path.mkdir rescue nil
13
+ @work_path = packager.work_path.join('builder').expand_path
14
+ work_path.mkpath
14
15
 
15
- @docker = Docker.new(self,
16
- username: packager.docker_username,
17
- password: packager.docker_password,
18
- email: packager.docker_email,
19
- server: packager.docker_server,
20
- )
16
+ @docker = Docker.new(self, cache: packager.docker_cache)
21
17
  end
22
18
 
23
19
  def build_type
@@ -28,24 +24,28 @@ module Buildizer
28
24
  raise
29
25
  end
30
26
 
31
- def prepare_image_instructions(target)
32
- end
33
-
34
27
  def build_instructions(target)
35
28
  end
36
29
 
37
- def build_dep
30
+ def build_dep(target)
38
31
  end
39
32
 
40
33
  def new_target(target_name)
41
- os_name, os_version, target_package_name, target_package_version = target_name.split('-', 4)
34
+ os_name, os_version, target_tag = target_name.split('/', 3)
42
35
 
43
36
  image = docker.new_image(os_name, os_version)
44
37
 
45
- params = merge_os_params(image.os_name)
46
- params = merge_os_version_params(image.os_name, image.os_version, into: params)
47
- params = merge_base_target_params(target_name, target_package_name, target_package_version,
48
- into: params) if target_package_name
38
+ params = initial_target_params
39
+ packager.buildizer_conf.each do |match_key, match_params|
40
+ match_os_name, match_os_version, match_target_tag = match_key.to_s.split('/', 3)
41
+ if image.os_name.match_glob?(match_os_name) and
42
+ ( match_os_version.nil? or image.os_version.match_glob?(match_os_version) ) and
43
+ ( match_target_tag.nil? or (not target_tag.nil? and
44
+ target_tag.match_glob?(match_target_tag)) )
45
+ params = merge_params(into: params, params: match_params)
46
+ end
47
+ end
48
+
49
49
  check_params! params
50
50
 
51
51
  target_klass.new(self, image, name: target_name, **params).tap do |target|
@@ -65,6 +65,7 @@ module Buildizer
65
65
  params[:prepare] = packager.prepare
66
66
  params[:build_dep] = packager.build_dep
67
67
  params[:before_build] = packager.before_build
68
+ params[:maintainer] = packager.maintainer
68
69
  end
69
70
  end
70
71
 
@@ -77,96 +78,138 @@ module Buildizer
77
78
 
78
79
  def do_merge_params(into, params)
79
80
  {}.tap do |res|
80
- res[:package_name] = into[:package_name] || params['package_name']
81
- res[:package_version] = into[:package_version] || params['package_version']
81
+ res[:package_name] = params['package_name'] || into[:package_name]
82
+ res[:package_version] = params['package_version'] || into[:package_version]
82
83
  res[:package_cloud] = into[:package_cloud]
83
84
  res[:prepare] = into[:prepare] + Array(params['prepare'])
84
85
  res[:build_dep] = into[:build_dep] | Array(params['build_dep']).to_set
85
86
  res[:before_build] = into[:before_build] + Array(params['before_build'])
87
+ res[:maintainer] = params['maintainer'] || into[:maintainer]
86
88
  end
87
89
  end
88
90
 
89
- def merge_os_params(os_name, into: nil, &blk)
90
- merge_params(into: into, params: packager.os_params(os_name), &blk)
91
+ def check_params!(params)
92
+ _required_params! :package_name, params
91
93
  end
92
94
 
93
- def merge_os_version_params(os_name, os_version, into: nil, &blk)
94
- merge_params(into: into,
95
- params: packager.os_params([os_name, os_version].join('-')), &blk)
95
+ def _required_params!(required_params, params)
96
+ Array(required_params).each do |param|
97
+ unless params[param] and not params[param].to_s.empty?
98
+ raise Error, error: :input_error, message: "#{param} is not defined"
99
+ end
100
+ end
96
101
  end
97
102
 
98
- def merge_base_target_params(target, target_package_name, target_package_version,
99
- into: nil, &blk)
100
- merge_params(into: into,
101
- params: {'package_name' => target_package_name,
102
- 'package_version' => target_package_version}, &blk)
103
+ def build_jobs
104
+ File.open('/proc/cpuinfo').readlines.grep(/processor/).size
103
105
  end
104
106
 
105
- def check_params!(params)
106
- [:package_name, :package_version, :package_cloud].each do |param|
107
- raise(Error,
108
- error: :input_error,
109
- message: "#{param} is not defined") unless params[param] and not params[param].empty?
107
+ def verify
108
+ targets.tap do |res|
109
+ unless res.any?
110
+ raise Error, error: :input_error, message: "target is not defined"
111
+ end
110
112
  end
111
113
  end
112
114
 
113
115
  def prepare
114
- return unless packager.enabled?
116
+ docker.with_cache do
117
+ packager.before_prepare
118
+ .each {|cmd| packager.command! cmd, desc: "Before prepare command: #{cmd}"}
115
119
 
116
- docker.login!
117
-
118
- begin
119
- packager.before_prepare.each {|cmd| packager.command! cmd, desc: "Before prepare command: #{cmd}"}
120
120
  targets.each {|target| prepare_target_image(target)}
121
- packager.after_prepare.each {|cmd| packager.command! cmd, desc: "After prepare command: #{cmd}"}
122
- ensure
123
- docker.logout!
124
- end
121
+
122
+ packager.after_prepare
123
+ .each {|cmd| packager.command! cmd, desc: "After prepare command: #{cmd}"}
124
+ end # with_cache
125
125
  end
126
126
 
127
127
  def prepare_target_image(target)
128
- docker.image_build_path(target.image).mkpath
129
-
130
- (Array(prepare_image_instructions(target)) + target.prepare).each do |cmd|
131
- target.image.instruction(:RUN, "bash -lec \"#{cmd}\"")
132
- end
133
- target.image.build_dep(Array(build_dep).to_set + target.build_dep)
134
- docker.build_image! target.image
128
+ target.prepare.each {|cmd| target.image.instruction(:RUN, "bash -lec \"#{cmd}\"")}
129
+ target.image.build_dep(Array(build_dep(target)).to_set + target.build_dep)
130
+ docker.build_image! target
135
131
  end
136
132
 
137
133
  def build
138
- return unless packager.enabled?
139
134
  targets.each {|target| build_target(target)}
140
135
  end
141
136
 
142
- def build_target(target)
143
- docker.image_runtime_build_path(target.image).mkpath
137
+ def prepare_package_source_instructions(target)
138
+ ["cp -r #{docker.container_package_mount_path} #{target.container_package_path}",
139
+ "rm -rf #{target.container_package_path.join('.git')}",
140
+ "cd #{target.container_package_path.dirname}",
141
+ ["tar -zcvf #{target.container_package_archive_path} ",
142
+ "#{target.container_package_path.basename}"].join,
143
+ "ln -fs #{target.container_package_path} #{docker.container_package_path}",
144
+ "ln -fs #{target.container_package_archive_path} #{docker.container_package_archive_path}"]
145
+ end
144
146
 
147
+ def build_target(target)
145
148
  cmd = [
146
- "cd /package",
149
+ *Array(prepare_package_source_instructions(target)),
150
+ "rm -rf #{docker.container_build_path.join('*')}",
151
+ "cd #{docker.container_package_path}",
147
152
  *target.before_build,
148
153
  *Array(build_instructions(target)),
149
154
  ]
150
155
 
151
- docker.run! target.image, cmd: cmd
156
+ docker.run_in_image!(target: target, cmd: cmd,
157
+ desc: "Run build in docker image '#{target.image.name}'")
152
158
  end
153
159
 
154
160
  def deploy
155
- return unless packager.enabled?
156
- targets.each {|target| deploy_target(target)}
161
+ if packager.package_version_tag_required_for_deploy? and
162
+ not packager.package_version_tag
163
+ puts "package_version_tag (env TRAVIS_TAG or CI_BUILD_TAG) required: ignoring deploy"
164
+ return
165
+ elsif packager.package_cloud.empty?
166
+ warn "No package cloud settings " +
167
+ "(PACKAGECLOUD, PACKAGECLOUD_TOKEN, PACKAGECLOUD_TOKEN_<ORG>) [WARN]"
168
+ return
169
+ end
170
+
171
+ packager.package_cloud_org.each do |org, token|
172
+ unless token
173
+ warn "No packagecloud token defined for org '#{org}' " +
174
+ "(PACKAGECLOUD_TOKEN or PACKAGECLOUD_TOKEN_#{org.upcase}) [WARN]"
175
+ end
176
+ end
177
+
178
+ targets.map do |target|
179
+ target.tap do
180
+ if packager.package_version_tag_required_for_deploy? and
181
+ packager.package_version_tag != target.package_version_tag
182
+ raise(Error, error: :logical_error,
183
+ message: "#{target.package_version_tag_param_name} and "+
184
+ "package_version_tag (env TRAVIS_TAG or CI_BUILD_TAG) " +
185
+ "should be the same for target '#{target.name}'")
186
+ end
187
+ end
188
+ end.each {|target| deploy_target(target)}
157
189
  end
158
190
 
159
191
  def deploy_target(target)
160
- cmd = Dir[docker.image_runtime_build_path(target.image)
161
- .join("*.#{target.image.fpm_output_type}")]
162
- .map {|p| Pathname.new(p)}
163
- .map {|p| ["package_cloud yank #{target.package_cloud_path} #{p.basename}",
164
- "package_cloud push #{target.package_cloud_path} #{p}",
165
- p.basename]}
166
- .each {|yank, push, package|
167
- packager.command yank, desc: "Package cloud yank package '#{package}'"
168
- packager.command! push, desc: "Package cloud push package '#{package}'"
169
- }
192
+ cmd = Dir[target.image_build_path.join("*.#{target.image.fpm_output_type}")]
193
+ .map {|p| Pathname.new(p)}.map {|package_path|
194
+ package = package_path.basename
195
+ target.package_cloud.map do |desc|
196
+ desc.merge(
197
+ package: package,
198
+ yank: "package_cloud yank #{desc[:package_path]} #{package}",
199
+ push: "package_cloud push #{desc[:package_path]} #{package_path}",
200
+ )
201
+ end
202
+ }.flatten.each {|desc|
203
+ packager.command desc[:yank],
204
+ desc: ["Package cloud yank package '#{desc[:package]}'",
205
+ " of target '#{target.name}'"].join,
206
+ environment: {'PACKAGECLOUD_TOKEN' => desc[:token]}
207
+
208
+ packager.command desc[:push],
209
+ desc: ["Package cloud push package '#{desc[:package]}'",
210
+ " of target '#{target.name}'"].join,
211
+ environment: {'PACKAGECLOUD_TOKEN' =>desc[:token]}
212
+ }
170
213
  end
171
214
  end # Base
172
215
  end # Builder
@@ -15,60 +15,29 @@ module Buildizer
15
15
 
16
16
  def initial_target_params
17
17
  super.tap do |params|
18
- raise(Error,
19
- error: :input_error,
20
- message: [
21
- "explicit definition of package_version in #{build_type} ",
22
- "build type is forbidden ",
23
- "(use TRAVIS_TAG, CI_BUILD_TAG env variables)",
24
- ].join) if params[:package_version]
25
- params[:package_version] = packager.package_version_tag
26
18
  params[:fpm_script] = Array(packager.buildizer_conf['fpm_script'])
27
19
  params[:fpm_config_files] = packager.buildizer_conf['fpm_config_files'].to_h
28
20
  params[:fpm_files] = packager.buildizer_conf['fpm_files'].to_h
29
- end
30
- end
31
-
32
- def cannot_redefine_package_params!(params, redefine_for: nil)
33
- [:package_name, :package_version].each do |param|
34
- raise(Error,
35
- error: :input_error,
36
- message: [
37
- "cannot redefine #{param}",
38
- redefine_for ? "for #{redefine_for}" : nil,
39
- "in #{build_type} build_type",
40
- ].compact.join(' ')
41
- ) if params.key? param.to_s
21
+ params[:fpm_conflicts] = Array(packager.buildizer_conf['fpm_conflicts'])
22
+ params[:fpm_replaces] = Array(packager.buildizer_conf['fpm_replaces'])
23
+ params[:fpm_provides] = Array(packager.buildizer_conf['fpm_provides'])
24
+ params[:fpm_depends] = Array(packager.buildizer_conf['fpm_depends'])
25
+ params[:fpm_description] = packager.buildizer_conf['fpm_description']
26
+ params[:fpm_url] = packager.buildizer_conf['fpm_url']
42
27
  end
43
28
  end
44
29
 
45
30
  def do_merge_params(into, params)
46
31
  super.tap do |res|
47
32
  res[:fpm_script] = into[:fpm_script] + Array(params['fpm_script'])
48
- res[:fpm_config_files] = into[:fpm_config_files].merge params['fpm_config_files'].to_h
49
- res[:fpm_files] = into[:fpm_files].merge params['fpm_files'].to_h
50
- end
51
- end
52
-
53
- def merge_os_params(os_name, **kwargs, &blk)
54
- super(os_name, **kwargs) do |into, params|
55
- yield into, params if block_given?
56
- cannot_redefine_package_params!(params, redefine_for: "os '#{os_name}'")
57
- end
58
- end
59
-
60
- def merge_os_version_params(os_name, os_version, **kwargs, &blk)
61
- super(os_name, os_version, **kwargs) do |into, params|
62
- yield into, params if block_given?
63
- cannot_redefine_package_params!(params,
64
- redefine_for: "os version '#{os_name}-#{os_version}'")
65
- end
66
- end
67
-
68
- def merge_base_target_params(target, target_package_name, target_package_version, **kwargs, &blk)
69
- super(target, target_package_name, target_package_version, **kwargs) do |into, params|
70
- yield into, params if block_given?
71
- cannot_redefine_package_params!(params, redefine_for: "target '#{target}'")
33
+ res[:fpm_config_files] = into[:fpm_config_files].merge(params['fpm_config_files'].to_h)
34
+ res[:fpm_files] = into[:fpm_files].merge(params['fpm_files'].to_h)
35
+ res[:fpm_conflicts] = (into[:fpm_conflicts] + Array(params['fpm_conflicts'])).uniq
36
+ res[:fpm_replaces] = (into[:fpm_replaces] + Array(params['fpm_replaces'])).uniq
37
+ res[:fpm_provides] = (into[:fpm_provides] + Array(params['fpm_provides'])).uniq
38
+ res[:fpm_depends] = (into[:fpm_depends] + Array(params['fpm_depends'])).uniq
39
+ res[:fpm_description] = params['fpm_description'] || into[:fpm_description]
40
+ res[:fpm_url] = params['fpm_url'] || into[:fpm_url]
72
41
  end
73
42
  end
74
43
 
@@ -79,6 +48,7 @@ module Buildizer
79
48
  message: ["either of fpm_files or fpm_config_files ",
80
49
  "required in #{build_type} build_type"].join
81
50
  end
51
+ _required_params! :package_version, params
82
52
  end
83
53
 
84
54
  def build_instructions(target)
@@ -96,9 +66,8 @@ module Buildizer
96
66
  message: "unknown fpm_script event #{_when.inspect}"
97
67
  ) unless FPM_SCRIPT_EVENTS.include? _when
98
68
  res[_when] ||= {fpm_option: "--#{_when.split('_').join('-')}",
99
- file: docker.image_runtime_build_path(target.image)
100
- .join("fpm_#{_when}.sh"),
101
- container_file: Pathname.new('/package/build').join("fpm_#{_when}.sh"),
69
+ file: target.image_extra_path.join("fpm_#{_when}.sh"),
70
+ container_file: docker.container_extra_path.join("fpm_#{_when}.sh"),
102
71
  cmd: []}
103
72
  res[_when][:cmd] += cmd
104
73
  end
@@ -121,8 +90,16 @@ module Buildizer
121
90
  "--iteration=#{release}",
122
91
  *fpm_script.values.map {|desc| "#{desc[:fpm_option]}=#{desc[:container_file]}"},
123
92
  *Array(target.image.fpm_extra_params),
124
- *target.fpm_config_files.values.map {|p| "--config-files=#{p}"},
125
- *target.fpm_files.merge(target.fpm_config_files).map {|p1, p2| "#{p1}=#{p2}"}].join(' ')
93
+ (target.maintainer ? "--maintainer=\"#{target.maintainer}\"" : nil),
94
+ (target.fpm_description ? "--description=\"#{target.fpm_description}\"" : nil),
95
+ (target.fpm_url ? "--url=\"#{target.fpm_url}\"" : nil),
96
+ *target.fpm_conflicts.map{|pkg| "--conflicts=#{pkg}"},
97
+ *target.fpm_replaces.map{|pkg| "--replaces=#{pkg}"},
98
+ *target.fpm_provides.map{|pkg| "--provides=#{pkg}"},
99
+ *target.fpm_depends.map{|pkg| "--depends=#{pkg}"},
100
+ *target.fpm_config_files_expand.keys.map {|p| "--config-files=#{p}"},
101
+ *target.fpm_files_expand.merge(target.fpm_config_files_expand).map {|p1, p2| "#{p2}=#{p1}"},
102
+ ].compact.join(' ')
126
103
  end
127
104
  end # Fpm
128
105
  end # Builder