chef-berksfile-env 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/README.md +53 -0
  4. data/Rakefile +191 -0
  5. data/VERSION +1 -0
  6. data/lib/chef-berksfile-env.rb +74 -0
  7. metadata +139 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cebb2a95fa35b7986b6a32c5f4f738d518bd6258
4
+ data.tar.gz: d6a132d622102305156486eb75775e7338b962ec
5
+ SHA512:
6
+ metadata.gz: ec44bf227d0161fae92da35c6a99a4ba864aa457a57547ca463bd7351a8f20c611dad5780153b233fd322afbc0ff9224206b3e2b6a65d64c409cf55bf4c8aa53
7
+ data.tar.gz: e0531192d3eba832ae40c646bd74e8f2c9e072d435cfe2dff1156c3400e5212fc58bcb835a45af7fff24259a82543319d7423ac22ef9336047e9a72e1707cfed
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in berkshelf-env.gemspec
4
+ gemspec
@@ -0,0 +1,53 @@
1
+ Chef-Berksfile-Env
2
+ ==================
3
+
4
+ A Chef plugin which allows you to lock down your Chef Environment with a Berksfile.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ /opt/chef/embedded/bin/gem install chef-berksfile-env
10
+
11
+ Usage
12
+ -----
13
+
14
+ In your chef repo create a Berksfile next to your Chef environment file like this,
15
+
16
+ chef-repo/environments/[ENV_NAME]/Berksfile
17
+
18
+ This is the default location that will used by the plugin. We have to put the berkshelf in its own
19
+ directory since [multiple berksfiles can't exist in the same directory](https://github.com/berkshelf/berkshelf/issues/1247).
20
+
21
+ The berksfile should include any cookbooks that your nodes or roles explicitly mention for that environment,
22
+
23
+ source "https://supermarket.getchef.com"
24
+
25
+ cookbook "java"
26
+ cookbook "yum", "~> 2.0"
27
+ ...
28
+
29
+ Next we need to generate our Berksfile's lock file,
30
+
31
+ berks install
32
+
33
+ Your environment file must by in `.rb` format and look like this,
34
+
35
+ require 'chef-berksfile-env'
36
+
37
+ # This must be define before we do load_berksfile
38
+ name "my_env"
39
+
40
+ # Load Berksfile locked dependencies as my environments version contraints
41
+ load_berksfile
42
+
43
+ ...
44
+
45
+ Now our environment will only use the locked versions of the cookbooks generated by our Berksfile. Additionally
46
+ Berkshelf has also locked all transitive dependencies for us as well. Upgrading to the latest dependecies is now as simple as,
47
+
48
+ berks install
49
+
50
+ Our Berksfile also provides an easy way to ensure all the cookbooks and their versions that our environment requires
51
+ are uploaded to our chef-server,
52
+
53
+ berks upload
@@ -0,0 +1,191 @@
1
+ # coding: UTF-8
2
+ require 'octokit'
3
+
4
+ VERSION_WITH_NAME_REGEX = /version\s*'\d+\.\d+\.\d+'/
5
+ VERSION_REGEX = /\d+\.\d+\.\d+/
6
+
7
+ REPO = "bbaugher/chef-berksfile-env"
8
+
9
+ task :release do
10
+ version = plugin_version
11
+
12
+ # Update change log
13
+ puts "Updating change log ..."
14
+ update_change_log version
15
+ puts "Change log updated!"
16
+
17
+ # Share the plugin
18
+ deploy
19
+
20
+ # Tag the release
21
+ puts "Tagging the #{version} release ..."
22
+ run_command "git tag -a #{version} -m 'Released #{version}'"
23
+ run_command "git push origin #{version}"
24
+ puts "Release tagged!"
25
+
26
+ # Bump version
27
+ versions = version.split "."
28
+ versions[1] = versions[1].to_i + 1
29
+
30
+ # Reset bug number if available
31
+ if versions.size == 3
32
+ versions[2] = 0
33
+ end
34
+
35
+ new_version = versions.join "."
36
+
37
+ puts "Updating version from #{version} to #{new_version} ..."
38
+ update_plugin_version new_version
39
+ puts "Version updated!"
40
+
41
+ # Commit the updated VERSION file
42
+ puts "Commiting the new version ..."
43
+ run_command "git add VERSION"
44
+ run_command "git commit -m 'Released #{version} and bumped version to #{new_version}'"
45
+ run_command "git push origin HEAD"
46
+ puts "Version commited!"
47
+ end
48
+
49
+ task :build_change_log do
50
+ closed_milestones = Octokit.milestones REPO, {:state => "closed"}
51
+
52
+ version_to_milestone = Hash.new
53
+ versions = Array.new
54
+
55
+ closed_milestones.each do |milestone|
56
+ version = Gem::Version.new(milestone.title)
57
+ version_to_milestone.store version, milestone
58
+ versions.push version
59
+ end
60
+
61
+ versions = versions.sort.reverse
62
+
63
+ change_log = File.open('CHANGELOG.md', 'w')
64
+
65
+ begin
66
+ change_log.write "Change Log\n"
67
+ change_log.write "==========\n"
68
+ change_log.write "\n"
69
+
70
+ versions.each do |version|
71
+ milestone = version_to_milestone[version]
72
+ change_log.write generate_milestone_markdown(milestone)
73
+ change_log.write "\n"
74
+ end
75
+ ensure
76
+ change_log.close
77
+ end
78
+ end
79
+
80
+ def plugin_version
81
+ IO.read("VERSION")
82
+ end
83
+
84
+ def build_gem
85
+ puts "Building the gem ..."
86
+ run_command "gem build chef-berksfile-env.gemspec"
87
+ puts "Gem built!"
88
+ end
89
+
90
+ def deploy
91
+ begin
92
+ build_gem
93
+
94
+ puts "Publishing the gem ..."
95
+ run_command "gem push chef-berksfile-env*.gem"
96
+ puts "Gem published!"
97
+ ensure
98
+ system "rm -f chef-berksfile-env*.gem"
99
+ end
100
+ end
101
+
102
+ def update_plugin_version version
103
+ File.open("VERSION", 'w') { |file| file.write(version) }
104
+ end
105
+
106
+ def update_change_log version
107
+ change_log_lines = IO.read(File.join(File.dirname(__FILE__), 'CHANGELOG.md')).split("\n")
108
+
109
+ change_log = File.open('CHANGELOG.md', 'w')
110
+
111
+ begin
112
+
113
+ # Keep change log title
114
+ change_log.write change_log_lines.shift
115
+ change_log.write "\n"
116
+ change_log.write change_log_lines.shift
117
+ change_log.write "\n"
118
+ change_log.write "\n"
119
+
120
+ # Write new milestone info
121
+ change_log.write generate_milestone_markdown(milestone(version))
122
+
123
+ # Add previous change log info
124
+ change_log_lines.each do |line|
125
+ change_log.write line
126
+ change_log.write "\n"
127
+ end
128
+
129
+ ensure
130
+ change_log.close
131
+ end
132
+
133
+ run_command "git add CHANGELOG.md"
134
+ run_command "git commit -m 'Added #{version} to change log'"
135
+ run_command "git push origin HEAD"
136
+ end
137
+
138
+ def generate_milestone_markdown milestone
139
+ strings = Array.new
140
+
141
+ title = "[#{milestone.title} - #{milestone.updated_at.strftime("%m-%d-%Y")}](https://github.com/#{REPO}/issues?milestone=#{milestone.number}&state=closed)"
142
+
143
+ strings.push "#{title}"
144
+ strings.push "-" * title.length
145
+ strings.push ""
146
+
147
+ issues = Octokit.issues REPO, {:milestone => milestone.number, :state => "closed"}
148
+
149
+ issues.each do |issue|
150
+ strings.push " * [#{issue_type issue}] [Issue-#{issue.number}](https://github.com/#{REPO}/issues/#{issue.number}) : #{issue.title}"
151
+ end
152
+
153
+ strings.push ""
154
+
155
+ strings.join "\n"
156
+ end
157
+
158
+ def milestone version
159
+ closedMilestones = Octokit.milestones REPO, {:state => "closed"}
160
+
161
+ closedMilestones.each do |milestone|
162
+ if milestone["title"] == version
163
+ return milestone
164
+ end
165
+ end
166
+
167
+ openMilestones = Octokit.milestones REPO
168
+
169
+ openMilestones.each do |milestone|
170
+ if milestone["title"] == version
171
+ return milestone
172
+ end
173
+ end
174
+
175
+ raise "Unable to find milestone with title [#{version}]"
176
+ end
177
+
178
+ def issue_type issue
179
+ labels = Array.new
180
+ issue.labels.each do |label|
181
+ labels.push label.name.capitalize
182
+ end
183
+ labels.join "/"
184
+ end
185
+
186
+ def run_command command
187
+ output = `#{command}`
188
+ unless $?.success?
189
+ raise "Command : [#{command}] failed.\nOutput : \n#{output}"
190
+ end
191
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,74 @@
1
+ require 'chef/environment'
2
+ require 'berkshelf'
3
+ require 'pathname'
4
+
5
+ # Ruby metaprogamming, yay!
6
+ class Chef
7
+ class Environment
8
+
9
+ def load_berksfile(path=nil)
10
+ raise "You must define the environment name before doing load_berksfile" if path.nil? && name.empty?
11
+
12
+ berksfile_path = path.nil? ? "environments/#{name}/Berksfile" : path
13
+ Chef::Log.debug("Using Berksfile path [#{berksfile_path}]")
14
+
15
+ begin
16
+ berksfile = ::Berkshelf::Berksfile.new find_berksfile(berksfile_path)
17
+
18
+ berksfile.list.each do |dependency|
19
+ cookbook dependency.name, "= #{dependency.locked_version.to_s}"
20
+ end
21
+ rescue ::Berkshelf::LockfileNotFound => e
22
+ raise "Your Berkshelf file [#{path}] has not been locked. Run 'berks install' to lock it"
23
+ end
24
+
25
+ end
26
+
27
+ private
28
+
29
+ def find_berksfile berksfile_path
30
+
31
+ if Pathname.new(berksfile_path).absolute?
32
+ validate_berksfile_exists berksfile_path
33
+ return berksfile_path
34
+ end
35
+
36
+ execution_dir = Dir.pwd
37
+
38
+ berksfile_dirs = berksfile_path.split("/")
39
+ berksfile = berksfile_dirs.pop
40
+
41
+ dirs = berksfile_dirs.size
42
+
43
+ berksfile_dir = ''
44
+
45
+ for i in 0..(berksfile_dirs.size - 1)
46
+ berksfile_dir += berksfile_dirs[i]
47
+
48
+ if execution_dir.end_with? berksfile_dir
49
+ path = File.join(execution_dir, *berksfile_dirs[i+1,berksfile_dirs.size], berksfile)
50
+ Chef::Log.debug("Relative berksfile path merges with execution directory at [#{path}]")
51
+
52
+ validate_berksfile_exists path
53
+
54
+ return path
55
+ end
56
+
57
+ berksfile_dir += '/'
58
+ end
59
+
60
+ # We are pretty much guessing at this point, good luck
61
+ path = File.expand_path(File.join(Dir.pwd, berksfile_path))
62
+ Chef::Log.debug("Guessing Berksfile path to be [#{path}]")
63
+
64
+ validate_berksfile_exists path
65
+
66
+ path
67
+ end
68
+
69
+ def validate_berksfile_exists path
70
+ raise "Expected Berksfile at [#{path}] but does not exist" unless File.exists? path
71
+ end
72
+
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chef-berksfile-env
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bryan Baugher
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: berkshelf
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chef
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '11.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '11.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: octokit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: "Chef-Berksfile-Env\n==================\n\nA Chef plugin which allows
84
+ you to lock down your Chef Environment with a Berksfile.\n\nInstallation\n------------\n\n
85
+ \ /opt/chef/embedded/bin/gem install chef-berksfile-env\n\nUsage\n-----\n\nIn
86
+ your chef repo create a Berksfile next to your Chef environment file like this,\n\n
87
+ \ chef-repo/environments/[ENV_NAME]/Berksfile\n\nThis is the default location
88
+ that will used by the plugin. We have to put the berkshelf in its own\ndirectory
89
+ since [multiple berksfiles can't exist in the same directory](https://github.com/berkshelf/berkshelf/issues/1247).
90
+ \n\nThe berksfile should include any cookbooks that your nodes or roles explicitly
91
+ mention for that environment,\n\n source \"https://supermarket.getchef.com\"\n\n
92
+ \ cookbook \"java\"\n cookbook \"yum\", \"~> 2.0\"\n ...\n\nNext we need
93
+ to generate our Berksfile's lock file,\n\n berks install\n\nYour environment
94
+ file must by in `.rb` format and look like this,\n\n require 'chef-berksfile-env'\n
95
+ \ \n # This must be define before we do load_berksfile\n name \"my_env\"\n
96
+ \ \n # Load Berksfile locked dependencies as my environments version contraints\n
97
+ \ load_berksfile\n\n ...\n\nNow our environment will only use the locked versions
98
+ of the cookbooks generated by our Berksfile. Additionally\nBerkshelf has also locked
99
+ all transitive dependencies for us as well. Upgrading to the latest dependecies
100
+ is now as simple as,\n\n berks install\n\nOur Berksfile also provides an easy
101
+ way to ensure all the cookbooks and their versions that our environment requires
102
+ \nare uploaded to our chef-server,\n\n berks upload"
103
+ email:
104
+ - bryan.baugher@cerner.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - lib/chef-berksfile-env.rb
110
+ - Gemfile
111
+ - Rakefile
112
+ - README.md
113
+ - VERSION
114
+ homepage: http://github.com/bbaugher/chef-berksfile-env
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.0.14
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: A Chef plugin to lock down your Chef Environment with a Berksfile
138
+ test_files: []
139
+ has_rdoc: