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 +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +46 -0
- data/lib/picsolve_docker_builder/frame.rb +74 -14
- data/lib/picsolve_docker_builder/helpers/ssh_auth_forwarding.rb +72 -0
- data/lib/picsolve_docker_builder/scala.rb +12 -0
- data/lib/picsolve_docker_builder/version.rb +1 -1
- data/lib/tasks/scala.rake +14 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ec84ff2c54bd70531b955c0433b32fc7612a096
|
4
|
+
data.tar.gz: 9721fdeccf7b27d7440119c40d3fc657e3b4b9e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4673382c5b8cdd99de881ae5522f815b5021d3f4f30fecdc7bbe4511dd8fbc3b1846241ad881125f50787ca0437abcddcc420a3c7a275fb6c46199c98bb4c7df
|
7
|
+
data.tar.gz: c14aa9c909bbf0927e9283ade875b24363b341b5d6a13a0e365971d95f38a26d51466176835d482beb0d3348cf314caf8c3d7b2b0fc5543c7fd61d638e4b3c1d
|
data/CHANGELOG.md
CHANGED
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
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
#
|
313
|
-
|
314
|
-
|
315
|
-
|
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.
|
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
|
|
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.
|
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:
|
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
|