reagan 0.6.1 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6d0ac4c6953b8002c591704a429494fb946235e
4
- data.tar.gz: 317e69c6027b0e9bc36b1eb0821480ca754f1f4d
3
+ metadata.gz: 15ec9f842a5eb1a06dd654d4f461da338026c746
4
+ data.tar.gz: 45f46483cf968a1df4fc629c0243a785860fe4fd
5
5
  SHA512:
6
- metadata.gz: 96c72971adc53d14935b167ad37c7ec9192d975a07d330b171be8e45b1de19aff8e7099fb699178a64f813efe97366b81701b189393b6360952b2de1374e2cac
7
- data.tar.gz: 56ccd982033fd749129f4c8296eac63ef4a91b0017cb703cabc7532ce60cea5ba766022a1cff35e382ea3a9f3e873fab46b2d902d397682d21542b77a35a6d0f
6
+ metadata.gz: 8a8ff757808d472928da7a48c2dd08acffad84bfc4515bb0067db1d4018947253e5248cf2dd2aadf50b4492c8e5cde4cb28ad90f6adede0caa8025dd17d4550f
7
+ data.tar.gz: 0b6c0efd5e6f93a94075130c75705a6c5ce2cb4ea18d9fb6f41f56b8bfc168c53f12302a3fcb2448348509ae048b59485141e476a32632f01f92a9493fe8da00
data/.gitignore ADDED
@@ -0,0 +1,38 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ Gemfile.lock
30
+ # .ruby-version
31
+ # .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
35
+
36
+ .DS_Store
37
+ config.yml
38
+
data/.rubocop.yml ADDED
@@ -0,0 +1,22 @@
1
+ AllCops:
2
+ Exclude:
3
+ - vendor/**
4
+
5
+ AlignParameters:
6
+ Enabled: false
7
+ CyclomaticComplexity:
8
+ Enabled: false
9
+ Encoding:
10
+ Enabled: false
11
+ HashSyntax:
12
+ Enabled: false
13
+ LineLength:
14
+ Enabled: false
15
+ MethodLength:
16
+ Max: 30
17
+ NumericLiterals:
18
+ Enabled: false
19
+ SingleSpaceBeforeFirstArg:
20
+ Enabled: false
21
+ PerceivedComplexity:
22
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'octokit', '~> 3.0'
4
+ gem 'chef', '~> 11.0'
5
+ gem 'ridley', '~> 4.0'
6
+ gem 'rake', '~> 10.0'
data/README.md CHANGED
@@ -31,11 +31,11 @@ While this app is written to be run as a Jenkins job it can also be run locally.
31
31
  source 'https://rubygems.org'
32
32
 
33
33
  gem 'chef', '~> 11.0'
34
- gem 'berkshelf', '~> 3.1'
34
+ gem 'berkshelf', '~> 3.2'
35
35
 
36
36
  group :test do
37
- gem 'reagan', '~> 0.4'
38
- gem 'rubocop', '~> 0.26'
37
+ gem 'reagan', '~> 0.6'
38
+ gem 'rubocop', '~> 0.27'
39
39
  gem 'foodcritic', '~> 4.0'
40
40
  end
41
41
  ```
data/bin/reagan CHANGED
@@ -19,31 +19,6 @@
19
19
  # load the libs
20
20
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
21
21
 
22
- require 'reagan'
23
- require 'optparse'
22
+ require 'application'
24
23
 
25
- flags = { :pull => nil, :override_cookbooks => nil, :config => '/etc/reagan.yml' }
26
-
27
- parser = OptionParser.new do |opts|
28
- opts.banner = 'Usage: reagan [options]'
29
- opts.on('-o', '--override cb1,cb2', 'Comma separated list of cookbooks to test') do |cookbooks|
30
- flags[:override_cookbooks] = cookbooks.split(',')
31
- end
32
-
33
- opts.on('-p', '--pull_num 123', 'Github pull number to test') do |pull|
34
- flags[:pull] = pull
35
- end
36
-
37
- opts.on('-c', '--config reagan.yml', 'Path to config file (defaults to /etc/reagan.yml)') do |config|
38
- flags[:config] = config
39
- end
40
-
41
- opts.on('-h', '--help', 'Displays Help') do
42
- puts opts
43
- exit
44
- end
45
- end
46
-
47
- parser.parse!
48
-
49
- Reagan.new(flags).run
24
+ Reagan::Application.new.run
@@ -0,0 +1,96 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author:: Tim Smith (<tim@cozy.co>)
4
+ # Copyright:: Copyright (c) 2014 Tim Smith
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ module Reagan
20
+ # the main class for the reagan app. gets called by the reagan bin
21
+ class Application
22
+ require 'config'
23
+ require 'change'
24
+ require 'test_json'
25
+ require 'test_knife'
26
+ require 'test_reagan'
27
+ require 'test_version'
28
+
29
+ attr_accessor :config
30
+ def initialize
31
+ @@config = Reagan::Config.new.settings
32
+ @changes = Reagan::Change.new.files
33
+ end
34
+
35
+ def self.config
36
+ @@config
37
+ end
38
+
39
+ # nicely prints marques
40
+ def pretty_print(string)
41
+ puts "\n#{string}"
42
+ string.length.times { printf '-' }
43
+ puts "\n"
44
+ end
45
+
46
+ # exit with a friendly message if nothing we test has been changed
47
+ def check_empty_update
48
+ objects_updated = false
49
+ %w(cookbooks roles environments data_bags).each do |object|
50
+ objects_updated = true unless @changes[object].empty?
51
+ end
52
+
53
+ unless objects_updated
54
+ pretty_print('No objects to test. Exiting')
55
+ exit 0
56
+ end
57
+ end
58
+
59
+ # run tests on each changed cookbook
60
+ def run
61
+ check_empty_update
62
+
63
+ # print objects that will be tested
64
+ pretty_print('The following chef objects will be tested')
65
+ %w(cookbooks roles environments data_bags).each do |type|
66
+ unless @changes[type].empty?
67
+ puts "#{type}:"
68
+ @changes[type].each { |obj| puts ' ' + obj }
69
+ end
70
+ end
71
+
72
+ results = []
73
+ @changes['cookbooks'].each do |cookbook|
74
+ pretty_print("Testing cookbook #{cookbook}")
75
+ results << Reagan::TestKnife.new(cookbook).test
76
+ results << Reagan::TestVersion.new(cookbook).test
77
+ results << Reagan::TestReagan.new(cookbook).test
78
+ end
79
+
80
+ %w(data_bags roles environments).each do |type|
81
+ @changes[type].each do |file|
82
+ pretty_print("Testing #{type} file #{file}")
83
+ results << TestJSON.new(file).test
84
+ end
85
+ end
86
+
87
+ # print success or failure
88
+ failure = results.include?(false)
89
+ text = failure ? 'Reagan testing has failed' : 'All Reagan tests have suceeded'
90
+ pretty_print(text)
91
+
92
+ # if any test failed then exit 1 so jenkins can pick up the failure
93
+ exit 1 if failure
94
+ end
95
+ end
96
+ end
data/lib/change.rb CHANGED
@@ -17,81 +17,99 @@
17
17
  # limitations under the License.
18
18
 
19
19
  begin
20
- require 'reagan'
21
20
  require 'rubygems'
22
21
  require 'octokit'
23
22
  rescue LoadError => e
24
23
  raise "Missing gem or lib #{e}"
25
24
  end
26
25
 
27
- # determines changed files in the commit
28
- class Change < Reagan
29
- attr_accessor :files
30
- def initialize
31
- @files = changed_files
32
- end
26
+ module Reagan
27
+ # determines changed files in the commit
28
+ class Change < Application
29
+ attr_accessor :files
30
+ def initialize
31
+ @config = Reagan::Change.config
32
+ @files = changed_files
33
+ end
33
34
 
34
- # return hash of chef objects that have been changed
35
- def changed_files
36
- if @@config['flags']['override_cookbooks']
37
- files_from_override
38
- else
39
- pull = pull_num
40
- puts "Grabbing contents of pull request #{pull}\n"
41
- hash_builder(query_gh(pull))
35
+ # return hash of chef objects that have been changed
36
+ def changed_files
37
+ if @config['flags']['override_cookbooks']
38
+ files_from_override
39
+ else
40
+ pull = pull_num
41
+ puts "Grabbing contents of pull request #{pull}\n"
42
+ hash_builder(query_gh(pull))
43
+ end
42
44
  end
43
- end
44
45
 
45
- # build a files hash based on the override cookbooks passed by the user
46
- def files_from_override
47
- files = {}
48
- %w(environments roles data_bags).each { |object| files[object] = {} }
49
- files['cookbooks'] = @@config['flags']['override_cookbooks']
50
- files
51
- end
46
+ # build a files hash based on the override cookbooks passed by the user
47
+ def files_from_override
48
+ files = {}
49
+ %w(environments roles data_bags).each { |object| files[object] = {} }
52
50
 
53
- # fetch pull num from either ENV or CLI param
54
- def pull_num
55
- if @@config['flags']['pull']
56
- pull = @@config['flags']['pull']
57
- elsif ENV['ghprbPullId']
58
- pull = ENV['ghprbPullId']
59
- else
60
- puts 'Jenkins ghprbPullId environmental variable not set or --pull option not used. Cannot continue'
61
- exit 1
51
+ # ensure that the passed cookbooks exist in the workspace first
52
+ cookbooks = []
53
+ @config['flags']['override_cookbooks'] .each do |cb|
54
+ if object_still_exists(::File.join('cookbooks/', cb))
55
+ cookbooks << cb
56
+ else
57
+ puts "Skipping override cookbook #{cb} as it does not exist in the workspace"
58
+ end
59
+ end
60
+
61
+ files['cookbooks'] = cookbooks
62
+ files
62
63
  end
63
- pull
64
- end
65
64
 
66
- # queries github for the files that have changed
67
- def query_gh(pull_num)
68
- gh = Octokit::Client.new(:access_token => @@config['github']['auth_token'])
69
- files_from_pull(gh.pull_request_files(@@config ['github']['repo'], pull_num))
70
- end
65
+ # fetch pull num from either ENV or CLI param
66
+ def pull_num
67
+ if @config['flags']['pull']
68
+ pull = @config['flags']['pull']
69
+ elsif ENV['ghprbPullId']
70
+ pull = ENV['ghprbPullId']
71
+ else
72
+ puts 'Jenkins ghprbPullId environmental variable not set or --pull option not used. Cannot continue'
73
+ exit 1
74
+ end
75
+ pull
76
+ end
71
77
 
72
- # convert pull request response to array of changed files
73
- def files_from_pull(pull_changes)
74
- files = []
75
- pull_changes.each do |file|
76
- files << file[:filename]
78
+ # queries github for the files that have changed
79
+ def query_gh(pull_num)
80
+ gh = Octokit::Client.new(:access_token => @config['github']['auth_token'])
81
+ files_from_pull(gh.pull_request_files(@config ['github']['repo'], pull_num))
82
+ end
83
+
84
+ # convert pull request response to array of changed files
85
+ def files_from_pull(pull_changes)
86
+ files = []
87
+ pull_changes.each do |file|
88
+ files << file[:filename]
89
+ end
90
+ files
91
+ end
92
+
93
+ # check to see if the file exists in the workspace so we don't test deleted objects
94
+ def object_still_exists(file)
95
+ ::File.exist?(::File.join(@config['jenkins']['workspace_dir'],file))
77
96
  end
78
- files
79
- end
80
97
 
81
- # builds a hash of files / cookbooks that changed based on the pull data from GH
82
- def hash_builder(pull_files)
83
- files = {}
84
- %w(environments roles data_bags cookbooks).each { |object| files[object] = [] }
85
- cookbooks = []
98
+ # builds a hash of files / cookbooks that changed based on the pull data from GH
99
+ def hash_builder(pull_files)
100
+ files = {}
101
+ %w(environments roles data_bags cookbooks).each { |object| files[object] = [] }
102
+ cookbooks = []
86
103
 
87
- pull_files.each do |file|
88
- files['environments'] << file && next if file.match('^environments')
89
- files['roles'] << file && next if file.match('^roles')
90
- files['data_bags'] << file && next if file.match('^data_bags')
91
- cookbooks << file.split('/')[1] if file.match('^cookbooks')
104
+ pull_files.each do |file|
105
+ files['environments'] << file && next if file.match('^environments') && object_still_exists(file)
106
+ files['roles'] << file && next if file.match('^roles') && object_still_exists(file)
107
+ files['data_bags'] << file && next if file.match('^data_bags') && object_still_exists(file)
108
+ cookbooks << file.split('/')[1] if file.match('^cookbooks') && object_still_exists(::File.join('cookbooks/', file.split('/')[1]))
109
+ end
110
+ # set cookbooks array to set to dedupe list of cookbooks
111
+ files['cookbooks'] = cookbooks.to_set
112
+ files
92
113
  end
93
- # set cookbooks array to set to dedupe list of cookbooks
94
- files['cookbooks'] = cookbooks.to_set
95
- files
96
114
  end
97
115
  end
data/lib/config.rb CHANGED
@@ -18,41 +18,69 @@
18
18
 
19
19
  begin
20
20
  require 'yaml'
21
+ require 'optparse'
21
22
  rescue LoadError => e
22
23
  raise "Missing gem or lib #{e}"
23
24
  end
24
25
 
25
- # builds a single config from passed flags, yaml config, and knife.rb
26
- class ReaganConfig
27
- attr_accessor :settings
28
- def initialize(flags)
29
- @flags = flags
30
- @config_file = load_config_file
31
- @settings = build_config
32
- end
26
+ module Reagan
27
+ # builds a single config from passed flags, yaml config, and knife.rb
28
+ class Config
29
+ attr_accessor :settings
30
+ def initialize
31
+ @flags = flag_parser
32
+ @config_file = load_config_file
33
+ @settings = build_config
34
+ end
35
+
36
+ # grabs the flags passed in via command line
37
+ def flag_parser
38
+ flags = { :pull => nil, :override_cookbooks => nil, :config => '/etc/reagan.yml' }
39
+ OptionParser.new do |opts|
40
+ opts.banner = 'Usage: reagan [options]'
41
+ opts.on('-o', '--override cb1,cb2', 'Comma separated list of cookbooks to test') do |cookbooks|
42
+ flags[:override_cookbooks] = cookbooks.split(',')
43
+ end
44
+
45
+ opts.on('-p', '--pull_num 123', 'Github pull number to test') do |pull|
46
+ flags[:pull] = pull
47
+ end
48
+
49
+ opts.on('-c', '--config reagan.yml', 'Path to config file (defaults to /etc/reagan.yml)') do |config|
50
+ flags[:config] = config
51
+ end
52
+
53
+ opts.on('-h', '--help', 'Displays Help') do
54
+ puts opts
55
+ exit
56
+ end
57
+ end.parse!
33
58
 
34
- # loads the reagan.yml config file from /etc/reagan.yml or the passed location
35
- def load_config_file
36
- config = YAML.load_file(@flags[:config])
37
- if config == false
38
- puts "ERROR: Reagan config at #{@flags[:config]} does not contain any configuration data"
59
+ flags
60
+ end
61
+
62
+ # loads the reagan.yml config file from /etc/reagan.yml or the passed location
63
+ def load_config_file
64
+ config = YAML.load_file(@flags[:config])
65
+ if config == false
66
+ puts "ERROR: Reagan config at #{@flags[:config]} does not contain any configuration data"
67
+ exit 1
68
+ end
69
+ config
70
+ rescue Errno::ENOENT
71
+ puts "ERROR: Cannot load Reagan config file at #{@flags[:config]}"
72
+ exit 1
73
+ rescue Psych::SyntaxError
74
+ puts "ERROR: Syntax error in Reagan config file at #{@flags[:config]}"
39
75
  exit 1
40
76
  end
41
- config
42
- rescue Errno::ENOENT
43
- puts "ERROR: Cannot load Reagan config file at #{@flags[:config]}"
44
- exit 1
45
- rescue Psych::SyntaxError
46
- puts "ERROR: Syntax error in Reagan config file at #{@flags[:config]}"
47
- exit 1
48
- end
49
77
 
50
- # join the config file with the passed flags into a single object
51
- def build_config
52
- config = @config_file
53
- config['flags'] = {}
54
- @flags.each { |k, v| config['flags'][k.to_s] = v }
55
- config
78
+ # join the config file with the passed flags into a single object
79
+ def build_config
80
+ config = @config_file
81
+ config['flags'] = {}
82
+ @flags.each { |k, v| config['flags'][k.to_s] = v }
83
+ config
84
+ end
56
85
  end
57
-
58
86
  end
data/lib/test_json.rb CHANGED
@@ -22,24 +22,27 @@ rescue LoadError => e
22
22
  raise "Missing gem or lib #{e}"
23
23
  end
24
24
 
25
- # tests to make sure the version has been updated on the cookbook
26
- class TestJSON < Reagan
27
- def initialize(file)
28
- @file = file
29
- end
25
+ module Reagan
26
+ # tests to make sure the version has been updated on the cookbook
27
+ class TestJSON < Application
28
+ def initialize(file)
29
+ @config = Reagan::TestJSON.config
30
+ @file = file
31
+ end
30
32
 
31
- # performs JSON format test
32
- # returns true if json can be parsed and false if it cannot
33
- def test
34
- puts "Running JSON parsing test:"
35
- begin
36
- json_file = File.read(File.join(@@config['jenkins']['workspace_dir'], @file))
37
- JSON.parse(json_file)
38
- success = true
39
- rescue JSON::JSONError
40
- success = false
33
+ # performs JSON format test
34
+ # returns true if json can be parsed and false if it cannot
35
+ def test
36
+ puts 'Running JSON parsing test:'
37
+ begin
38
+ json_file = File.read(File.join(@config['jenkins']['workspace_dir'], @file))
39
+ JSON.parse(json_file)
40
+ success = true
41
+ rescue JSON::JSONError
42
+ success = false
43
+ end
44
+ puts success ? ' PASS: JSON parses' : ' FAIL: JSON does NOT parse'
45
+ success
41
46
  end
42
- puts success ? " PASS: JSON parses" : " FAIL: JSON does NOT parse"
43
- success
44
47
  end
45
48
  end
data/lib/test_knife.rb CHANGED
@@ -16,20 +16,23 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
 
19
- # tests cookbooks using knife cookbook test functionality
20
- class TestKnife < Reagan
21
- def initialize(cookbook)
22
- @cookbook = cookbook
23
- end
19
+ module Reagan
20
+ # tests cookbooks using knife cookbook test functionality
21
+ class TestKnife < Application
22
+ def initialize(cookbook)
23
+ @config = Reagan::TestKnife.config
24
+ @cookbook = cookbook
25
+ end
24
26
 
25
- # performs knife cookbook test
26
- # returns true if cookbook passed or false if it failed
27
- def test
28
- # grab the version of the cookbook in the local metadata
29
- result = system "knife cookbook test -o #{File.join(@@config['jenkins']['workspace_dir'], 'cookbooks')} #{@cookbook} > /dev/null 2>&1"
27
+ # performs knife cookbook test
28
+ # returns true if cookbook passed or false if it failed
29
+ def test
30
+ # grab the version of the cookbook in the local metadata
31
+ result = system "knife cookbook test -o #{File.join(@@config['jenkins']['workspace_dir'], 'cookbooks')} #{@cookbook} > /dev/null 2>&1"
30
32
 
31
- puts 'Running knife cookbook test:'
32
- puts result ? ' PASS: Knife cookbook test was successful' : ' FAIL: Knife cookbookk test was NOT successful'
33
- result
33
+ puts 'Running knife cookbook test:'
34
+ puts result ? ' PASS: Knife cookbook test was successful' : ' FAIL: Knife cookbookk test was NOT successful'
35
+ result
36
+ end
34
37
  end
35
38
  end
data/lib/test_reagan.rb CHANGED
@@ -16,34 +16,38 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
 
19
- # tests cookbooks using tests defined in reagan_test.yml files
20
- class TestReagan < Reagan
21
- def initialize(cookbook)
22
- @cookbook = cookbook
23
- end
19
+ module Reagan
20
+ # tests cookbooks using tests defined in reagan_test.yml files
21
+ class TestReagan < Application
22
+ def initialize(cookbook)
23
+ @config = Reagan::TestReagan.config
24
+ @cookbook = cookbook
25
+ end
24
26
 
25
- # returns true if tests defined in reagan_test.yml passed/don't exist or false if it failed
26
- def test
27
- puts 'Running reagan_test.yml defined tests:'
28
- # check to see if a reagan_test.yml file exists
29
- if File.exist?(File.join(@@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook, 'reagan_test.yml'))
27
+ # returns true if tests defined in reagan_test.yml passed/don't exist or false if it failed
28
+ def test
29
+ puts 'Running reagan_test.yml defined tests:'
30
+ # check to see if a reagan_test.yml file exists
31
+ if File.exist?(File.join(@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook, 'reagan_test.yml'))
30
32
 
31
- # load the reagan config file
32
- reagan_def = YAML.load_file(File.join(@@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook, 'reagan_test.yml'))
33
+ # load the reagan config file
34
+ reagan_def = YAML.load_file(File.join(@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook, 'reagan_test.yml'))
33
35
 
34
- # change into the cookbook dir so rake tests run locally
35
- Dir.chdir(File.join(@@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook))
36
+ # change into the cookbook dir so rake tests run locally
37
+ Dir.chdir(File.join(@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook))
36
38
 
37
- status = true
38
- reagan_def['tests'].each do |test|
39
- result = system test
40
- status = false if result == false
39
+ status = true
40
+ reagan_def['tests'].each do |test|
41
+ puts " reagan_test.yml test: '#{test}'"
42
+ result = system test
43
+ status = false if result == false
44
+ end
45
+ puts status ? ' PASS: reagan_test.yml test was successful' : ' FAIL: reagan_test.yml test was NOT successful'
46
+ status
47
+ else
48
+ puts ' SKIP: No reagan_test.yml file found in the cookbook path. Skipping test'
49
+ status
41
50
  end
42
- puts status ? ' PASS: reagan_test.yml test was successful' : ' FAIL: reagan_test.yml test was NOT successful'
43
- status
44
- else
45
- puts ' SKIP: No reagan_test.yml file found in the cookbook path. Skipping test'
46
- status
47
51
  end
48
52
  end
49
53
  end
data/lib/test_version.rb CHANGED
@@ -24,52 +24,55 @@ rescue LoadError => e
24
24
  raise "Missing gem or lib #{e}"
25
25
  end
26
26
 
27
- # tests to make sure the version has been updated on the cookbook
28
- class TestVersion < Reagan
29
- def initialize(cookbook)
30
- @cookbook = cookbook
31
- end
27
+ module Reagan
28
+ # tests to make sure the version has been updated on the cookbook
29
+ class TestVersion < Application
30
+ def initialize(cookbook)
31
+ @config = Reagan::TestVersion.config
32
+ @cookbook = cookbook
33
+ end
32
34
 
33
- # grab the version of the cookbook in the local metadata
34
- def check_commit_version
35
- metadata = Chef::Cookbook::Metadata.new
36
- metadata.from_file(File.join(@@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook, 'metadata.rb'))
37
- metadata.version
38
- end
35
+ # grab the version of the cookbook in the local metadata
36
+ def check_commit_version
37
+ metadata = Chef::Cookbook::Metadata.new
38
+ metadata.from_file(File.join(@config['jenkins']['workspace_dir'], 'cookbooks', @cookbook, 'metadata.rb'))
39
+ metadata.version
40
+ end
39
41
 
40
- # grab the most recent version of the cookbook on the chef server
41
- def check_server_version
42
- Ridley::Logging.logger.level = Logger.const_get 'ERROR'
43
- begin
44
- server_con = Ridley.new(
45
- server_url: @@config['chef']['server_url'],
46
- client_name: @@config['chef']['client_name'],
47
- client_key: @@config['chef']['pem_path'],
48
- ssl: { verify: false }
49
- )
50
- # return the version if the cookbook exists or return 0.0.0 if it's a new coobook not yet on the server
51
- if server_con.cookbook.all[@cookbook]
52
- server_con.cookbook.all[@cookbook][0]
53
- else
54
- '0.0.0'
42
+ # grab the most recent version of the cookbook on the chef server
43
+ def check_server_version
44
+ Ridley::Logging.logger.level = Logger.const_get 'ERROR'
45
+ begin
46
+ server_con = Ridley.new(
47
+ server_url: @config['chef']['server_url'],
48
+ client_name: @config['chef']['client_name'],
49
+ client_key: @config['chef']['pem_path'],
50
+ ssl: { verify: false }
51
+ )
52
+ # return the version if the cookbook exists or return 0.0.0 if it's a new coobook not yet on the server
53
+ if server_con.cookbook.all[@cookbook]
54
+ server_con.cookbook.all[@cookbook][0]
55
+ else
56
+ '0.0.0'
57
+ end
58
+ rescue Ridley::Errors::ConnectionFailed
59
+ puts ' ERROR: Failed to connect to the Chef server. Cannot continue'
60
+ exit 1
55
61
  end
56
- rescue Ridley::Errors::ConnectionFailed
57
- puts ' ERROR: Failed to connect to the Chef server. Cannot continue'
58
- exit 1
59
62
  end
60
- end
61
63
 
62
- # performs version update test
63
- # returns true if version has been rev'd and false if not
64
- def test
65
- commit_v = check_commit_version
66
- serv_v = check_server_version
67
- updated = Gem::Version.new(serv_v) < Gem::Version.new(commit_v) ? true : false
64
+ # performs version update test
65
+ # returns true if version has been rev'd and false if not
66
+ def test
67
+ commit_v = check_commit_version
68
+ serv_v = check_server_version
69
+ updated = Gem::Version.new(serv_v) < Gem::Version.new(commit_v) ? true : false
68
70
 
69
- puts "Running cookbook version rev'd test:"
70
- puts " Server version: #{serv_v}"
71
- puts " Commit version: #{commit_v}"
72
- puts updated ? " PASS: Metadata version has been rev'd" : " FAIL: Metadata version has NOT been rev'd"
73
- updated
71
+ puts "Running cookbook version rev'd test:"
72
+ puts " Server version: #{serv_v}"
73
+ puts " Commit version: #{commit_v}"
74
+ puts updated ? " PASS: Metadata version has been rev'd" : " FAIL: Metadata version has NOT been rev'd"
75
+ updated
76
+ end
74
77
  end
75
78
  end
data/reagan.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'reagan'
3
+ s.version = '0.7.0'
4
+ s.date = Date.today.to_s
5
+ s.platform = Gem::Platform::RUBY
6
+ s.extra_rdoc_files = ['README.md', 'LICENSE']
7
+ s.summary = 'Trust But Verify - Ruby build script for Jenkins that automates the testing of Chef cookbooks'
8
+ s.description = s.summary
9
+ s.authors = ['Tim Smith']
10
+ s.email = 'tim@cozy.co'
11
+ s.homepage = 'http://www.github.com/tas50/reagan'
12
+ s.license = 'Apache-2.0'
13
+
14
+ s.required_ruby_version = '>= 1.9.3'
15
+ s.add_dependency 'octokit', '~> 3.0'
16
+ s.add_dependency 'chef', '~> 11.0'
17
+ s.add_dependency 'ridley', '~> 4.0'
18
+ s.add_development_dependency 'rake', '~> 10.0'
19
+
20
+ s.files = `git ls-files -z`.split("\x0")
21
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
+ s.require_paths = ['lib']
23
+ s.extra_rdoc_files = ['README.md']
24
+ s.rdoc_options = ['--line-numbers', '--inline-source', '--title', 'reagan', '--main', 'README.md']
25
+ end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reagan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-17 00:00:00.000000000 Z
11
+ date: 2014-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: octokit
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chef
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '11.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '11.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ridley
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '4.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '10.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
69
  description: Trust But Verify - Ruby build script for Jenkins that automates the testing
@@ -74,19 +74,22 @@ executables:
74
74
  extensions: []
75
75
  extra_rdoc_files:
76
76
  - README.md
77
- - LICENSE
78
77
  files:
78
+ - .gitignore
79
+ - .rubocop.yml
80
+ - Gemfile
79
81
  - LICENSE
80
82
  - README.md
81
83
  - Rakefile
82
84
  - bin/reagan
85
+ - lib/application.rb
83
86
  - lib/change.rb
84
87
  - lib/config.rb
85
- - lib/reagan.rb
86
88
  - lib/test_json.rb
87
89
  - lib/test_knife.rb
88
90
  - lib/test_reagan.rb
89
91
  - lib/test_version.rb
92
+ - reagan.gemspec
90
93
  - reagan.yml.EXAMPLE
91
94
  - reagan_test.yml.EXAMPLE
92
95
  homepage: http://www.github.com/tas50/reagan
@@ -94,25 +97,30 @@ licenses:
94
97
  - Apache-2.0
95
98
  metadata: {}
96
99
  post_install_message:
97
- rdoc_options: []
100
+ rdoc_options:
101
+ - --line-numbers
102
+ - --inline-source
103
+ - --title
104
+ - reagan
105
+ - --main
106
+ - README.md
98
107
  require_paths:
99
108
  - lib
100
109
  required_ruby_version: !ruby/object:Gem::Requirement
101
110
  requirements:
102
- - - ">="
111
+ - - '>='
103
112
  - !ruby/object:Gem::Version
104
113
  version: 1.9.3
105
114
  required_rubygems_version: !ruby/object:Gem::Requirement
106
115
  requirements:
107
- - - ">="
116
+ - - '>='
108
117
  - !ruby/object:Gem::Version
109
118
  version: '0'
110
119
  requirements: []
111
120
  rubyforge_project:
112
- rubygems_version: 2.4.1
121
+ rubygems_version: 2.4.2
113
122
  signing_key:
114
123
  specification_version: 4
115
124
  summary: Trust But Verify - Ruby build script for Jenkins that automates the testing
116
125
  of Chef cookbooks
117
126
  test_files: []
118
- has_rdoc:
data/lib/reagan.rb DELETED
@@ -1,90 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Author:: Tim Smith (<tim@cozy.co>)
4
- # Copyright:: Copyright (c) 2014 Tim Smith
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- # the main class for the reagan app. gets called by the reagan bin
20
- class Reagan
21
- require 'config'
22
- require 'change'
23
- require 'test_knife'
24
- require 'test_version'
25
- require 'test_reagan'
26
- require 'test_json'
27
-
28
- attr_accessor :config
29
- def initialize(flags)
30
- @@config = ReaganConfig.new(flags).settings
31
- @changes = Change.new.files
32
- end
33
-
34
- # nicely prints marques
35
- def pretty_print(string)
36
- puts "\n#{string}"
37
- string.length.times { printf '-' }
38
- puts "\n"
39
- end
40
-
41
- # exit with a friendly message if nothing we test has been changed
42
- def check_empty_update
43
- objects_updated = false
44
- %w(cookbooks roles environments data_bags).each do |object|
45
- objects_updated = true unless @changes[object].empty?
46
- end
47
-
48
- unless objects_updated
49
- pretty_print('No objects to test. Exiting')
50
- exit 0
51
- end
52
- end
53
-
54
- # run tests on each changed cookbook
55
- def run
56
- check_empty_update
57
-
58
- # print objects that will be tested
59
- pretty_print('The following chef objects will be tested')
60
- %w(cookbooks roles environments data_bags).each do |type|
61
- unless @changes[type].empty?
62
- puts "#{type}:"
63
- @changes[type].each { |obj| puts ' ' + obj }
64
- end
65
- end
66
-
67
- results = []
68
- @changes['cookbooks'].each do |cookbook|
69
- pretty_print("Testing cookbook #{cookbook}")
70
- results << TestKnife.new(cookbook).test
71
- results << TestVersion.new(cookbook).test
72
- results << TestReagan.new(cookbook).test
73
- end
74
-
75
- %w(data_bags roles environments).each do |type|
76
- @changes[type].each do |file|
77
- pretty_print("Testing #{type} file #{file}")
78
- results << TestJSON.new(file).test
79
- end
80
- end
81
-
82
- # print success or failure
83
- failure = results.include?(false)
84
- text = failure ? 'Reagan testing has failed' : 'All Reagan tests have suceeded'
85
- pretty_print(text)
86
-
87
- # if any test failed then exit 1 so jenkins can pick up the failure
88
- exit 1 if failure
89
- end
90
- end