buildizer 0.0.1 → 0.0.5

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,260 @@
1
+ module Buildizer
2
+ class Packager
3
+ attr_reader :package_path
4
+ attr_reader :buildizer_conf_path
5
+ attr_reader :options_path
6
+ attr_reader :travis_path
7
+ attr_reader :debug
8
+
9
+ def initialize(options: {}, debug: false)
10
+ @package_path = Pathname.new(ENV['BUILDIZER_PATH'] || '.').expand_path
11
+ @buildizer_conf_path = package_path.join('Buildizer')
12
+ @options_path = package_path.join('.buildizer.yml')
13
+ @travis_path = package_path.join('.travis.yml')
14
+ @_options = options
15
+ @debug = debug
16
+ end
17
+
18
+ def initialized?
19
+ options_path.exist?
20
+ end
21
+
22
+ def enabled?
23
+ not (ENV['TRAVIS_TAG'] || ENV['CI_BUILD_TAG']).empty?
24
+ end
25
+
26
+ def init!
27
+ raise Error, error: :logical_error, message: "already initialized" if initialized?
28
+
29
+ git_precommit_init!
30
+ options_setup!
31
+ travis_setup!
32
+ end
33
+
34
+ def deinit!
35
+ raise Error, error: :logical_error, message: "not initialized" unless initialized?
36
+ options_path.delete
37
+ git_precommit_deinit!
38
+ end
39
+
40
+ def update!
41
+ travis_setup!
42
+ end
43
+
44
+ def prepare!
45
+ builder.prepare
46
+ end
47
+
48
+ def build!
49
+ builder.build
50
+ end
51
+
52
+ def deploy!
53
+ builder.deploy
54
+ end
55
+
56
+ def buildizer_conf
57
+ @buildizer_conf ||= YAML.load(buildizer_conf_path.read)
58
+ end
59
+
60
+ def options
61
+ @options ||= (YAML.load(options_path.read) rescue {}).tap do |res|
62
+ @_options.each do |k, v|
63
+ res[k] = v unless v.nil?
64
+ end
65
+ end
66
+ end
67
+
68
+ def options_setup!
69
+ options_path.write YAML.dump(options)
70
+ @options = nil
71
+ end
72
+
73
+ def travis
74
+ @travis ||= (travis_path.exist? ? YAML.load(travis_path.read) : {})
75
+ rescue Psych::Exception => err
76
+ raise Error, error: :input_error, message: "bad travis config file #{file}: #{err.message}"
77
+ end
78
+
79
+ def travis_setup!
80
+ install = [
81
+ 'sudo apt-get update',
82
+ 'sudo apt-get install -y apt-transport-https ca-certificates',
83
+ 'sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D',
84
+ 'echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list',
85
+ 'sudo apt-get update',
86
+ 'sudo apt-get -o dpkg::options::="--force-confnew" install -y docker-engine=1.9.1-0~trusty', # FIXME [https://github.com/docker/docker/issues/20316]
87
+ 'echo "docker-engine hold" | sudo dpkg --set-selections',
88
+ ]
89
+ install.push(*Array(buildizer_install_instructions(latest: options['latest'])))
90
+
91
+ env = targets.map {|t| "BUILDIZER_TARGET=#{t}"}
92
+
93
+ travis_path.write YAML.dump(travis.merge(
94
+ 'dist' => 'trusty',
95
+ 'sudo' => 'required',
96
+ 'cache' => 'apt',
97
+ 'language' => 'ruby',
98
+ 'rvm' => '2.2.1',
99
+ 'install' => install,
100
+ 'before_script' => 'buildizer prepare',
101
+ 'script' => 'buildizer build',
102
+ 'env' => env,
103
+ 'after_success' => 'buildizer deploy',
104
+ ))
105
+ @travis = nil
106
+ end
107
+
108
+ def git_hooks_path
109
+ package_path.join('.git').join('hooks')
110
+ end
111
+
112
+ def git_old_hooks_path
113
+ git_hooks_path.join('old-hooks')
114
+ end
115
+
116
+ def git_precommit_path
117
+ git_hooks_path.join('pre-commit')
118
+ end
119
+
120
+ def git_old_precommit_path
121
+ git_old_hooks_path.join('pre-commit')
122
+ end
123
+
124
+ def git_precommit_init!
125
+ if git_precommit_path.exist?
126
+ raise(Error,
127
+ error: :logical_error,
128
+ message: [
129
+ "unable to backup existing precommit script: ",
130
+ "file already exists: #{git_old_precommit_path}",
131
+ ].join) if git_old_precommit_path.exist?
132
+ git_old_hooks_path.mkpath
133
+ FileUtils.cp git_precommit_path, git_old_precommit_path
134
+ end
135
+
136
+ git_precommit_path.write <<-EOF
137
+ #!/bin/bash
138
+ buildizer update
139
+ git add -v .travis.yml
140
+ EOF
141
+ git_precommit_path.chmod 0755
142
+ end
143
+
144
+ def git_precommit_deinit!
145
+ git_precommit_path.delete if git_precommit_path.exist?
146
+ FileUtils.cp git_old_precommit_path, git_precommit_path if git_old_precommit_path.exist?
147
+ git_old_hooks_path.rmtree if git_old_hooks_path.exist?
148
+ end
149
+
150
+ def package_name
151
+ buildizer_conf['package_name']
152
+ end
153
+
154
+ def package_version
155
+ buildizer_conf['package_version']
156
+ end
157
+
158
+ def os_params(os)
159
+ buildizer_conf['os'].to_h[os.to_s].to_h
160
+ end
161
+
162
+ def before_prepare
163
+ Array(buildizer_conf['before_prepare'])
164
+ end
165
+
166
+ def after_prepare
167
+ Array(buildizer_conf['after_prepare'])
168
+ end
169
+
170
+ def targets
171
+ targets = Array(buildizer_conf['target'])
172
+ restrict_targets = ENV['BUILDIZER_TARGET']
173
+ restrict_targets = restrict_targets.split(',').map(&:strip) if restrict_targets
174
+ targets = targets & restrict_targets if restrict_targets
175
+ targets
176
+ end
177
+
178
+ def prepare
179
+ Array(buildizer_conf['prepare'])
180
+ end
181
+
182
+ def build_dep
183
+ Array(buildizer_conf['build_dep']).to_set
184
+ end
185
+
186
+ def before_build
187
+ Array(buildizer_conf['before_build'])
188
+ end
189
+
190
+ def docker_server
191
+ buildizer_conf['docker_server']
192
+ end
193
+
194
+ def docker_image
195
+ buildizer_conf['image']
196
+ end
197
+
198
+ def package_cloud
199
+ buildizer_conf['package_cloud']
200
+ end
201
+
202
+ def package_cloud_token
203
+ ENV['PACKAGECLOUD_TOKEN'] || begin
204
+ raise Error, error: :input_error, message: "PACKAGECLOUD_TOKEN env variable required"
205
+ end
206
+ end
207
+
208
+ def docker_username
209
+ ENV['BUILDIZER_DOCKER_USERNAME'] || begin
210
+ raise Error, error: :input_error, message: "BUILDIZER_DOCKER_USERNAME env variable required"
211
+ end
212
+ end
213
+
214
+ def docker_password
215
+ ENV['BUILDIZER_DOCKER_PASSWORD'] || begin
216
+ raise Error, error: :input_error, message: "BUILDIZER_DOCKER_PASSWORD env variable required"
217
+ end
218
+ end
219
+
220
+ def docker_email
221
+ ENV['BUILDIZER_DOCKER_EMAIL'] || begin
222
+ raise Error, error: :input_error, message: "BUILDIZER_DOCKER_EMAIL env variable required"
223
+ end
224
+ end
225
+
226
+ def builder
227
+ @builder ||= begin
228
+ build_type = buildizer_conf['build_type']
229
+ klass = {'fpm' => Builder::Fpm}[build_type]
230
+ raise Error, error: :input_error, message: "unknown build_type '#{build_type}'" unless klass
231
+ klass.new(self)
232
+ end
233
+ end
234
+
235
+ def buildizer_install_instructions(latest: nil)
236
+ if latest
237
+ ['git clone https://github.com/flant/buildizer ~/buildizer',
238
+ 'echo "export BUNDLE_GEMFILE=~/buildizer/Gemfile" | tee -a ~/.bashrc',
239
+ 'export BUNDLE_GEMFILE=~/buildizer/Gemfile',
240
+ 'gem install bundler',
241
+ 'bundle install',
242
+ ]
243
+ else
244
+ 'gem install buildizer'
245
+ end
246
+ end
247
+
248
+ def command(*args, do_raise: false, **kwargs)
249
+ Shellfold.run(*args, live_log: debug, **kwargs).tap do |cmd|
250
+ if not cmd.status.success? and do_raise
251
+ raise Error.new(error: :error, message: "external command error")
252
+ end
253
+ end
254
+ end
255
+
256
+ def command!(*args, **kwargs)
257
+ command(*args, do_raise: true, log_failure: true, **kwargs)
258
+ end
259
+ end # Packager
260
+ end # Buildizer
@@ -0,0 +1,11 @@
1
+ module Buildizer
2
+ module Refine
3
+ refine String do
4
+ def underscore
5
+ self.gsub(/(.)([A-Z])/,'\1_\2').downcase
6
+ end
7
+ end
8
+ end # Refine
9
+
10
+ using Refine
11
+ end # Buildizer
@@ -0,0 +1,39 @@
1
+ module Buildizer
2
+ module Target
3
+ class Base
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
+
15
+ def initialize(builder, image,
16
+ name:, package_name:, package_version:, package_cloud:,
17
+ prepare: [], build_dep: [], before_build: [])
18
+ @builder = builder
19
+ @image = image
20
+
21
+ @name = name
22
+ @package_name = package_name
23
+ @package_version = package_version
24
+ @package_cloud = package_cloud
25
+ @prepare = prepare
26
+ @build_dep = build_dep
27
+ @before_build = before_build
28
+ end
29
+
30
+ def docker_image
31
+ "#{builder.packager.docker_image || "buildizer/#{package_name}"}:#{name}"
32
+ end
33
+
34
+ def package_cloud_path
35
+ "#{package_cloud}/#{image.os_package_cloud_name}/#{image.os_package_cloud_version}"
36
+ end
37
+ end # Base
38
+ end # Target
39
+ end # Buildizer
@@ -0,0 +1,17 @@
1
+ module Buildizer
2
+ module Target
3
+ class Fpm < Base
4
+ attr_reader :fpm_script
5
+ attr_reader :fpm_config_files
6
+ attr_reader :fpm_files
7
+
8
+ def initialize(builder, image, fpm_script: [], fpm_config_files: {}, fpm_files: {}, **kwargs)
9
+ super(builder, image, **kwargs)
10
+
11
+ @fpm_script = fpm_script
12
+ @fpm_config_files = fpm_config_files
13
+ @fpm_files = fpm_files
14
+ end
15
+ end # Fpm
16
+ end # Target
17
+ end # Buildizer
@@ -0,0 +1,4 @@
1
+ module Buildizer
2
+ module Target
3
+ end # Target
4
+ end # Buildizer
@@ -1,3 +1,3 @@
1
1
  module Buildizer
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.5'
3
3
  end
