odania_ops 0.0.1 → 0.0.2
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/.gitignore +1 -0
- data/Gemfile.lock +13 -1
- data/README.md +11 -0
- data/lib/odania_ops/cli/docker.rb +55 -4
- data/lib/odania_ops/helper/docker.rb +5 -9
- data/lib/odania_ops/version.rb +2 -2
- data/lib/odania_ops.rb +11 -1
- data/odania_ops.gemspec +3 -2
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2ef4cec293379972baf2430c3d494740583cda2
|
4
|
+
data.tar.gz: 890d7dcdec897ca889ab16d38b07dfad0d5db7f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f7dc799bae8d45dde31c96520e29b6a7efcc9c320f64e325ebb29ada9874a6a6e2e7876a707b7e9c456a4d21975ddc740a67b43f5868a52f62bd9d96ad21199
|
7
|
+
data.tar.gz: cb5972ec0150e0958f67650ac6d35093816de9ce420e3dcb21a0b43c7872d7fdef3e95cde41eae082979cfc575a6841153e4fa5c5c878a571317b301c69105b4
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
odania_ops (0.0.
|
4
|
+
odania_ops (0.0.2)
|
5
|
+
activesupport
|
5
6
|
deep_merge
|
6
7
|
docker-api
|
7
8
|
httparty
|
@@ -10,6 +11,12 @@ PATH
|
|
10
11
|
GEM
|
11
12
|
remote: https://rubygems.org/
|
12
13
|
specs:
|
14
|
+
activesupport (4.2.4)
|
15
|
+
i18n (~> 0.7)
|
16
|
+
json (~> 1.7, >= 1.7.7)
|
17
|
+
minitest (~> 5.1)
|
18
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
19
|
+
tzinfo (~> 1.1)
|
13
20
|
deep_merge (1.0.1)
|
14
21
|
docker-api (1.24.1)
|
15
22
|
excon (>= 0.38.0)
|
@@ -18,9 +25,14 @@ GEM
|
|
18
25
|
httparty (0.13.7)
|
19
26
|
json (~> 1.8)
|
20
27
|
multi_xml (>= 0.5.2)
|
28
|
+
i18n (0.7.0)
|
21
29
|
json (1.8.3)
|
30
|
+
minitest (5.8.3)
|
22
31
|
multi_xml (0.5.5)
|
23
32
|
thor (0.19.1)
|
33
|
+
thread_safe (0.3.5)
|
34
|
+
tzinfo (1.2.2)
|
35
|
+
thread_safe (~> 0.1)
|
24
36
|
|
25
37
|
PLATFORMS
|
26
38
|
ruby
|
data/README.md
CHANGED
@@ -49,3 +49,14 @@ This will build and push to v10 and latest.
|
|
49
49
|
#### Version numbers
|
50
50
|
|
51
51
|
Version numbers are expected to be in tags like v1 (vNUMBER in general).
|
52
|
+
|
53
|
+
### base_image_check
|
54
|
+
|
55
|
+
This command checks all Dockerfiles under <folder> for new base images.
|
56
|
+
|
57
|
+
The folder name has to be the name of the image. The image is looked up in the registry from the config.
|
58
|
+
|
59
|
+
Example:
|
60
|
+
```
|
61
|
+
bundle exec ops docker base_image_check ~/workspace/docker
|
62
|
+
```
|
@@ -9,7 +9,7 @@ module OdaniaOps
|
|
9
9
|
build_tag = "v#{build_number}"
|
10
10
|
$logger.info "Building version #{build_tag}"
|
11
11
|
|
12
|
-
base_image = get_base_image(folder)
|
12
|
+
base_image = get_base_image File.expand_path('Dockerfile', folder)
|
13
13
|
$logger.info "Pulling base image #{base_image}"
|
14
14
|
OdaniaOps::Helper::Shell.execute("docker pull #{base_image}")
|
15
15
|
|
@@ -24,17 +24,33 @@ module OdaniaOps
|
|
24
24
|
OdaniaOps::Helper::Docker.push image_name
|
25
25
|
end
|
26
26
|
|
27
|
+
desc 'base_image_check <folder>', 'Searches for all Dockerfiles under <folder> and looks for the base image'
|
28
|
+
def base_image_check(folder)
|
29
|
+
failed_images = []
|
30
|
+
Dir.glob("#{folder}/**/Dockerfile").each do |file|
|
31
|
+
result = check_latest_base_image file
|
32
|
+
failed_images << result unless result
|
33
|
+
end
|
34
|
+
|
35
|
+
unless failed_images.empty?
|
36
|
+
puts
|
37
|
+
puts
|
38
|
+
puts 'The following images have newer base images:'
|
39
|
+
puts failed_images.inspect
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
27
44
|
private
|
28
45
|
|
29
46
|
def get_highest_build_number(image_name)
|
30
47
|
build_numbers = OdaniaOps::Helper::Docker.image_tags(image_name).map { |tag| tag.gsub('v', '').to_i }.sort
|
31
|
-
|
48
|
+
$logger.debug "Build numbers: #{build_numbers.inspect}"
|
32
49
|
return 0 if build_numbers.empty?
|
33
50
|
build_numbers.pop
|
34
51
|
end
|
35
52
|
|
36
|
-
def get_base_image(
|
37
|
-
docker_file = File.expand_path 'Dockerfile', folder
|
53
|
+
def get_base_image(docker_file)
|
38
54
|
contents = File.read(docker_file)
|
39
55
|
contents.split("\n").each do |line|
|
40
56
|
return line.gsub('FROM', '').strip if line.start_with? 'FROM'
|
@@ -42,6 +58,41 @@ module OdaniaOps
|
|
42
58
|
|
43
59
|
raise "No base image detected in #{docker_file}"
|
44
60
|
end
|
61
|
+
|
62
|
+
def check_latest_base_image(file)
|
63
|
+
path = File.dirname file
|
64
|
+
image_name = "#{OdaniaOps::Helper::Docker.registry_name}/#{path.split(File::SEPARATOR).last}"
|
65
|
+
base_image = get_base_image file
|
66
|
+
$logger.info "Found image \"#{image_name}\" with base image \"#{base_image}\""
|
67
|
+
|
68
|
+
$logger.debug "Pulling base image \"#{base_image}\""
|
69
|
+
OdaniaOps::Helper::Shell.execute("docker pull #{base_image}")
|
70
|
+
|
71
|
+
$logger.debug "Pulling image \"#{image_name}\""
|
72
|
+
OdaniaOps::Helper::Shell.execute("docker pull #{image_name}")
|
73
|
+
|
74
|
+
# Retrieve parent of image
|
75
|
+
parent_docker_image = ::Docker::Image.get image_name
|
76
|
+
docker_image = ::Docker::Image.get base_image
|
77
|
+
maintainer_found = false
|
78
|
+
last_entry = nil
|
79
|
+
parent_docker_image.history.each do |entry|
|
80
|
+
if maintainer_found
|
81
|
+
$logger.debug "Detected line before MAINTAINER: #{entry}"
|
82
|
+
last_entry = entry
|
83
|
+
break
|
84
|
+
end
|
85
|
+
maintainer_found = true if entry['CreatedBy'].include? 'MAINTAINER'
|
86
|
+
end
|
87
|
+
|
88
|
+
if docker_image.history.first.eql? last_entry
|
89
|
+
$logger.info "Image #{image_name} already has latest base image"
|
90
|
+
return true
|
91
|
+
end
|
92
|
+
|
93
|
+
$logger.error "Image #{image_name} has not the newest base image"
|
94
|
+
image_name
|
95
|
+
end
|
45
96
|
end
|
46
97
|
end
|
47
98
|
end
|
@@ -21,21 +21,20 @@ module OdaniaOps
|
|
21
21
|
def login
|
22
22
|
$logger.info "Loggin in to private registry #{registry_name}"
|
23
23
|
data = $config['docker']
|
24
|
-
puts data.inspect
|
25
24
|
OdaniaOps::Helper::Shell.execute("docker login --username=#{data['user']} --password=\"#{data['password']}\" --email=#{data['email']} #{registry_url}")
|
26
25
|
end
|
27
26
|
|
27
|
+
def registry_name
|
28
|
+
uri = URI.parse $config['docker']['url']
|
29
|
+
uri.host
|
30
|
+
end
|
31
|
+
|
28
32
|
private
|
29
33
|
|
30
34
|
def auth
|
31
35
|
{:username => $config['docker']['user'], :password => $config['docker']['password']}
|
32
36
|
end
|
33
37
|
|
34
|
-
def registry_name
|
35
|
-
uri = URI.parse $config['docker']['url']
|
36
|
-
uri.host
|
37
|
-
end
|
38
|
-
|
39
38
|
def registry_url
|
40
39
|
uri = URI.parse $config['docker']['url']
|
41
40
|
uri.path = '/v2'
|
@@ -45,9 +44,6 @@ module OdaniaOps
|
|
45
44
|
def get(query_url)
|
46
45
|
$logger.debug "Query registry: #{registry_url}#{query_url}"
|
47
46
|
response = HTTParty.get("#{registry_url}#{query_url}", :basic_auth => auth)
|
48
|
-
puts response.inspect
|
49
|
-
puts response.code
|
50
|
-
puts response.parsed_response.inspect
|
51
47
|
return response.code, response.parsed_response
|
52
48
|
end
|
53
49
|
end
|
data/lib/odania_ops/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module OdaniaOps
|
2
|
-
VERSION = '0.0.
|
3
|
-
end
|
2
|
+
VERSION = '0.0.2'
|
3
|
+
end
|
data/lib/odania_ops.rb
CHANGED
@@ -4,6 +4,8 @@ require 'httparty'
|
|
4
4
|
require 'logger'
|
5
5
|
require 'yaml'
|
6
6
|
require 'deep_merge/rails_compat'
|
7
|
+
require 'active_support/all'
|
8
|
+
require 'docker-api'
|
7
9
|
|
8
10
|
require_relative 'odania_ops/cli/config'
|
9
11
|
require_relative 'odania_ops/cli/docker'
|
@@ -16,11 +18,19 @@ $logger = Logger.new(STDOUT)
|
|
16
18
|
$logger.level = Logger::INFO
|
17
19
|
|
18
20
|
# Load Config
|
19
|
-
OdaniaOps::Helper::Config.load_config(__FILE__)
|
21
|
+
OdaniaOps::Helper::Config.load_config(File.dirname(__FILE__))
|
20
22
|
|
21
23
|
module OdaniaOps
|
22
24
|
module Cli
|
23
25
|
class Application < Thor
|
26
|
+
class_option :log_level, :default => 'INFO', :aliases => '-l', enum: %w(INFO DEBUG ERROR WARN UNKNOWN FATAL), desc: 'Set Log Level'
|
27
|
+
|
28
|
+
def initialize(*args)
|
29
|
+
super
|
30
|
+
|
31
|
+
$logger.level = "Logger::#{options['log_level']}".constantize
|
32
|
+
end
|
33
|
+
|
24
34
|
desc 'docker', 'Docker helper'
|
25
35
|
subcommand 'docker', Docker
|
26
36
|
|
data/odania_ops.gemspec
CHANGED
@@ -16,8 +16,9 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = OdaniaOps::VERSION
|
17
17
|
gem.license = 'MIT'
|
18
18
|
|
19
|
-
gem.add_dependency '
|
19
|
+
gem.add_dependency 'activesupport'
|
20
|
+
gem.add_dependency 'deep_merge'
|
20
21
|
gem.add_dependency 'docker-api'
|
21
22
|
gem.add_dependency 'httparty'
|
22
|
-
gem.add_dependency '
|
23
|
+
gem.add_dependency 'thor'
|
23
24
|
end
|
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: odania_ops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Petersen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: deep_merge
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
@@ -53,7 +67,7 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: thor
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - ">="
|