buildizer 0.1.0 → 0.1.1

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.
@@ -0,0 +1,4 @@
1
+ module Buildizer
2
+ module Os
3
+ end # Os
4
+ end # Buildizer
@@ -0,0 +1,69 @@
1
+ module Buildizer
2
+ module Os
3
+ class Base
4
+ attr_reader :docker
5
+
6
+ def initialize(docker, **kwargs)
7
+ @docker = docker
8
+ end
9
+
10
+ def base_image_name
11
+ "buildizer/#{base_vendor_image_name}"
12
+ end
13
+
14
+ def base_vendor_image_name
15
+ "#{name}:#{version}"
16
+ end
17
+
18
+ def name
19
+ raise
20
+ end
21
+
22
+ def package_cloud_os_name
23
+ name
24
+ end
25
+
26
+ def package_cloud_os_version
27
+ version
28
+ end
29
+
30
+ def version
31
+ raise
32
+ end
33
+
34
+ def fpm_output_type
35
+ raise
36
+ end
37
+
38
+ def fpm_extra_params
39
+ end
40
+
41
+ def build_dep(image, build_dep)
42
+ raise
43
+ end
44
+
45
+ def patch_build_dep(target)
46
+ target_package_spec(target)
47
+ end
48
+
49
+ def native_build_instructions(target)
50
+ raise
51
+ end
52
+
53
+ def patch_build_instructions(target)
54
+ raise
55
+ end
56
+
57
+ def target_package_spec(target)
58
+ raise
59
+ end
60
+
61
+ def install_test_package_instructions(target)
62
+ raise
63
+ end
64
+
65
+ def prepare_test_container_instructions(target)
66
+ end
67
+ end # Base
68
+ end # Os
69
+ end # Buildizer
@@ -1,23 +1,23 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Centos < Base
4
- attr_reader :os_version
4
+ attr_reader :version
5
5
 
6
- def initialize(docker, os_version, **kwargs)
7
- @os_version = os_version
6
+ def initialize(docker, version, **kwargs)
7
+ @version = version
8
8
  super(docker, **kwargs)
9
9
  end
10
10
 
11
- def os_name
11
+ def name
12
12
  'centos'
13
13
  end
14
14
 
15
- def os_package_cloud_name
15
+ def package_cloud_os_name
16
16
  'el'
17
17
  end
18
18
 
19
- def os_package_cloud_version
20
- os_version.match(/\d+$/).to_s.to_i
19
+ def package_cloud_os_version
20
+ version.match(/\d+$/).to_s.to_i
21
21
  end
22
22
 
23
23
  def fpm_output_type
@@ -30,11 +30,19 @@ module Buildizer
30
30
  end
31
31
  end
32
32
 
33
- def build_dep(build_dep)
34
- instruction :RUN, "yum-builddep -y #{build_dep.to_a.join(' ')}" if build_dep.any?
33
+ def install_test_package_instructions(target)
34
+ "yum localinstall -y #{target.builder.docker.container_build_path.join('*.rpm')}"
35
35
  end
36
36
 
37
- def add_repo(id:, name:, baseurl: nil, enabled: 1, gpgcheck: nil, gpgkey: nil, exclude: nil, includepkgs: nil, mirrorlist: nil)
37
+ def prepare_test_container_instructions(target)
38
+ "yum install -y git"
39
+ end
40
+
41
+ def build_dep(image, build_dep)
42
+ image.instruction :RUN, "yum-builddep -y #{build_dep.to_a.join(' ')}" if build_dep.any?
43
+ end
44
+
45
+ def add_repo(image, id:, name:, baseurl: nil, enabled: 1, gpgcheck: nil, gpgkey: nil, exclude: nil, includepkgs: nil, mirrorlist: nil)
38
46
  repo = "[#{id}]\
39
47
  \\nname=#{name}\
40
48
  \\nenabled=#{enabled}\
@@ -45,32 +53,32 @@ module Buildizer
45
53
  #{exclude ? "\\nexclude=#{exclude}" : nil}\
46
54
  #{includepkgs ? "\\nincludepkgs=#{includepkgs}" : nil}"
47
55
 
48
- instruction :RUN, "bash -lec \"echo -e '#{repo}' >> /etc/yum.repos.d/CentOS-Extra-Buildizer.repo\""
56
+ image.instruction :RUN, "bash -lec \"echo -e '#{repo}' >> /etc/yum.repos.d/CentOS-Extra-Buildizer.repo\""
49
57
  end
50
58
 
51
59
  def target_spec_name(target)
52
60
  "#{target.base_package_name}.spec"
53
61
  end
54
62
 
55
- def rpmdev_setuptree_instructions(builder, target)
63
+ def rpmdev_setuptree_instructions(target)
56
64
  "rpmdev-setuptree"