data/lib/buildizer.rb CHANGED
@@ -0,0 +1,26 @@
1
+ require 'thor'
2
+ require 'yaml'
3
+ require 'net_status'
4
+ require 'pathname'
5
+ require 'shellfold'
6
+
7
+ require 'buildizer/version'
8
+ require 'buildizer/refine'
9
+ require 'buildizer/error'
10
+ require 'buildizer/docker'
11
+ require 'buildizer/cli'
12
+ require 'buildizer/packager'
13
+ require 'buildizer/target'
14
+ require 'buildizer/target/base'
15
+ require 'buildizer/target/fpm'
16
+ require 'buildizer/builder'
17
+ require 'buildizer/builder/base'
18
+ require 'buildizer/builder/fpm'
19
+ require 'buildizer/image'
20
+ require 'buildizer/image/base'
21
+ require 'buildizer/image/centos'
22
+ require 'buildizer/image/centos6'
23
+ require 'buildizer/image/centos7'
24
+ require 'buildizer/image/ubuntu'
25
+ require 'buildizer/image/ubuntu1204'
26
+ require 'buildizer/image/ubuntu1404'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: buildizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - flant
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-16 00:00:00.000000000 Z
11
+ date: 2016-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -51,45 +51,25 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: '1.0'
53
53
  - !ruby/object:Gem::Dependency
