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