57
65
  end
58
66
 
59
- def build_rpm_instructions(builder, target)
67
+ def build_rpm_instructions(target)
60
68
  ["cd ~/rpmbuild/SPECS/",
61
69
  "rpmbuild -bb #{target_spec_name(target)}",
62
70
  ["find ~/rpmbuild/RPMS -name '*.rpm' ",
63
- "-exec mv {} #{builder.docker.container_build_path} \\;"].join]
71
+ "-exec mv {} #{target.builder.docker.container_build_path} \\;"].join]
64
72
  end
65
73
 
66
- def native_build_instructions(builder, target)
67
- [*Array(rpmdev_setuptree_instructions(builder, target)),
68
- "cp #{builder.docker.container_package_archive_path} ~/rpmbuild/SOURCES/",
69
- "cp #{builder.docker.container_package_path.join(target_spec_name(target))} ~/rpmbuild/SPECS/",
70
- *Array(build_rpm_instructions(builder, target))]
74
+ def native_build_instructions(target)
75
+ [*Array(rpmdev_setuptree_instructions(target)),
76
+ "cp #{target.builder.docker.container_package_archive_path} ~/rpmbuild/SOURCES/",
77
+ "cp #{target.builder.docker.container_package_path.join(target_spec_name(target))} ~/rpmbuild/SPECS/",
78
+ *Array(build_rpm_instructions(target))]
71
79
  end
72
80
 
73
- def patch_build_instructions(builder, target)
81
+ def patch_build_instructions(target)
74
82
  rpmchange_cmd = "rpmchange %{cmd} --specfile ~/rpmbuild/SPECS/#{target_spec_name(target)} %{args}"
75
83
  get_release_cmd = rpmchange_cmd % {cmd: :tag, args: "--name release"}
76
84
  set_release_cmd = rpmchange_cmd % {cmd: :tag, args: "--name release --value %{value}"}
@@ -79,7 +87,7 @@ module Buildizer
79
87
  args: "--append --name \"%{name}\" --email \"%{email}\" --message \"%{message}\""
80
88
  }
81
89
 
82
- [*Array(rpmdev_setuptree_instructions(builder, target)),
90
+ [*Array(rpmdev_setuptree_instructions(target)),
83
91
  "yumdownloader --source #{target_package_spec(target)}",
84
92
  "rpm -i *.rpm",
85
93
  "gem install rpmchange",
@@ -92,12 +100,12 @@ module Buildizer
92
100
  changelog_cmd % {name: target.maintainer,
93
101
  email: target.maintainer_email,
94
102
  message: 'Patch by buildizer'},
95
- *Array(build_rpm_instructions(builder, target))]
103
+ *Array(build_rpm_instructions(target))]
96
104
  end
97
105
 
98
106
  def target_package_spec(target)
99
107
  [target.package_name, target.package_version].compact.join('-')
100
108
  end
101
109
  end # Centos
102
- end # Image
110
+ end # Os
103
111
  end # Buildizer
@@ -1,9 +1,9 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Centos6 < Centos
4
4
  def initialize(docker, **kwargs)
5
5
  super(docker, 'centos6', **kwargs)
6
6
  end
7
7
  end # Centos6
8
- end # Image
8
+ end # Os
9
9
  end # Buildizer
@@ -1,9 +1,9 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Centos7 < Centos
4
4
  def initialize(docker, **kwargs)
5
5
  super(docker, 'centos7', **kwargs)
6
6
  end
7
7
  end # Centos7
8
- end # Image
8
+ end # Os
9
9
  end # Buildizer
@@ -1,27 +1,27 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Ubuntu < Base
4
- attr_reader :os_version
4
+ attr_reader :version
5
5
 
6
- def initialize(docker, os_version, **kwargs)
7
- @os_version = os_version
6
+ def initialize(docker, version, **kwargs)
7
+ @version = version
8
8
  super(docker, **kwargs)
9
9
  end
10
10
 
11
- def os_name
11
+ def name
12
12
  'ubuntu'
13
13
  end
14
14
 
15
- def os_codename
15
+ def codename
16
16
  raise
17
17
  end
18
18
 
19
- def os_package_cloud_version
20
- os_codename
19
+ def package_cloud_os_version
20
+ codename
21
21
  end
22
22
 
23
- def build_dep(build_dep)
24
- instruction :RUN, "apt-get build-dep -y #{build_dep.to_a.join(' ')}" if build_dep.any?
23
+ def build_dep(image, build_dep)
24
+ image.instruction :RUN, "apt-get build-dep -y #{build_dep.to_a.join(' ')}" if build_dep.any?
25
25
  end
26
26
 
27
27
  def fpm_output_type
@@ -35,36 +35,46 @@ module Buildizer
35
35
  end
36
36
  end
37
37
 
