Class: Buildizer::Packager

Inherits:
Object
  • Object
show all
Defined in:
lib/buildizer/packager.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options: {}, debug: false) ⇒ Packager

Returns a new instance of Packager.



12
13
14
15
16
17
18
19
20
# File 'lib/buildizer/packager.rb', line 12

def initialize(options: {}, debug: false)
  @package_path = Pathname.new(ENV['BUILDIZER_PATH'] || '.').expand_path
  @buildizer_conf_path = package_path.join('Buildizer')
  @options_path = package_path.join('.buildizer.yml')
  @travis_path = package_path.join('.travis.yml')
  @work_path = Pathname.new(ENV['BUILDIZER_WORK_PATH'] || '~/.buildizer').expand_path
  @_options = options
  @debug = ENV['BUILDIZER_DEBUG'].nil? ? debug : ENV['BUILDIZER_DEBUG'].to_s.on?
end

Instance Attribute Details

#buildizer_conf_pathObject (readonly)

Returns the value of attribute buildizer_conf_path.



6
7
8
# File 'lib/buildizer/packager.rb', line 6

def buildizer_conf_path
  @buildizer_conf_path
end

#debugObject (readonly)

Returns the value of attribute debug.



10
11
12
# File 'lib/buildizer/packager.rb', line 10

def debug
  @debug
end

#options_pathObject (readonly)

Returns the value of attribute options_path.



7
8
9
# File 'lib/buildizer/packager.rb', line 7

def options_path
  @options_path
end

#package_pathObject (readonly)

Returns the value of attribute package_path.



5
6
7
# File 'lib/buildizer/packager.rb', line 5

def package_path
  @package_path
end

#travis_pathObject (readonly)

Returns the value of attribute travis_path.



8
9
10
# File 'lib/buildizer/packager.rb', line 8

def travis_path
  @travis_path
end

#work_pathObject (readonly)

Returns the value of attribute work_path.



9
10
11
# File 'lib/buildizer/packager.rb', line 9

def work_path
  @work_path
end

Instance Method Details

#after_prepareObject



179
180
181
# File 'lib/buildizer/packager.rb', line 179

def after_prepare
  Array(buildizer_conf['after_prepare'])
end

#before_buildObject



199
200
201
# File 'lib/buildizer/packager.rb', line 199

def before_build
  Array(buildizer_conf['before_build'])
end

#before_prepareObject



175
176
177
# File 'lib/buildizer/packager.rb', line 175

def before_prepare
  Array(buildizer_conf['before_prepare'])
end

#build!Object



52
53
54
# File 'lib/buildizer/packager.rb', line 52

def build!
  builder.build
end

#build_depObject



195
196
197
# File 'lib/buildizer/packager.rb', line 195

def build_dep
  Array(buildizer_conf['build_dep']).to_set
end

#builderObject



244
245
246
247
248
249
250
251
252
253
254
# File 'lib/buildizer/packager.rb', line 244

def builder
  @builder ||= begin
    build_type = buildizer_conf['build_type']
    raise Error, error: :input_error, message: "build_type is not defined" unless build_type
    klass = {fpm: Builder::Fpm,
             native: Builder::Native,
             patch: Builder::Patch}[build_type.to_s.to_sym]
    raise Error, error: :input_error, message: "unknown build_type '#{build_type}'" unless klass
    klass.new(self)
  end
end

#buildizer_confObject



64
65
66
# File 'lib/buildizer/packager.rb', line 64

def buildizer_conf
  @buildizer_conf ||= (YAML.load((buildizer_conf_path.read rescue "")) || {})
end

#buildizer_install_instructions(latest: nil) ⇒ Object



256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/buildizer/packager.rb', line 256

def buildizer_install_instructions(latest: nil)
  if latest
    ['git clone https://github.com/flant/buildizer ~/buildizer',
     'echo "export BUNDLE_GEMFILE=~/buildizer/Gemfile" | tee -a ~/.bashrc',
     'export BUNDLE_GEMFILE=~/buildizer/Gemfile',
     'gem install bundler',
     'bundle install',
    ]
  else
    'gem install buildizer'
  end
end

#command(*args, do_raise: false, **kwargs) ⇒ Object



269
270
271
272
273
274
275
# File 'lib/buildizer/packager.rb', line 269

