odania_ops 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">="