kitchen_hooks 1.5.2 → 1.5.3

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: 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