buildizer 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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