picsolve_docker_builder 0.3.2 → 0.4.0

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.
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