54
- name: mixlib-shellout
54
+ name: shellfold
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - ! '>='
58
58
  - !ruby/object:Gem::Version
59
- version: 2.2.6
59
+ version: 0.0.1
60
60
  - - <
61
61
  - !ruby/object:Gem::Version
62
- version: '3.0'
62
+ version: '1.0'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
- version: 2.2.6
69
+ version: 0.0.1
70
70
  - - <
71
71
  - !ruby/object:Gem::Version
72
- version: '3.0'
73
- - !ruby/object:Gem::Dependency
74
- name: travis
75
- requirement: !ruby/object:Gem::Requirement
76
- requirements:
77
- - - ~>
78
- - !ruby/object:Gem::Version
79
- version: '1.8'
80
- - - ! '>='
81
- - !ruby/object:Gem::Version
82
- version: 1.8.2
83
- type: :runtime
84
- prerelease: false
85
- version_requirements: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ~>
88
- - !ruby/object:Gem::Version
89
- version: '1.8'
90
- - - ! '>='
91
- - !ruby/object:Gem::Version
92
- version: 1.8.2
72
+ version: '1.0'
93
73
  - !ruby/object:Gem::Dependency
94
74
  name: package_cloud
95
75
  requirement: !ruby/object:Gem::Requirement
@@ -198,6 +178,26 @@ dependencies:
198
178
  - - <
