picsolve_docker_builder 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6be2d37c3e4b320770aa0e2dfbcacc7a9eec84e
4
- data.tar.gz: b29d93eede20b3353bbe379c87c5daf333af2bc6
3
+ metadata.gz: 5ec84ff2c54bd70531b955c0433b32fc7612a096
4
+ data.tar.gz: 9721fdeccf7b27d7440119c40d3fc657e3b4b9e4
5
5
  SHA512:
6
- metadata.gz: bd1711c680c3cb51a7eaedd369217bbdd627a4f4ad6eed3c45927125f709443ce5333d10d29157e254826d0c64c9fa1bd8c93d8d45e68a3c1a01f6246229dc8d
7
- data.tar.gz: f6ad1e2b94b222c65b6a6099e7d0ce3d476719696cc424ca7a8e1725a11cf314e4fbd43df303b24619b5038970c2434d2a62128c0d496a076880ecd06508ae73
6
+ metadata.gz: 4673382c5b8cdd99de881ae5522f815b5021d3f4f30fecdc7bbe4511dd8fbc3b1846241ad881125f50787ca0437abcddcc420a3c7a275fb6c46199c98bb4c7df
7
+ data.tar.gz: c14aa9c909bbf0927e9283ade875b24363b341b5d6a13a0e365971d95f38a26d51466176835d482beb0d3348cf314caf8c3d7b2b0fc5543c7fd61d638e4b3c1d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Change Log
2
2
 
3
+ ## [0.4.0] - 2016-01-11
4
+ ### Added
5
+ - Scala library build support
6
+ - SSH Auth forwarding support
7
+
3
8
  ## [0.3.2] - 2015-12-10
4
9
  ### Fixed
5
10
  - Fix pulling bug in picsolve_docker_builder DE153
data/README.md CHANGED
@@ -66,6 +66,52 @@ scala:
66
66
  - clean
67
67
  - "universal:packageZipTarball"