38
- def build_deb_instructions(builder, target)
39
- ["DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -b -us -uc -j#{builder.build_jobs}",
40
- "cp ../*.deb #{builder.docker.container_build_path}"]
38
+ def install_test_package_instructions(target)
39
+ "(dpkg -i #{target.builder.docker.container_build_path.join('*.deb')} || true)" +
40
+ " && apt-get install -yf"
41
41
  end
42
42
 
43
- def native_build_instructions(builder, target)
43
+ def prepare_test_container_instructions(target)
44
+ ["apt-get update",
45
+ "apt-get install -y git"]
46
+ end
47
+
48
+ def build_deb_instructions(target)
49
+ ["DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -b -us -uc -j#{target.builder.build_jobs}",
50
+ "cp ../*.deb #{target.builder.docker.container_build_path}"]
51
+ end
52
+
53
+ def native_build_instructions(target)
44
54
  source_archive_name = "#{target.package_name}_#{target.package_upstream_version}.orig.tar.gz"
45
55
 
46
56
  [["ln -fs #{target.container_package_archive_path} ",
47
57
  "#{target.container_package_path.dirname.join(source_archive_name)}"].join,
48
58
  "cd #{target.container_package_path}",
49
- *Array(build_deb_instructions(builder, target))]
59
+ *Array(build_deb_instructions(target))]
50
60
  end
51
61
 
52
- def patch_build_instructions(builder, target)
62
+ def patch_build_instructions(target)
53
63
  ["apt-get source #{target_package_spec(target)}",
54
64
  'cd $(ls *.orig.tar* | ruby -ne "puts \$_.split(\\".orig.tar\\").first.gsub(\\"_\\", \\"-\\")")',
55
65
  ["DEBFULLNAME=\"#{target.maintainer}\" DEBEMAIL=\"#{target.maintainer_email}\" ",
56
66
  "debchange --newversion ",
57
67
  "$(dpkg-parsechangelog | grep \"Version:\" | cut -d\" \" -f2-)buildizer#{target.patch_version} ",
58
- "--distribution #{os_codename} \"Patch by buildizer\""].join,
68
+ "--distribution #{codename} \"Patch by buildizer\""].join,
59
69
  *target.patch.map {|patch| "cp ../#{patch} debian/patches/"},
60
70
  *target.patch.map {|patch| "sed -i \"/#{Regexp.escape(patch)}/d\" debian/patches/series"},
61
71
  *target.patch.map {|patch| "echo #{patch} >> debian/patches/series"},
62
- *Array(build_deb_instructions(builder, target))]
72
+ *Array(build_deb_instructions(target))]
63
73
  end
64
74
 
65
75
  def target_package_spec(target)
66
76
  [target.package_name, target.package_version].compact.join('=')
67
77
  end
68
78
  end # Ubuntu
69
- end # Image
79
+ end # Os
70
80
  end # Buildizer
@@ -1,13 +1,13 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Ubuntu1204 < Ubuntu
4
4
  def initialize(docker, **kwargs)
5
5
  super(docker, '12.04', **kwargs)
6
6
  end
7
7
 
8
- def os_codename
8
+ def codename
9
9
  'precise'
10
10
  end
11
11
  end # Ubuntu1204
12
- end # Image
12
+ end # Os
13
13
  end # Buildizer
@@ -1,13 +1,13 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Ubuntu1404 < Ubuntu
4
4
  def initialize(docker, **kwargs)
5
5
  super(docker, '14.04', **kwargs)
6
6
  end
7
7
 
8
- def os_codename
8
+ def codename
9
9
  'trusty'
10
10
  end
11
11
  end # Ubuntu1404
12
- end # Image
12
+ end # Os
13
13
  end # Buildizer
@@ -1,13 +1,13 @@
1
1
  module Buildizer
2
- module Image
2
+ module Os
3
3
  class Ubuntu1604 < Ubuntu
4
4
  def initialize(docker, **kwargs)
5
5
  super(docker, '16.04', **kwargs)
6
6
  end
7
7
 
8
- def os_codename
8
+ def codename
9
9
  'xenial'
10
10
  end
11
11
  end # Ubuntu1604
12
- end # Image
12
+ end # Os
13
13
  end # Buildizer
@@ -2,34 +2,51 @@ module Buildizer
2
2
  module Target
3
3
  class Base
4
4
  attr_reader :builder
