picsolve_docker_builder 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/picsolve_docker_builder/base.rb +7 -0
- data/lib/picsolve_docker_builder/composer/composer.rb +2 -2
- data/lib/picsolve_docker_builder/composer/container.rb +14 -12
- data/lib/picsolve_docker_builder/frame.rb +2 -4
- data/lib/picsolve_docker_builder/helpers/config_manager.rb +15 -7
- data/lib/picsolve_docker_builder/helpers/config_version_update.rb +145 -0
- data/lib/picsolve_docker_builder/helpers/kubernetes/rc.rb +1 -1
- data/lib/picsolve_docker_builder/helpers/registry.rb +24 -49
- data/lib/picsolve_docker_builder/version.rb +1 -1
- data/lib/tasks/compose.rake +6 -0
- data/picsolve_docker_builder.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff6dc295b2b3965dc57e04b6939e98c6e39028f6
|
4
|
+
data.tar.gz: fa1feef27218916f7c8ea253b43495645089c0fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 610fb9fd6451749f7c11aaf818ca6a39d578617a45a65e915e25d69266d3c40f2114d76df9e76387283478d5650c63c086c6e1b8488c8fa8439108b9c028e265
|
7
|
+
data.tar.gz: 731f2eeafe0e07ca9bc4cae992eda2022a3c9a9add0b499321f1f874c25e14fd6f796e5a269bc040d44799e86450f99742a831293a153db3de84049016b4395e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [0.5.1] - 2016-03-07
|
4
|
+
### Added
|
5
|
+
- Support for storing/updateing tag information within config file
|
6
|
+
- Support for multiple config files .docker-builder.*.yml
|
7
|
+
|
8
|
+
### Fixes
|
9
|
+
- Fixes regressions with v2 registry
|
10
|
+
|
11
|
+
## [0.5.0] - 2016-02-03
|
12
|
+
### Added
|
13
|
+
- Support v2 registry
|
14
|
+
|
3
15
|
## [0.4.0] - 2016-01-11
|
4
16
|
### Added
|
5
17
|
- Scala library build support
|
@@ -47,6 +47,13 @@ module PicsolveDockerBuilder
|
|
47
47
|
File.join(base_dir, config_file)
|
48
48
|
end
|
49
49
|
|
50
|
+
# This should replace config_path pretty soon
|
51
|
+
def config_paths
|
52
|
+
[config_path] + Dir.glob(
|
53
|
+
config_path[0, config_path.length - 3] + '*.yml'
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
50
57
|
def default_config
|
51
58
|
{}
|
52
59
|
end
|
@@ -2,8 +2,6 @@ require 'picsolve_docker_builder/base'
|
|
2
2
|
require 'picsolve_docker_builder/helpers/registry'
|
3
3
|
require 'picsolve_docker_builder/composer/requirements'
|
4
4
|
|
5
|
-
Registry = PicsolveDockerBuilder::Helpers::Registry
|
6
|
-
|
7
5
|
module PicsolveDockerBuilder
|
8
6
|
module Composer
|
9
7
|
# Represents an container in an namespace
|
@@ -17,10 +15,6 @@ module PicsolveDockerBuilder
|
|
17
15
|
@composer = composer
|
18
16
|
end
|
19
17
|
|
20
|
-
def repo_tag
|
21
|
-
config['image']
|
22
|
-
end
|
23
|
-
|
24
18
|
def rc(kubernetes)
|
25
19
|
@rcs = {} if @rcs.nil?
|
26
20
|
@rcs[kubernetes] = kubernetes.rc(self) \
|
@@ -117,16 +111,24 @@ module PicsolveDockerBuilder
|
|
117
111
|
}
|
118
112
|
end
|
119
113
|
|
120
|
-
def
|
121
|
-
|
114
|
+
def image_name_tag
|
115
|
+
"#{config['image']}:#{repo_tag}"
|
122
116
|
end
|
123
117
|
|
124
|
-
def
|
125
|
-
|
118
|
+
def repo_tag
|
119
|
+
return config['tag'] if config.key? 'tag'
|
120
|
+
repo_tag_unique
|
126
121
|
end
|
127
122
|
|
128
|
-
def
|
129
|
-
|
123
|
+
def repo_tag_unique(label = 'latest')
|
124
|
+
image = PicsolveDockerBuilder::Helpers::Repository.new config['image']
|
125
|
+
log.info "Parse image string: #{image}"
|
126
|
+
@registry ||= PicsolveDockerBuilder::Helpers::Registry.new(
|
127
|
+
"https://#{image.registry}"
|
128
|
+
)
|
129
|
+
tag = @registry.unique_tag(config['image'], label)
|
130
|
+
log.info "Evaluate unique tag '#{tag}' for '#{label}'"
|
131
|
+
tag
|
130
132
|
end
|
131
133
|
end
|
132
134
|
end
|
@@ -5,8 +5,6 @@ require 'docker'
|
|
5
5
|
require 'logger'
|
6
6
|
require 'psych'
|
7
7
|
|
8
|
-
Registry = PicsolveDockerBuilder::Helpers::Registry
|
9
|
-
|
10
8
|
module PicsolveDockerBuilder
|
11
9
|
# Docker image building template
|
12
10
|
# rubocop:disable Metrics/ClassLength
|
@@ -107,7 +105,7 @@ module PicsolveDockerBuilder
|
|
107
105
|
repotag = "#{dest_image_name}:#{tag}"
|
108
106
|
log.info "pushing image with #{repotag}"
|
109
107
|
@docker_build.push(
|
110
|
-
Registry.creds,
|
108
|
+
PicsolveDockerBuilder::Helpers::Registry.creds,
|
111
109
|
tag: tag
|
112
110
|
) do |resp|
|
113
111
|
resp = JSON.parse resp
|
@@ -380,7 +378,7 @@ module PicsolveDockerBuilder
|
|
380
378
|
log.debug "pulling image '#{image_name}' from registry"
|
381
379
|
Docker::Image.create(
|
382
380
|
{ 'fromImage' => image_name },
|
383
|
-
Registry.creds
|
381
|
+
PicsolveDockerBuilder::Helpers::Registry.creds
|
384
382
|
)
|
385
383
|
log.debug "building asset image from '#{image_name}'"
|
386
384
|
asset_image_build
|
@@ -7,8 +7,13 @@ module PicsolveDockerBuilder
|
|
7
7
|
# Parses the config file
|
8
8
|
class ConfigManager
|
9
9
|
include PicsolveDockerBuilder::Base
|
10
|
-
def initialize(
|
11
|
-
|
10
|
+
def initialize(paths, stage)
|
11
|
+
if paths.is_a?(Array)
|
12
|
+
@paths = paths
|
13
|
+
else
|
14
|
+
@paths = [paths]
|
15
|
+
end
|
16
|
+
|
12
17
|
# TODO: Do this properly, this is a very very dirty hack
|
13
18
|
stage = (
|
14
19
|
!ENV['STAGE'].nil? &&
|
@@ -86,11 +91,14 @@ module PicsolveDockerBuilder
|
|
86
91
|
|
87
92
|
def read
|
88
93
|
@config = default
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
+
@paths.each do |file|
|
95
|
+
puts "my file is '#{@paths}'"
|
96
|
+
begin
|
97
|
+
yaml = Psych.load_file file
|
98
|
+
@config = @config.deep_merge(yaml)
|
99
|
+
rescue Errno::ENOENT
|
100
|
+
raise "cannot find config at '#{file}'"
|
101
|
+
end
|
94
102
|
end
|
95
103
|
end
|
96
104
|
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'picsolve_docker_builder/base'
|
2
|
+
require 'psych'
|
3
|
+
require 'git'
|
4
|
+
|
5
|
+
module PicsolveDockerBuilder
|
6
|
+
module Helpers
|
7
|
+
# Parses the config file
|
8
|
+
class ConfigVersionUpdate
|
9
|
+
include PicsolveDockerBuilder::Base
|
10
|
+
|
11
|
+
def self.update_task
|
12
|
+
log = Logger.new(STDOUT)
|
13
|
+
|
14
|
+
if ENV['service_name'].nil? || ENV['service_tag'].nil?
|
15
|
+
log.info 'No update needed as environment variables service_name '\
|
16
|
+
'and service_tag are not in place'
|
17
|
+
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
cvu = new
|
22
|
+
cvu.update_commit_push(
|
23
|
+
ENV['service_name'],
|
24
|
+
ENV['service_tag'],
|
25
|
+
ENV['service_commit'],
|
26
|
+
ENV['service_url']
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(path = nil)
|
31
|
+
@path = path || config_file
|
32
|
+
end
|
33
|
+
|
34
|
+
def check_for_uncommitted
|
35
|
+
return unless git.status.changed.keys.include? config_path
|
36
|
+
|
37
|
+
log.error "Uncommited changes to '#{config_path}'. Can't continue ..."
|
38
|
+
exit(1)
|
39
|
+
end
|
40
|
+
|
41
|
+
def commit_and_push(
|
42
|
+
container_name,
|
43
|
+
tag,
|
44
|
+
git_commit,
|
45
|
+
git_url
|
46
|
+
)
|
47
|
+
git.add config_path
|
48
|
+
message = "Upgrades version of '#{container_name}'"\
|
49
|
+
" to tag '#{tag}'"
|
50
|
+
|
51
|
+
message += "\n git_commit=#{git_commit}" if git_commit
|
52
|
+
message += "\n git_url=#{git_url}" if git_url
|
53
|
+
git.commit message
|
54
|
+
git.push(git_remote, git_branch)
|
55
|
+
rescue Git::GitExecuteError => exception
|
56
|
+
log.warn "Problem during commiting: #{exception}"
|
57
|
+
end
|
58
|
+
|
59
|
+
def git_remote_branch
|
60
|
+
ENV['GIT_BRANCH'] || 'origin/develop'
|
61
|
+
end
|
62
|
+
|
63
|
+
def git_remote
|
64
|
+
git_remote_branch.split('/')[0]
|
65
|
+
end
|
66
|
+
|
67
|
+
def git_branch
|
68
|
+
git_remote_branch.split('/')[1]
|
69
|
+
end
|
70
|
+
|
71
|
+
def config_file
|
72
|
+
unless File.file?(config_path)
|
73
|
+
File.open(config_path, 'w') do |file|
|
74
|
+
file.write('')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
File.new config_path
|
78
|
+
end
|
79
|
+
|
80
|
+
def config_path
|
81
|
+
'.docker-builder.version.yml'
|
82
|
+
end
|
83
|
+
|
84
|
+
def git
|
85
|
+
@git ||= Git.open('.')
|
86
|
+
end
|
87
|
+
|
88
|
+
def update_commit_push(*args)
|
89
|
+
check_for_uncommitted
|
90
|
+
update(*args)
|
91
|
+
commit_and_push(*args)
|
92
|
+
end
|
93
|
+
|
94
|
+
def update(
|
95
|
+
container_name,
|
96
|
+
tag,
|
97
|
+
git_commit,
|
98
|
+
git_url
|
99
|
+
)
|
100
|
+
read
|
101
|
+
config = {
|
102
|
+
'compose' => {
|
103
|
+
'containers' => {
|
104
|
+
container_name => {
|
105
|
+
'tag' => tag
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
c = config['compose']['containers'][container_name]
|
111
|
+
|
112
|
+
c['git_commit'] = git_commit unless git_commit.nil?
|
113
|
+
c['git_url'] = git_url unless git_url.nil?
|
114
|
+
|
115
|
+
@config = @config.deep_merge(config)
|
116
|
+
write
|
117
|
+
end
|
118
|
+
|
119
|
+
def write
|
120
|
+
File.open(@path, 'w') do |file|
|
121
|
+
file.write(Psych.dump(config))
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def default
|
126
|
+
{}
|
127
|
+
end
|
128
|
+
|
129
|
+
def config
|
130
|
+
return @config unless @config.nil?
|
131
|
+
read
|
132
|
+
end
|
133
|
+
|
134
|
+
def read
|
135
|
+
@config = default
|
136
|
+
begin
|
137
|
+
yaml = Psych.load_file @path
|
138
|
+
@config = @config.deep_merge(yaml) if yaml
|
139
|
+
rescue Errno::ENOENT
|
140
|
+
raise "cannot find config at '#{path}'"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -2,6 +2,7 @@ require 'picsolve_docker_builder/base'
|
|
2
2
|
require 'excon'
|
3
3
|
require 'json'
|
4
4
|
require 'base64'
|
5
|
+
require 'picsolve_docker_builder/helpers/repository'
|
5
6
|
|
6
7
|
module PicsolveDockerBuilder
|
7
8
|
module Helpers
|
@@ -12,6 +13,15 @@ module PicsolveDockerBuilder
|
|
12
13
|
|
13
14
|
attr_reader :config
|
14
15
|
|
16
|
+
def self.creds(image = nil)
|
17
|
+
if image.nil?
|
18
|
+
registry = 'https://docker.picsolve.net'
|
19
|
+
else
|
20
|
+
registry = "https://#{image.split('/')[0]}"
|
21
|
+
end
|
22
|
+
new(registry).creds
|
23
|
+
end
|
24
|
+
|
15
25
|
def initialize(registry)
|
16
26
|
@registry = registry
|
17
27
|
end
|
@@ -34,17 +44,19 @@ module PicsolveDockerBuilder
|
|
34
44
|
end
|
35
45
|
|
36
46
|
def list_tags_v1(image)
|
37
|
-
|
47
|
+
base_url = "/v1/repositories/#{image.user}/#{image.repo}"
|
48
|
+
endpoint = "#{base_url}/tags"
|
38
49
|
r = connection.get(path: endpoint)
|
39
50
|
JSON.parse(r.body)
|
40
51
|
end
|
41
52
|
|
42
53
|
def list_tags_v2(image)
|
43
|
-
|
54
|
+
base_url = "/v2/#{image.user}/#{image.repo}"
|
55
|
+
endpoint = "#{base_url}/tags/list"
|
44
56
|
r = connection.get(path: endpoint)
|
45
57
|
o = {}
|
46
58
|
JSON.parse(r.body)['tags'].each do |tag|
|
47
|
-
endpoint = "
|
59
|
+
endpoint = "#{base_url}/manifests/#{tag}"
|
48
60
|
r = connection.get(path: endpoint)
|
49
61
|
digest = Digest::SHA2.new(256)
|
50
62
|
JSON.parse(r.body)['fsLayers'].each do |fs_hash|
|
@@ -70,6 +82,7 @@ module PicsolveDockerBuilder
|
|
70
82
|
end
|
71
83
|
|
72
84
|
def list_tags(image)
|
85
|
+
image = Repository.new image
|
73
86
|
if api_version == :v1
|
74
87
|
list_tags_v1(image)
|
75
88
|
elsif api_version == :v2
|
@@ -85,7 +98,8 @@ module PicsolveDockerBuilder
|
|
85
98
|
|
86
99
|
def headers
|
87
100
|
{
|
88
|
-
'Host' => http_host
|
101
|
+
'Host' => http_host,
|
102
|
+
'Authorization' => "Basic #{login_basic}"
|
89
103
|
}
|
90
104
|
end
|
91
105
|
|
@@ -96,11 +110,11 @@ module PicsolveDockerBuilder
|
|
96
110
|
)
|
97
111
|
end
|
98
112
|
|
99
|
-
def
|
113
|
+
def dockercfg_path
|
100
114
|
File.expand_path '~/.dockercfg'
|
101
115
|
end
|
102
116
|
|
103
|
-
def
|
117
|
+
def dockercfg
|
104
118
|
JSON.parse(
|
105
119
|
File.open(
|
106
120
|
dockercfg_path
|
@@ -108,58 +122,19 @@ module PicsolveDockerBuilder
|
|
108
122
|
)
|
109
123
|
end
|
110
124
|
|
111
|
-
def
|
112
|
-
auth = Base64.decode64(
|
113
|
-
get_login_basic(
|
114
|
-
*args
|
115
|
-
)
|
116
|
-
).split(':')
|
125
|
+
def creds
|
126
|
+
auth = Base64.decode64(login_basic).split(':')
|
117
127
|
{
|
118
128
|
'username' => auth[0],
|
119
129
|
'password' => auth[1]
|
120
130
|
}
|
121
131
|
end
|
122
132
|
|
123
|
-
def
|
124
|
-
dockercfg[
|
133
|
+
def login_basic
|
134
|
+
dockercfg[http_host]['auth']
|
125
135
|
rescue StandardError
|
126
136
|
nil
|
127
137
|
end
|
128
|
-
|
129
|
-
def self.repo_tag_unique(image_name)
|
130
|
-
repo_tag = image_name.split(%r{/})[1..-1].join('/')
|
131
|
-
repo_tag_split = repo_tag.split(/:/)
|
132
|
-
repo = repo_tag_split[0]
|
133
|
-
tag = repo_tag_split[1] || 'latest'
|
134
|
-
|
135
|
-
headers = {}
|
136
|
-
login_basic = get_login_basic
|
137
|
-
headers['Authorization'] = "Basic #{login_basic}" \
|
138
|
-
unless login_basic.nil?
|
139
|
-
|
140
|
-
connection = Excon.new(
|
141
|
-
'https://docker.picsolve.net',
|
142
|
-
headers: headers,
|
143
|
-
persistent: true
|
144
|
-
)
|
145
|
-
response = connection.get(path: "/v1/repositories/#{repo}/tags")
|
146
|
-
|
147
|
-
tags = JSON.parse(response.body)
|
148
|
-
|
149
|
-
hash = tags[tag]
|
150
|
-
|
151
|
-
tags.each do |t, h|
|
152
|
-
next if h != hash
|
153
|
-
next if t == tag
|
154
|
-
next unless t.match(/jenkins-[0-9]+/)
|
155
|
-
return {
|
156
|
-
tag_unique: "#{image_name.split(':').first}:#{t}",
|
157
|
-
hash: hash
|
158
|
-
}
|
159
|
-
end
|
160
|
-
|
161
|
-
fail "Can not find a uniqe tag for #{image_name}"
|
162
|
-
end
|
163
138
|
end
|
164
139
|
end
|
165
140
|
end
|
data/lib/tasks/compose.rake
CHANGED
@@ -24,4 +24,10 @@ namespace :compose do
|
|
24
24
|
@docker_compose.stage = stage
|
25
25
|
@docker_compose.deploy
|
26
26
|
end
|
27
|
+
|
28
|
+
desc 'Update version of container'
|
29
|
+
task :update do
|
30
|
+
require 'picsolve_docker_builder/helpers/config_version_update'
|
31
|
+
PicsolveDockerBuilder::Helpers::ConfigVersionUpdate.update_task
|
32
|
+
end
|
27
33
|
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.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Simon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -192,6 +192,20 @@ dependencies:
|
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: git
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
195
209
|
description:
|
196
210
|
email:
|
197
211
|
- christian.simon@picsolve.com
|
@@ -268,6 +282,7 @@ files:
|
|
268
282
|
- lib/picsolve_docker_builder/helpers/config/secret.rb
|
269
283
|
- lib/picsolve_docker_builder/helpers/config/variable_object.rb
|
270
284
|
- lib/picsolve_docker_builder/helpers/config_manager.rb
|
285
|
+
- lib/picsolve_docker_builder/helpers/config_version_update.rb
|
271
286
|
- lib/picsolve_docker_builder/helpers/kubeclient.rb
|
272
287
|
- lib/picsolve_docker_builder/helpers/kubernetes/pod.rb
|
273
288
|
- lib/picsolve_docker_builder/helpers/kubernetes/rc.rb
|