buildizer 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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