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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f42edd75a33b30dc4e03ae007b144552d61a6ec0
4
- data.tar.gz: b65df0c2568b7f53e79e3c8b0fecf524e82507f2
3
+ metadata.gz: f2ef4cec293379972baf2430c3d494740583cda2
4
+ data.tar.gz: 890d7dcdec897ca889ab16d38b07dfad0d5db7f5
5
5
  SHA512:
6
- metadata.gz: 20f456049862905d6431e812e94b8cba282618a757a3c0b1073cfcfb6efb46dd8372125b3bb0b5afea3df7ed2e92f814ddddbeddeeda13cdd10dc11cb9f32259
7
- data.tar.gz: 0e3b14e76ef8874a15313d4369369c57b4673a1c947b85ca0c7987d9e747c9270f051c456d2e2d20cf9e85b978820b135e3862cbf52447957755fc16089ee51c
6
+ metadata.gz: 8f7dc799bae8d45dde31c96520e29b6a7efcc9c320f64e325ebb29ada9874a6a6e2e7876a707b7e9c456a4d21975ddc740a67b43f5868a52f62bd9d96ad21199
7
+ data.tar.gz: cb5972ec0150e0958f67650ac6d35093816de9ce420e3dcb21a0b43c7872d7fdef3e95cde41eae082979cfc575a6841153e4fa5c5c878a571317b301c69105b4
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  .idea
2
+ pkg
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- odania_ops (0.0.1)
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
- puts build_numbers.inspect
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(folder)
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
@@ -1,3 +1,3 @@
1
1
  module OdaniaOps
2
- VERSION = '0.0.1'
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 'thor'
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 'deep_merge'
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.1
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-03 00:00:00.000000000 Z
11
+ date: 2016-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: thor
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: deep_merge
70
+ name: thor
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="