68
68
  ```
69
+ ## Usage examples
70
+
71
+ ### Building
72
+
73
+ #### Scala
74
+
75
+ ##### Scala app docker image
76
+
77
+ ###### .docker-builder.yml
78
+
79
+ ```yaml
80
+ docker:
81
+ base_image: docker.picsolve.net/java-8
82
+ image_name: docker.picsolve.net/my-app-name
83
+ ```
84
+
85
+ ###### build image
86
+
87
+ `bundle exec rake docker:build`
88
+
89
+ ###### push to registry
90
+
91
+ `bundle exec rake docker:push`
92
+
93
+ ###### for jenkins
94
+
95
+ `bundle exec rake docker:jenkins`
96
+
97
+ ##### Library snapshot build
98
+
99
+ ###### .docker-builder.yml
100
+
101
+ ```yaml
102
+ docker:
103
+ base_image: docker.picsolve.net/java-8
104
+ image_name: null
105
+ ssh_auth_forwarding: true
106
+ ```
107
+
108
+ ###### build & publish snapshot
109
+
110
+ `bundle exec rake scala:lib:snapshot`
111
+
112
+ ###### build & publish release
113
+
114
+ `bundle exec rake scala:lib:release`
69
115
 
70
116
  ## Release process
71
117
 
@@ -1,3 +1,4 @@
1
+ require 'picsolve_docker_builder/helpers/ssh_auth_forwarding'
1
2
  require 'picsolve_docker_builder/composer/registry'
2
3
  require 'picsolve_docker_builder/base'
3
4
  require 'docker'
@@ -209,7 +210,9 @@ module PicsolveDockerBuilder
209
210
  end
210
211
 
211
212
  def volumes_array
212
- [volume_workspace]
213
+ volumes = [volume_workspace]
214
+ volumes << volume_ssh_auth_forwarding if ssh_auth_forwarding?
215
+ volumes
213
216
  end
214
217
 
215
218
  def volumes
@@ -252,9 +255,13 @@ module PicsolveDockerBuilder
252
255
  blacklist.include? key
253
256
  end
254
257
 
255
- keys.map do |key|
258
+ env = keys.map do |key|
256
259
  "#{key}=#{ENV[key]}"
257
260
  end
261
+
262
+ env << "SSH_AUTH_SOCK=#{ssh_auth_forwarding_path}" if ssh_auth_forwarding?
263
+
264
+ env
258
265
  end
259
266
 
260
267
  def create_container
@@ -302,19 +309,62 @@ module PicsolveDockerBuilder
302
309
  nil
303
310
  end
304
311
 
305
- def fetch_asset_image
306
- log.debug "pulling image '#{image_name}' from registry"
307
- Docker::Image.create({'fromImage' => image_name}, Composer::Registry.creds)
308
- log.debug "building asset image from '#{image_name}'"
309
- dockerfile_asset = <<EOS
310
- FROM #{image_name}
311
- MAINTAINER Picsolve Onlineops <onlineops@picsolve.com>
312
- #{dockerfile_hooks_asset_build_early}
313
- RUN useradd -m -d #{build_user_home} -u #{build_user_uid} #{build_user}
314
- #{dockerfile_hooks_asset_build_late}
315
- EOS
312
+ def ssh_auth_forwarding?
313
+ return true if config['docker']['ssh_auth_forwarding']
314
+ false
315
+ end
316
+
317
+ def ssh_auth_forwarding_dockerfile
318
+ return "\n" unless ssh_auth_forwarding?
319
+ # add ssh known hosts to the image if using forwards
320
+ "ADD ssh_known_hosts #{File.join(build_user_home, '.ssh/known_hosts')}"
321
+ end
322
+
323
+ def ssh_auth_forwarding_path
324
+ '/tmp/ssh_auth_sock/ssh_auth_sock'
325
+ end
326
+
327
+ def volume_ssh_auth_forwarding
328
+ @ssh_auth_forwarding = Helpers::SshAuthForwarding.new
329
+ [
330
+ @ssh_auth_forwarding.dir,
331
+ File.dirname(ssh_auth_forwarding_path)
332
+ ]
333
+ end
334
+
335
+ def ssh_known_hosts
336
+ File.open(File.join(Dir.home, '.ssh/known_hosts')).read
337
+ end
338
+
339
+ def asset_image_dockerfile
340
+ [
341
+ "FROM #{image_name}",
342
+ 'MAINTAINER Picsolve Onlineops <onlineops@picsolve.com>',
343
+ dockerfile_hooks_asset_build_early,
344
+ "RUN useradd -m -d #{build_user_home} \\",
345
+ " -u #{build_user_uid} #{build_user}",
346
+ "ADD .gitconfig #{File.join(build_user_home, '.gitconfig')}",
347
+ ssh_auth_forwarding_dockerfile,
348
+ "RUN chown -cR #{build_user} #{build_user_home}",
349
+ dockerfile_hooks_asset_build_late
350
+ ]
351
+ end
352
+
353
+ def asset_image_build
354
+ tar_contents = {
355
+ 'Dockerfile' => asset_image_dockerfile.join("\n"),
356
+ '.gitconfig' => [
357
+ '[user]',
358
+ 'name = Jenkins London Picsolve',
359
+ 'email = jenkins@picsolve.com'
360
+ ].join("\n")
361
+ }
362
+
363
+ tar_contents['ssh_known_hosts'] = ssh_known_hosts if ssh_auth_forwarding?
364
+
365
+ tar = StringIO.new Docker::Util.create_tar(tar_contents)
316
366
  begin
317
- Docker::Image.build(dockerfile_asset) do |stream|
367
+ Docker::Image.build_from_tar(tar) do |stream|
318
368
  s = JSON.parse(stream)['stream']
319
369
  log.debug s.strip unless s.nil?
320
370
  end
@@ -324,6 +374,16 @@ EOS
324
374
  end
325
375
  end
326
376
 
377
+ def fetch_asset_image
378
+ log.debug "pulling image '#{image_name}' from registry"
379
+ Docker::Image.create(
380
+ { 'fromImage' => image_name },
381
+ Composer::Registry.creds
382
+ )
383
+ log.debug "building asset image from '#{image_name}'"
384
+ asset_image_build
385
+ end
386
+
327
387
  def asset_image
328
388
  @asset_image ||= fetch_asset_image
329
389
  end
@@ -0,0 +1,72 @@
1
+ require 'picsolve_docker_builder/base'
2
+ require 'fileutils'
3
+ require 'securerandom'
4
+
5
+ module PicsolveDockerBuilder
6
+ module Helpers
7
+ # Ruby class that forwards a ssh auth socket into a docker container
8
+ class SshAuthForwarding
9
+ include PicsolveDockerBuilder::Base
10
+
11
+ def initialize
12
+ fail 'Environment var SSH_AUTH_SOCK not found, ssh forward impossible' \
13
+ if env_ssh_auth_sock.nil?
14
+ end
15
+
16
+ def generate_dir_path
17
+ File.join(
18
+ File.dirname(env_ssh_auth_sock),
19
+ "docker_builder_temp_#{SecureRandom.hex(2)}"
20
+ )
21
+ end
22
+
23
+ def create_dir
24
+ dir = generate_dir_path
25
+ begin
26
+ Dir.mkdir(dir, 0700)
27
+ # ensure cleanup
28
+ at_exit do
29
+ cleanup(dir)
30
+ end
31
+ rescue Errno::EEXIST
32
+ FileUtils.rm_rf(dir)
33
+ log.warn "Directory '#{dir}' already exists, removing it"
34
+ retry
35
+ end
36
+
37
+ log.debug \
38
+ "Creating temporary dir '#{dir}' for mapping auth socket into docker"
39
+ FileUtils.chmod 0700, dir
40
+ FileUtils.ln env_ssh_auth_sock, File.join(dir, 'ssh_auth_sock')
41
+ dir
42
+ end
43
+
44
+ def cleanup(dir = nil)
45
+ # return if nothing to do
46
+ if dir.nil?
47
+ if @dir.nil?
48
+ return
49
+ else
50
+ dir = @dir
51
+ @dir = nil
52
+ end
53
+ end
54
+
55
+ log.debug "Removing temporary dir '#{dir}'"
56
+ FileUtils.rm_rf(dir)
57
+ end
58
+
59
+ def dir
60
+ @dir ||= create_dir
61
+ end
62
+
63
+ def env_var_name
64
+ 'SSH_AUTH_SOCK'
65
+ end
66
+
67
+ def env_ssh_auth_sock
68
+ ENV[env_var_name]
69
+ end
70
+ end
71
+ end
72
+ end
@@ -139,12 +139,24 @@ module PicsolveDockerBuilder
139
139
  end
140
140
 
141
141
  def sbt_command
142
+ return @sbt_command unless @sbt_command.nil?
143
+
142
144
  runs = config['scala']['sbt']['build_task'].map do |tasks|
143
145
  "sbt #{tasks}"
144
146
  end
145
147
  runs.join ' && '
146
148
  end
147
149
 
150
+ def sbt_lib_snapshot
151
+ @sbt_command = 'sbt clean update test publish'
152
+ build
153
+ end
154
+
155
+ def sbt_lib_release
156
+ @sbt_command = "sbt clean test \"release cross with-defaults\""
157
+ build
158
+ end
159
+
148
160
  def asset_build
149
161
  log.info "start asset building with image #{image_name}"
150
162
 
@@ -1,4 +1,4 @@
1
1
  # version
2
2
  module PicsolveDockerBuilder
3
- VERSION = '0.3.2'
3
+ VERSION = '0.4.0'
4
4
  end
data/lib/tasks/scala.rake CHANGED
@@ -9,3 +9,17 @@ namespace :docker do
9
9
  @docker_builder ||= PicsolveDockerBuilder::Scala.new
10
10
  end
11
11
  end
12
+
13
+ namespace :scala do
14
+ namespace :lib do
15
+ desc 'build & publish a scala library snapshot'
16
+ task snapshot: :'docker:prepare' do
17
+ @docker_builder.sbt_lib_snapshot
18
+ end
19
+
20
+ desc 'build & publish a scala library release'
21
+ task release: :'docker:prepare' do
22
+ @docker_builder.sbt_lib_release
23
+ end
24
+ end
25
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: picsolve_docker_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Simon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-10 00:00:00.000000000 Z
11
+ date: 2016-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -278,6 +278,7 @@ files:
278
278
  - lib/picsolve_docker_builder/helpers/kubernetes_manager.rb
279
279
  - lib/picsolve_docker_builder/helpers/registry.rb
280
280
  - lib/picsolve_docker_builder/helpers/repository.rb
281
+ - lib/picsolve_docker_builder/helpers/ssh_auth_forwarding.rb
281
282
  - lib/picsolve_docker_builder/helpers/ssh_connection.rb
282
283
  - lib/picsolve_docker_builder/helpers/ssh_forward.rb
283
284
  - lib/picsolve_docker_builder/nodejs.rb