5
- attr_reader :image
6
-
7
- attr_reader :name
8
- attr_reader :package_name
9
- attr_reader :package_version
10
- attr_reader :package_cloud
11
- attr_reader :prepare
12
- attr_reader :build_dep
13
- attr_reader :before_build
14
- attr_reader :maintainer
15
-
16
- def initialize(builder, image,
5
+ attr_reader :os
6
+
7
+ attr_reader :params
8
+
9
+ attr_reader :build_image
10
+ attr_reader :cache_image
11
+ attr_reader :test_image
12
+
13
+ def initialize(builder, os,
17
14
  name:, package_name:, package_version:, package_cloud: [],
18
- prepare: [], build_dep: [], before_build: [],
19
- maintainer: nil, &blk)
15
+ prepare: [], build_dep: [], before_build: [], maintainer: nil,
16
+ test_options: {}, test_env: {}, test_image: nil, before_test: [], test: [],
17
+ &blk)
20
18
  @builder = builder
21
- @image = image
22
-
23
- @name = name
24
- @package_name = package_name
25
- @package_version = package_version
26
- @package_cloud = package_cloud
27
- @prepare = prepare
28
- @build_dep = build_dep
29
- @before_build = before_build
30
- @maintainer = maintainer
19
+ @os = os
20
+ @params = {}
21
+
22
+ params[:name] = name
23
+ params[:package_name] = package_name
24
+ params[:package_version] = package_version
25
+ params[:package_cloud] = package_cloud
26
+ params[:prepare] = prepare
27
+ params[:build_dep] = build_dep
28
+ params[:before_build] = before_build
29
+ params[:maintainer] = maintainer
30
+ params[:test_options] = test_options
31
+ params[:test_env] = test_env
32
+ params[:test_image] = test_image
33
+ params[:before_test] = before_test
34
+ params[:test] = test
31
35
 
32
36
  yield if block_given?
37
+
38
+ @build_image = ::Buildizer::Image.new(build_image_name, self, from: os.base_image_name)
39
+ @cache_image = ::Buildizer::Image.new(cache_image_name, self) if cache_image_name
40
+ @test_image = ::Buildizer::Image.new(test_image_name, self)
41
+ end
42
+
43
+ def method_missing(name, *args, &blk)
44
+ param_name = name.to_sym
45
+ if params.key? param_name
46
+ params[param_name]
47
+ else
48
+ super
49
+ end
33
50
  end
34
51
 
35
52
  def image_work_path
@@ -45,42 +62,42 @@ module Buildizer
45
62
  end
46
63
 
47
64
  def maintainer_email
48
- match = maintainer.match(/<(.*)>/) if maintainer
65
+ match = params[:maintainer].match(/<(.*)>/) if params[:maintainer]
49
66
  match[1] if match
50
67
  end
51
68
 
52
69
  def package_version
53
- @package_version.nil? ? nil : @package_version.to_s
70
+ params[:package_version].nil? ? nil : params[:package_version].to_s
54
71
  end
55
72
 
56
73
  def base_package_name
57
- package_name.split('-').first
74
+ params[:package_name].split('-').first
58
75
  end
59
76
 
60
- def docker_image_repository
61
- package_name
77
+ def build_image_tag
78
+ params[:name].gsub('/', '__')
62
79
  end
63
80
 
64
- def docker_image_tag
65
- name.gsub('/', '__')
81
+ def build_image_name
82
+ "#{params[:package_name]}:#{build_image_tag}"
66
83
  end
67
84
 
68
- def docker_image
69
- "#{docker_image_repository}:#{docker_image_tag}"
85
+ def cache_image_name
86
+ "#{os.docker.cache[:repo]}:#{build_image_tag}" if os.docker.cache
70
87
  end
71
88
 
72
- def docker_cache_image
73
- "#{image.docker.cache[:repo]}:#{docker_image_tag}" if image.docker.cache
89
+ def test_image_name
90
+ params[:test_image] || os.base_vendor_image_name
74
91
  end
75
92
 
76
93
  def package_cloud
77
- @package_cloud.map do |desc|
94
+ params[:package_cloud].map do |desc|
78
95
  desc.merge(package_path: _package_cloud_path(desc[:repo]))
79
96
  end
80
97
  end
81
98
 
82
99
  def _package_cloud_path(repo)
83
- "#{repo}/#{image.os_package_cloud_name}/#{image.os_package_cloud_version}"
100
+ "#{repo}/#{os.package_cloud_os_name}/#{os.package_cloud_os_version}"
84
101
  end
85
102
 
86
103
  def image_build_path
@@ -106,6 +123,17 @@ module Buildizer
106
123
  def container_package_archive_path
107
124
  Pathname.new('/').join(container_package_archive_name)
108
125
  end
126
+
127
+ def test_env
128
+ params[:test_env]
129
+ .map {|var, values| Array(values).uniq.map {|value| {var => value}}}
130
+ .reduce {|res, vars| res.product vars}
131
+ .to_a
132
+ .map {|vars|
133
+ vars = [vars] unless vars.is_a? Array
134
+ vars.reduce(&:merge)
135
+ }
136
+ end
109
137
  end # Base
110
138
  end # Target
111
139
  end # Buildizer