def command(*args, do_raise: false, **kwargs)
  Shellfold.run(*args, live_log: debug, **kwargs).tap do |cmd|
    if not cmd.status.success? and do_raise
      raise Error.new(error: :error, message: "external command error")
    end
  end
end

#command!(*args, **kwargs) ⇒ Object



277
278
279
# File 'lib/buildizer/packager.rb', line 277

def command!(*args, **kwargs)
  command(*args, do_raise: true, log_failure: true, **kwargs)
end

#deinit!Object

Raises:



38
39
40
41
42
# File 'lib/buildizer/packager.rb', line 38

def deinit!
  raise Error, error: :logical_error, message: "not initialized" unless initialized?
  options_path.delete
  git_precommit_deinit!
end

#deploy!Object



56
57
58
# File 'lib/buildizer/packager.rb', line 56

def deploy!
  builder.deploy
end

#docker_cacheObject



231
232
233
234
235
236
237
238
# File 'lib/buildizer/packager.rb', line 231

def docker_cache
  return unless org = ENV['BUILDIZER_DOCKER_CACHE']
  {username: ENV['BUILDIZER_DOCKER_CACHE_USERNAME'],
   password: ENV['BUILDIZER_DOCKER_CACHE_PASSWORD'],
   email: ENV['BUILDIZER_DOCKER_CACHE_EMAIL'],
   server: ENV['BUILDIZER_DOCKER_CACHE_SERVER'],
   org: org}
end

#docker_imageObject



207
208
209
# File 'lib/buildizer/packager.rb', line 207

def docker_image
  buildizer_conf['image']
end

#docker_serverObject



203
204
205
# File 'lib/buildizer/packager.rb', line 203

def docker_server
  buildizer_conf['docker_server']
end

#enabled?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/buildizer/packager.rb', line 26

def enabled?
  not (ENV['TRAVIS_TAG'] || ENV['CI_BUILD_TAG']).empty?
end

#git_hooks_pathObject



116
117
118
# File 'lib/buildizer/packager.rb', line 116

def git_hooks_path
  package_path.join('.git').join('hooks')
end

#git_old_hooks_pathObject



120
121
122
# File 'lib/buildizer/packager.rb', line 120

def git_old_hooks_path
  git_hooks_path.join('old-hooks')
end

#git_old_precommit_pathObject



128
129
130
# File 'lib/buildizer/packager.rb', line 128

def git_old_precommit_path
  git_old_hooks_path.join('pre-commit')
end

#git_precommit_deinit!Object



152
153
154
155
156
# File 'lib/buildizer/packager.rb', line 152

def git_precommit_deinit!
  git_precommit_path.delete if git_precommit_path.exist?
  FileUtils.cp git_old_precommit_path, git_precommit_path if git_old_precommit_path.exist?
  git_old_hooks_path.rmtree if git_old_hooks_path.exist?
end

#git_precommit_init!Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/buildizer/packager.rb', line 132

def git_precommit_init!
  if git_precommit_path.exist?
    raise(Error,
      error: :logical_error,
      message: [
        "unable to backup existing precommit script: ",
        "file already exists: #{git_old_precommit_path}",
      ].join) if git_old_precommit_path.exist?
    git_old_hooks_path.mkpath
    FileUtils.cp git_precommit_path, git_old_precommit_path
  end

  git_precommit_path.write <<-EOF
#!/bin/bash
buildizer update
git add -v .travis.yml
  EOF
  git_precommit_path.chmod 0755
end

#git_precommit_pathObject



124
125
126
# File 'lib/buildizer/packager.rb', line 124

def git_precommit_path
  git_hooks_path.join('pre-commit')
end

#init!Object

Raises:



30
31
32
33
34
35
36
# File 'lib/buildizer/packager.rb', line 30

def init!
  raise Error, error: :logical_error, message: "already initialized" if initialized?

  git_precommit_init!
  options_setup!
  travis_setup!
end

#initialized?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/buildizer/packager.rb', line 22

def initialized?
  options_path.exist?
end

#maintainerObject



240
241
242
# File 'lib/buildizer/packager.rb', line 240

def maintainer
  buildizer_conf['maintainer']
end

#optionsObject



68
69
70
71
72
73
74
# File 'lib/buildizer/packager.rb', line 68

def options
  @options ||= (YAML.load(options_path.read) rescue {}).tap do |res|
    @_options.each do |k, v|
      res[k] = v unless v.nil?
    end
  end
end

#options_setup!Object



76
77
78
79
# File 'lib/buildizer/packager.rb', line 76

def options_setup!
  options_path.write YAML.dump(options)
  @options = nil
end

#package_cloudObject



222
223
224
225
226
227
228
229
# File 'lib/buildizer/packager.rb', line 222

def package_cloud
  tokens = package_cloud_org
  package_cloud_repo.map do |repo|
    org = repo.split('/').first
    token = tokens[org]
    {org: org, repo: repo, token: token}
  end
end

#package_cloud_orgObject



215
216
217
218
219
220
# File 'lib/buildizer/packager.rb', line 215

def package_cloud_org
  default_token = ENV['PACKAGECLOUD_TOKEN']
  package_cloud_repo.map {|repo| repo.split('/').first}.uniq.map do |org|
    [org, ENV["PACKAGECLOUD_TOKEN_#{org.upcase}"] || default_token]
  end.to_h
end

#package_cloud_repoObject



211
212
213
# File 'lib/buildizer/packager.rb', line 211

def package_cloud_repo
  ENV['PACKAGECLOUD'].to_s.split(',')
end

#package_nameObject



158
159
160
# File 'lib/buildizer/packager.rb', line 158

def package_name
  buildizer_conf['package_name']
end

#package_versionObject



162
163
164
# File 'lib/buildizer/packager.rb', line 162

def package_version
  buildizer_conf['package_version']
end

#package_version_tagObject



170
171
172
173
# File 'lib/buildizer/packager.rb', line 170

def package_version_tag
  res = ENV['TRAVIS_TAG'] || ENV['CI_BUILD_TAG']
  if res.nil? then res elsif res.empty? then nil else res end
end

#package_version_tag_required_for_deploy?Boolean

Returns:

  • (Boolean)


166
167
168
# File 'lib/buildizer/packager.rb', line 166

def package_version_tag_required_for_deploy?
  ENV['BUILDIZER_REQUIRE_TAG'].to_s.on?
end

#prepareObject



191
192
193
# File 'lib/buildizer/packager.rb', line 191

def prepare
  Array(buildizer_conf['prepare'])
end

#prepare!Object



48
49
50
# File 'lib/buildizer/packager.rb', line 48

def prepare!
  builder.prepare
end

#targetsObject



183
184
185
186
187
188
189
# File 'lib/buildizer/packager.rb', line 183

def targets
  targets = Array(buildizer_conf['target'])
  restrict_targets = ENV['BUILDIZER_TARGET']
  restrict_targets = restrict_targets.split(',').map(&:strip) if restrict_targets
  targets = targets & restrict_targets if restrict_targets
  targets
end

#travisObject



81
82
83
84
85
# File 'lib/buildizer/packager.rb', line 81

def travis
  @travis ||= (travis_path.exist? ? YAML.load(travis_path.read) : {})
rescue Psych::Exception => err
  raise Error, error: :input_error, message: "bad travis config file #{file}: #{err.message}"
end

#travis_setup!Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/buildizer/packager.rb', line 87

def travis_setup!
  install = [
    'sudo apt-get update',
    'sudo apt-get install -y apt-transport-https ca-certificates',
    'sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D',
    'echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list',
    'sudo apt-get update',
    '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]
    'echo "docker-engine hold" | sudo dpkg --set-selections',
  ]
  install.push(*Array(buildizer_install_instructions(latest: options['latest'])))

  env = targets.map {|t| "BUILDIZER_TARGET=#{t}"}

  travis_path.write YAML.dump(travis.merge(
    'dist' => 'trusty',
    'sudo' => 'required',
    'cache' => 'apt',
    'language' => 'ruby',
    'rvm' => '2.2.1',
    'install' => install,
    'before_script' => 'buildizer prepare',
    'script' => 'buildizer build',
    'env' => env,
    'after_success' => 'buildizer deploy',
  ))
  @travis = nil
end

#update!Object



44
45
46
# File 'lib/buildizer/packager.rb', line 44

def update!
  travis_setup!
end

#verify!Object



60
61
62
# File 'lib/buildizer/packager.rb', line 60

def verify!
  builder.verify
end