199
179
  - !ruby/object:Gem::Version
200
180
  version: '1.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: travis
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ~>
186
+ - !ruby/object:Gem::Version
187
+ version: '1.8'
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: 1.8.2
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: '1.8'
198
+ - - ! '>='
199
+ - !ruby/object:Gem::Version
200
+ version: 1.8.2
201
201
  description: Packaging tool.
202
202
  email: 256@flant.com
203
203
  executables:
@@ -207,11 +207,11 @@ extra_rdoc_files: []
207
207
  files:
208
208
  - .gitignore
209
209
  - .travis.yml
210
+ - Buildizer.example.1
211
+ - Buildizer.example.2
212
+ - Buildizer.example.3
210
213
  - Gemfile
211
214
  - Gemfile.lock
212
- - Packagefile.example.1
213
- - Packagefile.example.2
214
- - Packagefile.example.3
215
215
  - README.md
216
216
  - Rakefile
217
217
  - Vagrantfile
@@ -219,6 +219,25 @@ files:
219
219
  - bootstrap.sh
220
220
  - buildizer.gemspec
221
221
  - lib/buildizer.rb
222
+ - lib/buildizer/builder.rb
223
+ - lib/buildizer/builder/base.rb
224
+ - lib/buildizer/builder/fpm.rb
225
+ - lib/buildizer/cli.rb
226
+ - lib/buildizer/docker.rb
227
+ - lib/buildizer/error.rb
228
+ - lib/buildizer/image.rb
229
+ - lib/buildizer/image/base.rb
230
+ - lib/buildizer/image/centos.rb
231
+ - lib/buildizer/image/centos6.rb
232
+ - lib/buildizer/image/centos7.rb
233
+ - lib/buildizer/image/ubuntu.rb
234
+ - lib/buildizer/image/ubuntu1204.rb
235
+ - lib/buildizer/image/ubuntu1404.rb
236
+ - lib/buildizer/packager.rb
237
+ - lib/buildizer/refine.rb
238
+ - lib/buildizer/target.rb
239
+ - lib/buildizer/target/base.rb
240
+ - lib/buildizer/target/fpm.rb
222
241
  - lib/buildizer/version.rb
223
242
  homepage: https://github.com/flant/buildizer
224
243
  licenses: