kitchen_hooks 1.5.2 → 1.5.3

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: cf6b444d973aa69f4eaf3bf79ccacca65e717149
4
- data.tar.gz: fcdb939b53fc35a04eb18eaad4cb52ce81166304
3
+ metadata.gz: bc604b1b2abab2073d9e568aaa74126476eca24e
4
+ data.tar.gz: 6f8dab7e189d19fd33a4fa15c4e590b15c831b44
5
5
  SHA512:
6
- metadata.gz: 935caae8b512c4e1607840cf428778fdf94914c70107e73b5f7df50e23d00d44c5430656e0013ed081c32dbaf320881d4625b413b3c1a9e5c9844885fb37179c
7
- data.tar.gz: 7ebdc2ebc6cf361a74305547cb455313da6a1c67bfe202af2524a90e65820387800ff5212a3cb86500ad4b98146447e2de3ce537064a9eeecb112aa1095de274
6
+ metadata.gz: e31f2ac0f8bb6d0e152ace39709ba420b56484f8e3ce22de3ea1d03e9697a352100eb29ff8853d1ccce9e92bc001b1403505df716cc2e8f8527c3048e25ff5cf
7
+ data.tar.gz: e1ed91030b09ec8dee1a399f316c46c193dd8d6cf9670528ed4f376dc2426cbfea227dcf08e4fd00a95cc568f0b7235e94394a547bb0e611d7c46d5e5e2f6728
data/Readme.md CHANGED
@@ -4,9 +4,68 @@
4
4
  WebHoook for automated Chef Server uploads following Kitchen standards.
5
5
 
6
6
 
7
+ ## What?
8
+
9
+ So [the Kitchen](http://wiki.bluejeansnet.com/operations/kitchen) is this thing
10
+ we have now in Operations to help guide cookbook development. The [Workflow](http://wiki.bluejeansnet.com/operations/kitchen#workflow)
11
+ sction of the docs prescribes how to go about your day in Chef land including
12
+ how to version, release, and deploy changes to a Chef server.
13
+
14
+ But that's only _one_ Chef server. What if we want redundancy?
15
+
16
+ A distributed/highly-available Chef would do the job. It comes in a few flavors:
17
+
18
+ 1. Pay for whatever they're calling [Hosted Chef](https://manage.chef.io/signup) nowadays
19
+ 2. Manually deploy a [highly-available setup in AWS](https://docs.getchef.com/install_server_ha_aws.html)
20
+ 3. Manually deploy a [highly-available setup with DRBD](https://docs.getchef.com/server_high_availability.html#drbd)
21
+
22
+ The third option is basically a recipe for disaster. DRBD is known to lose data
23
+ in split-brain scenarios. So that's actually two flavors.
24
+
25
+ Hosted Chef seems like a great option. Until you start using it. They give you
26
+ whatever bleeding-edge version of Chef they're testing so you don't have time
27
+ to breathe between incompatible versions. Chef is notorious for yanking gems
28
+ and botching releases. They've also got some odd permissions you probably have
29
+ never seen before, because vanilla Chef server doesn't have organizations.
30
+
31
+ That leaves AWS as an option. But it's a lot of work, and weirdly completely
32
+ not automated.
33
+
34
+ All I care about is having my Chef data replicated, why does it have to be hard?
35
+ I mean, we've been using `git` hooks to fan out to Chef servers for years now!
36
+
37
+ ### So let's do that.
38
+
39
+ The old post-receive hook was pretty basic, but it worked. By default, it would
40
+ look up the `knife` and `berks` configuration files (`.rb` and `.json`) in
41
+ `~/knives` then loop over them when uploading Chef objects found in the
42
+ checkout specified by the hook.
43
+
44
+ The new Kitchen Hooks works much the same, except we're using GitLab WebHooks
45
+ rather than traditional `git` hooks. This makes the Hooks easier to maintain,
46
+ as installing `git` hooks has not been automated, and WebHooks are opt-in.
47
+
48
+ The new Hooks cover three scenarios:
49
+
50
+ 1. Pushes to the `master` branch of the Kitchen trigger an upload of all roles,
51
+ environments, and data bags. This will overwrite any changes made on the Chef
52
+ server, but you shouldn't be doing that anyway. Importantly, this has no
53
+ effect on cookbook versions pinned in any environment.
54
+ 2. Version tag pushes (e.g. `v1.0.0`) to cookbooks trigger a `knife`-style
55
+ cookbook upload with `freeze` set to true. A `Berksfile.lock` will also
56
+ trigger the equivalent of `berks install` and `berks upload`.
57
+ 3. Environment tag pushes (e.g. `bjn_logger_prod`) to realm cookbooks trigger
58
+ `berks apply` behavior. Remember to delete both the local and remote tags
59
+ when you want to update an environment with a later version of the realm.
60
+
61
+ Actions performed by Kitchen Hooks are stored in a [Daybreak](http://propublica.github.io/daybreak/)
62
+ database and presented as a timeline in the [Web UI](http://git.bluejeansnet.com:4567).
63
+ Notifcations can are sent to HipChat.
64
+
7
65
  ## Installation
8
66
 
9
- Clone the repo and `rake build`.
67
+ Try `gem install kitchen_hooks`. Or add it to your `Gemfile`. Or clone the repo
68
+ and `rake build`. Do all three, I don't care!
10
69
 
11
70
 
12
71
  ## Usage
@@ -29,21 +88,42 @@ Use the `server` command to start the WebHook receiver:
29
88
  Listening on 0.0.0.0:80, CTRL+C to stop
30
89
  ...
31
90
 
91
+ ## Configuration
92
+
93
+ The configuration file is just JSON. Hopefully it's obvious:
94
+
95
+ {
96
+ "hipchat": {
97
+ "nick": "name",
98
+ "room": "test",
99
+ "token": "your_v1_api_token"
100
+ },
101
+ "knives": {
102
+ "user": "~/.chef/knife.rb",
103
+ "system": "/etc/chef/knife.rb",
104
+ "another": "/path/to/knife.rb"
105
+ }
106
+ }
107
+
108
+ The `server` command also exposes some options for Sinatra configuration. See
109
+ `kitchen_hooks help server`.
110
+
111
+ ## Development
32
112
 
33
- ## TODO
113
+ ### TODO
34
114
 
35
115
  * Use Ridley for data bag, role, and environment uploads to remove Chef dependency
36
116
 
37
- ## Changelog
117
+ ### Changelog
38
118
 
39
- ### 1.5
119
+ #### 1.5
40
120
 
41
121
  * Add release notifications
42
122
  * Add indication of success or failure
43
123
  * Only upload on commits to Kitchen `master` branch
44
124
  * Add custom timeline icons to distinguish event types
45
125
 
46
- ### 1.4
126
+ #### 1.4
47
127
 
48
128
  * Simplified configuration format (breaking!)
49
129
  * Added support for HipChat notifications when configured
@@ -51,19 +131,19 @@ Use the `server` command to start the WebHook receiver:
51
131
  * Replaced "modified" with more appropriate verb where appropriate
52
132
  * Corrected `berks upload` functionality (`berks install` first)
53
133
 
54
- ### 1.3
134
+ #### 1.3
55
135
 
56
136
  * Added local database to store history (Daybreak), visualized on homepage
57
137
  * Added `database` option to `server` command
58
138
  * Corrected GitLab link for tagged commits
59
139
  * Process events in the background to avoid duplicate entries [INF-6040]
60
140
 
61
- ### 1.2
141
+ #### 1.2
62
142
 
63
143
  * Added `bind` option to `server` command
64
144
  * Added `berks upload` functionality when tagging realm versions
65
145
 
66
- ### 1.1
146
+ #### 1.1
67
147
 
68
148
  * Moved `examples` to `etc`
69
149
  * Started checking in `Gemfile.lock` for future reference
@@ -73,6 +153,6 @@ Use the `server` command to start the WebHook receiver:
73
153
  * Tagging a cookbook with a version triggers a cookbook upload (frozen)
74
154
  * Tagging a realm with the name of an environment applies version constraints
75
155
 
76
- ### 1.0
156
+ #### 1.0
77
157
 
78
158
  * Initial release. Gem structure in place, but lacking functionaily
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.2
1
+ 1.5.3
data/etc/commit.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "before": "08f20548e398f634979047d0c8114260bcc2949a",
3
- "after": "fb38bcc884a0579cb52836b00589bca653a9c229",
4
- "ref": "refs/heads/master",
3
+ "after": "7b238ce9c6cff250db5a0b727b9661b618b82e1d",
4
+ "ref": "refs/tags/v1.5.1",
5
5
  "user_id": 645,
6
6
  "user_name": "Sean Clemmer",
7
7
  "repository": {
8
- "name": "Kitchen Hooks",
9
- "url": "git@git.bluejeansnet.com:chef/kitchen.git",
8
+ "name": "realm_logger",
9
+ "url": "git@git.bluejeansnet.com:chef/realm_logger.git",
10
10
  "description": "",
11
- "homepage": "http://git.bluejeansnet.com/kitchen"
11
+ "homepage": "http://git.bluejeansnet.com/chef/realm_logger"
12
12
  },
13
13
  "commits": [
14
14
  {
15
- "id": "fb38bcc884a0579cb52836b00589bca653a9c229",
16
- "message": "Update readme",
15
+ "id": "7b238ce9c6cff250db5a0b727b9661b618b82e1d",
16
+ "message": "XYZ",
17
17
  "timestamp": "2014-11-25T18:30:57-08:00",
18
- "url": "http://git.bluejeansnet.com/kitchen-hooks/commit/fb38bcc884a0579cb52836b00589bca653a9c229",
18
+ "url": "http://git.bluejeansnet.com/chef/realm_logger/commit/7b238ce9c6cff250db5a0b727b9661b618b82e1d",
19
19
  "author": {
20
- "name": "Kelly Wong",
21
- "email": "kelly@bluejeans.com"
20
+ "name": "Sean Clemmer",
21
+ "email": "sclemmer@bluejeans.com"
22
22
  }
23
23
  }
24
24
  ],
data/etc/config.json CHANGED
@@ -1,4 +1,6 @@
1
1
  {
2
2
  "hipchat": null,
3
- "knives": {}
3
+ "knives": {
4
+ "user": "~/.chef/knife.rb"
5
+ }
4
6
  }
@@ -22,6 +22,10 @@ module KitchenHooks
22
22
  @@db = Daybreak::DB.new path
23
23
  end
24
24
 
25
+ def self.close!
26
+ @@db.close
27
+ end
28
+
25
29
  def self.config! config
26
30
  @@hipchat = nil
27
31
  if config['hipchat']
@@ -39,7 +43,7 @@ module KitchenHooks
39
43
  process_release
40
44
  db_entries = {}
41
45
  db.each do |k, v|
42
- db_entries[k] = v unless k == 'meta'
46
+ db_entries[k] = v unless k =~ /^meta/
43
47
  end
44
48
  erb :app, locals: {
45
49
  database: db_entries.sort_by { |stamp, _| stamp }
@@ -90,10 +94,12 @@ module KitchenHooks
90
94
 
91
95
 
92
96
  # error == nil => success
97
+ # error == true => success
93
98
  # error == false => nop
94
99
  # otherwise => failure
95
100
  def mark event, type, error=nil
96
101
  return if error == false
102
+ error = nil if error == true
97
103
  entry = { type: type, event: event }
98
104
  entry.merge!(error: error, type: 'failure') if error
99
105
  db.synchronize do
@@ -105,15 +111,20 @@ module KitchenHooks
105
111
 
106
112
 
107
113
  def process_release version=KitchenHooks::VERSION
108
- db['meta'] ||= {}
109
- return if db['meta']['version'] == version
114
+ return if db['meta_version'] == version
115
+ db.set! 'meta_version', version
110
116
  mark version, 'release'
111
- db.synchronize do
112
- db['meta']['version'] = version
113
- end
114
- db.flush
115
117
  end
116
118
 
119
+
120
+ def err_out e, msg
121
+ logger.error msg
122
+ logger.error e.message
123
+ logger.error e.backtrace.inspect
124
+ msg
125
+ end
126
+
127
+
117
128
  def process event
118
129
  if event.nil? # JSON parse failed
119
130
  mark event, 'failure', 'Could not parse WebHook payload'
@@ -121,22 +132,31 @@ module KitchenHooks
121
132
  end
122
133
 
123
134
  if commit_to_kitchen?(event)
124
- possible_error = perform_kitchen_upload(event, knives) \
125
- rescue 'Unable to perform kitchen upload'
135
+ possible_error = begin
136
+ perform_kitchen_upload(event, knives)
137
+ rescue Exception => e
138
+ err_out e, 'Could not perform kitchen upload'
139
+ end
126
140
  mark event, 'kitchen upload', possible_error
127
141
  end
128
142
 
129
143
  if tagged_commit_to_cookbook?(event) &&
130
144
  tag_name(event) =~ /^v\d+/ # Cookbooks tagged with a version
131
- possible_error = perform_cookbook_upload(event, knives) \
132
- rescue 'Unable to perform cookbook upload'
145
+ possible_error = begin
146
+ perform_cookbook_upload(event, knives)
147
+ rescue Exception => e
148
+ err_out e, 'Could not perform cookbook upload'
149
+ end
133
150
  mark event, 'cookbook upload', possible_error
134
151
  end
135
152
 
136
153
  if tagged_commit_to_realm?(event) &&
137
154
  tag_name(event) =~ /^bjn_/ # Realms tagged with an environment
138
- possible_error = perform_constraint_application(event, knives) \
139
- rescue 'Unable to apply constraints'
155
+ possible_error = begin
156
+ perform_constraint_application(event, knives)
157
+ rescue Exception => e
158
+ err_out e, 'Could not apply constraints'
159
+ end
140
160
  mark event, 'constraint application', possible_error
141
161
  end
142
162
  end
@@ -1,4 +1,5 @@
1
1
  require 'shellwords'
2
+ require 'fileutils'
2
3
  require 'tempfile'
3
4
  require 'json'
4
5
 
@@ -24,7 +25,8 @@ module KitchenHooks
24
25
  end
25
26
  end
26
27
 
27
- return nil # no error
28
+ logger.info "finished perform_constraint_application: #{event['after']}"
29
+ return true # no error
28
30
  end
29
31
 
30
32
 
@@ -48,7 +50,8 @@ module KitchenHooks
48
50
  end
49
51
  end
50
52
 
51
- return nil # no error
53
+ logger.info "finished perform_kitchen_upload: #{event['after']}"
54
+ return true # no error
52
55
  end
53
56
 
54
57
 
@@ -57,7 +60,9 @@ module KitchenHooks
57
60
  Dir.chdir clone do
58
61
  tagged_version = tag_name(event).delete('v')
59
62
  cookbook_version = File.read('VERSION').strip
60
- raise unless tagged_version == cookbook_version
63
+ unless tagged_version == cookbook_version
64
+ raise 'Tagged version does not match cookbook version'
65
+ end
61
66
 
62
67
  logger.info 'Uploading cookbook'
63
68
  with_each_knife "cookbook upload #{cookbook_name event} -o .. --freeze", knives
@@ -74,7 +79,8 @@ module KitchenHooks
74
79
  end
75
80
  end
76
81
 
77
- return nil # no error
82
+ logger.info "finished cookbook_upload: #{event['after']}"
83
+ return true # no error
78
84
  end
79
85
 
80
86
 
@@ -98,8 +104,10 @@ module KitchenHooks
98
104
  Dir.mktmpdir do |tmp|
99
105
  dir = File::join tmp, cookbook_name(event)
100
106
  repo = Git.clone git_daemon_style_url(event), dir, log: $stdout
101
- repo.checkout self.send(commit_method, event)
107
+ commit = self.send(commit_method, event)
108
+ repo.checkout commit
102
109
  yield dir
110
+ FileUtils.rm_rf dir
103
111
  end
104
112
  end
105
113
 
@@ -60,7 +60,13 @@ module KitchenHooks
60
60
  App.set :port, options.port
61
61
  App.set :bind, options.bind
62
62
  App.set :raise_errors, true
63
+ App.set :dump_errors, true
64
+ App.set :show_exceptions, true
63
65
  App.run!
66
+
67
+ at_exit do
68
+ App.close!
69
+ end
64
70
  end
65
71
  end
66
72
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen_hooks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Wong
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-06 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hipchat