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 +4 -4
- data/Readme.md +89 -9
- data/VERSION +1 -1
- data/etc/commit.json +10 -10
- data/etc/config.json +3 -1
- data/lib/kitchen_hooks/app.rb +33 -13
- data/lib/kitchen_hooks/helpers.rb +13 -5
- data/lib/kitchen_hooks/main.rb +6 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc604b1b2abab2073d9e568aaa74126476eca24e
|
4
|
+
data.tar.gz: 6f8dab7e189d19fd33a4fa15c4e590b15c831b44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
113
|
+
### TODO
|
34
114
|
|
35
115
|
* Use Ridley for data bag, role, and environment uploads to remove Chef dependency
|
36
116
|
|
37
|
-
|
117
|
+
### Changelog
|
38
118
|
|
39
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
156
|
+
#### 1.0
|
77
157
|
|
78
158
|
* Initial release. Gem structure in place, but lacking functionaily
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.5.
|
1
|
+
1.5.3
|
data/etc/commit.json
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
{
|
2
2
|
"before": "08f20548e398f634979047d0c8114260bcc2949a",
|
3
|
-
"after": "
|
4
|
-
"ref": "refs/
|
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": "
|
9
|
-
"url": "git@git.bluejeansnet.com:chef/
|
8
|
+
"name": "realm_logger",
|
9
|
+
"url": "git@git.bluejeansnet.com:chef/realm_logger.git",
|
10
10
|
"description": "",
|
11
|
-
"homepage": "http://git.bluejeansnet.com/
|
11
|
+
"homepage": "http://git.bluejeansnet.com/chef/realm_logger"
|
12
12
|
},
|
13
13
|
"commits": [
|
14
14
|
{
|
15
|
-
"id": "
|
16
|
-
"message": "
|
15
|
+
"id": "7b238ce9c6cff250db5a0b727b9661b618b82e1d",
|
16
|
+
"message": "XYZ",
|
17
17
|
"timestamp": "2014-11-25T18:30:57-08:00",
|
18
|
-
"url": "http://git.bluejeansnet.com/
|
18
|
+
"url": "http://git.bluejeansnet.com/chef/realm_logger/commit/7b238ce9c6cff250db5a0b727b9661b618b82e1d",
|
19
19
|
"author": {
|
20
|
-
"name": "
|
21
|
-
"email": "
|
20
|
+
"name": "Sean Clemmer",
|
21
|
+
"email": "sclemmer@bluejeans.com"
|
22
22
|
}
|
23
23
|
}
|
24
24
|
],
|
data/etc/config.json
CHANGED
data/lib/kitchen_hooks/app.rb
CHANGED
@@ -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
|
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['
|
109
|
-
|
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 =
|
125
|
-
|
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 =
|
132
|
-
|
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 =
|
139
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
|
data/lib/kitchen_hooks/main.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hipchat
|