chicanery 0.0.3 → 0.0.4
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.
- data/.travis.yml +4 -0
- data/Gemfile.lock +1 -19
- data/README.md +64 -10
- data/Rakefile +4 -0
- data/chicanery.gemspec +0 -1
- data/examples/travis.rb +26 -0
- data/lib/chicanery.rb +2 -2
- data/lib/chicanery/cctray.rb +3 -3
- data/lib/chicanery/handlers.rb +5 -1
- data/lib/chicanery/state_comparison.rb +10 -7
- data/spec/chicanery/state_comparison_spec.rb +20 -0
- data/spec/chicanery_spec.rb +12 -0
- metadata +10 -28
- data/cucumber.yml +0 -2
- data/examples/go_server.rb +0 -1
- data/features/ci.feature +0 -21
- data/features/step_definitions/ci_steps.rb +0 -28
- data/features/support/env.rb +0 -3
data/.travis.yml
ADDED
data/Gemfile.lock
CHANGED
@@ -1,30 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
chicanery (0.0.
|
4
|
+
chicanery (0.0.4)
|
5
5
|
nokogiri (~> 1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
aruba (0.5.0)
|
11
|
-
childprocess (= 0.2.3)
|
12
|
-
cucumber (>= 1.1.1)
|
13
|
-
ffi (>= 1.0.11)
|
14
|
-
rspec-expectations (>= 2.7.0)
|
15
|
-
builder (3.1.4)
|
16
|
-
childprocess (0.2.3)
|
17
|
-
ffi (~> 1.0.6)
|
18
|
-
cucumber (1.2.1)
|
19
|
-
builder (>= 2.1.2)
|
20
|
-
diff-lcs (>= 1.1.3)
|
21
|
-
gherkin (~> 2.11.0)
|
22
|
-
json (>= 1.4.6)
|
23
10
|
diff-lcs (1.1.3)
|
24
|
-
ffi (1.0.11)
|
25
|
-
gherkin (2.11.5)
|
26
|
-
json (>= 1.4.6)
|
27
|
-
json (1.7.5)
|
28
11
|
nokogiri (1.5.5)
|
29
12
|
rake (0.9.2.2)
|
30
13
|
rspec (2.11.0)
|
@@ -40,7 +23,6 @@ PLATFORMS
|
|
40
23
|
ruby
|
41
24
|
|
42
25
|
DEPENDENCIES
|
43
|
-
aruba (~> 0)
|
44
26
|
chicanery!
|
45
27
|
rake (~> 0)
|
46
28
|
rspec (~> 2)
|
data/README.md
CHANGED
@@ -1,24 +1,78 @@
|
|
1
|
-
# Chicanery
|
1
|
+
# Chicanery [](http://travis-ci.org/markryall/chicanery)
|
2
2
|
|
3
|
-
|
3
|
+
This is a command line tool to trigger any kind of action in response to any interesting event in a software development project (such as build server events, commit events, deployment events, etc.).
|
4
|
+
|
5
|
+
This is intended to run unattended on a server and is not really intended for local notifications on a developer's machine. If this is what you're looking for, take a look at [build reactor](https://github.com/AdamNowotny/BuildReactor) instead.
|
6
|
+
|
7
|
+
Any kind of action can be taken in response to these events - playing a sound, announcement in an irc session, firing a projectile at a developer, emitting an odour etc.
|
8
|
+
|
9
|
+
State is persisted between executions so that it be scheduled to run regularly with crontab or it can simply be run as a long polling process.
|
4
10
|
|
5
11
|
## Installation
|
6
12
|
|
7
|
-
|
13
|
+
$ gem install chicanery
|
8
14
|
|
9
|
-
|
15
|
+
## Usage
|
10
16
|
|
11
|
-
|
17
|
+
Create a configuration file. This file is just a ruby file that can make use of a few configuration and callback methods:
|
12
18
|
|
13
|
-
|
19
|
+
require 'chicanery/cctray'
|
14
20
|
|
15
|
-
|
21
|
+
server Chicanery::Cctray.new 'tddium', 'https://cihost.com/cctray.xml'
|
16
22
|
|
17
|
-
|
23
|
+
when_succeeded do |job_name, job|
|
24
|
+
puts "#{job_name} has succeeded"
|
25
|
+
end
|
18
26
|
|
19
|
-
|
27
|
+
when_failed do |job_name, job|
|
28
|
+
puts "#{job_name} has failed"
|
29
|
+
end
|
30
|
+
|
31
|
+
when_broken do |job_name, job|
|
32
|
+
`afplay ~/build_sounds/ambulance.mp3`
|
33
|
+
puts "#{job_name} is broken"
|
34
|
+
end
|
35
|
+
|
36
|
+
when_fixed do |job_name, job|
|
37
|
+
`afplay ~/build_sounds/applause.mp3`
|
38
|
+
puts "#{job_name} is fixed"
|
39
|
+
end
|
40
|
+
|
41
|
+
Now you can schedule the following command with cron:
|
42
|
+
|
43
|
+
chicanery myconfiguration
|
44
|
+
|
45
|
+
Or continuously poll every 10 seconds:
|
46
|
+
|
47
|
+
chicanery myconfiguration 10
|
48
|
+
|
49
|
+
You'll notice a file called 'state' is created which represents the state at the last execution. This is then restored during the next execution to detect events such as a new build succeeding/failing.
|
50
|
+
|
51
|
+
## Supported CI servers
|
52
|
+
|
53
|
+
Currently only ci servers that can provide [cctray reporting format](http://confluence.public.thoughtworks.org/display/CI/Multiple+Project+Summary+Reporting+Standard) are supported.
|
54
|
+
|
55
|
+
This includes thoughtworks go, tddium, travisci, jenkins, cc.net and several others:
|
56
|
+
|
57
|
+
For a jenkins or hudson server, monitor http://jenkins-server:8080/cc.xml
|
58
|
+
|
59
|
+
For a go server, monitor https://go-server:8154/go/cctray.xml
|
60
|
+
|
61
|
+
For a travis ci project, monitor https://api.travis-ci.org/repositories/owner/project/cc.xml
|
62
|
+
|
63
|
+
For a tddium project, monitor the link 'Configure with CCMenu' which will look something like https://api.tddium.com/cc/long_uuid_string/cctray.xml
|
64
|
+
|
65
|
+
Basic authentication is supported by passing :user => 'user', :password => 'password' to the Chicanery::Cctray constructor. https is supported without performing certificate verification (some ci servers such as thoughtworks go generates a self signed cert that would otherwise be rejected without significant messing around).
|
66
|
+
|
67
|
+
## Plans for world domination
|
20
68
|
|
21
|
-
|
69
|
+
* monitoring a git repository for push notifications
|
70
|
+
* monitoring a mercurial repository for push notifications
|
71
|
+
* monitoring a subversion repository for commit notifications
|
72
|
+
* monitoring heroku for deployment event notification
|
73
|
+
* monitoring more ci servers (atlassian bamboo, jetbrains team city, etc.)
|
74
|
+
* integration with the blinky gem to control a delcom build light
|
75
|
+
* other interesting notifier plugins or examples
|
22
76
|
|
23
77
|
## Contributing
|
24
78
|
|
data/Rakefile
CHANGED
data/chicanery.gemspec
CHANGED
data/examples/travis.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'chicanery/cctray'
|
2
|
+
|
3
|
+
server Chicanery::Cctray.new 'travis', 'https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml'
|
4
|
+
|
5
|
+
when_started do |job_name, job|
|
6
|
+
`afplay ~/build_sounds/startup.mp3`
|
7
|
+
puts "job #{job_name} has started"
|
8
|
+
end
|
9
|
+
|
10
|
+
when_succeeded do |job_name, job|
|
11
|
+
puts "job #{job_name} #{job[:last_label]} has succeeded"
|
12
|
+
end
|
13
|
+
|
14
|
+
when_failed do |job_name, job|
|
15
|
+
puts "job #{job_name} #{job[:last_label]} has failed"
|
16
|
+
end
|
17
|
+
|
18
|
+
when_broken do |job_name, job|
|
19
|
+
`afplay ~/build_sounds/ambulance.mp3`
|
20
|
+
puts "job #{job_name} is broken"
|
21
|
+
end
|
22
|
+
|
23
|
+
when_fixed do |job_name, job|
|
24
|
+
`afplay ~/build_sounds/applause.mp3`
|
25
|
+
puts "job #{job_name} is fixed"
|
26
|
+
end
|
data/lib/chicanery.rb
CHANGED
@@ -9,7 +9,7 @@ module Chicanery
|
|
9
9
|
include Handlers
|
10
10
|
include StateComparison
|
11
11
|
|
12
|
-
VERSION = "0.0.
|
12
|
+
VERSION = "0.0.4"
|
13
13
|
|
14
14
|
def execute *args
|
15
15
|
load args.shift
|
@@ -26,7 +26,7 @@ module Chicanery
|
|
26
26
|
end
|
27
27
|
run_handlers.each {|handler| handler.call current_state }
|
28
28
|
persist current_state
|
29
|
-
|
29
|
+
break unless poll_period
|
30
30
|
sleep poll_period.to_i
|
31
31
|
end
|
32
32
|
end
|
data/lib/chicanery/cctray.rb
CHANGED
@@ -23,9 +23,9 @@ module Chicanery
|
|
23
23
|
jobs = {}
|
24
24
|
Nokogiri::XML(get).css("Project").each do |project|
|
25
25
|
job = {
|
26
|
-
activity: project[:activity],
|
26
|
+
activity: project[:activity] == 'Sleeping' ? :sleeping : :building,
|
27
27
|
last_build_status: project[:lastBuildStatus] == 'Success' ? :success : :failure,
|
28
|
-
last_build_time: DateTime.parse(project[:lastBuildTime]),
|
28
|
+
last_build_time: project[:lastBuildTime].empty? ? nil : DateTime.parse(project[:lastBuildTime]),
|
29
29
|
url: project[:webUrl],
|
30
30
|
last_label: project[:lastBuildLabel]
|
31
31
|
}
|
@@ -35,7 +35,7 @@ module Chicanery
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def filtered name
|
38
|
-
return
|
38
|
+
return false unless options[:include]
|
39
39
|
!options[:include].match(name)
|
40
40
|
end
|
41
41
|
end
|
data/lib/chicanery/handlers.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Chicanery
|
2
2
|
module Handlers
|
3
|
-
%w{run succeeded failed broken fixed}.each do |status|
|
3
|
+
%w{run started succeeded failed broken fixed}.each do |status|
|
4
4
|
class_eval <<-EOF
|
5
5
|
def when_#{status} &block
|
6
6
|
#{status}_handlers << block
|
@@ -9,6 +9,10 @@ module Chicanery
|
|
9
9
|
def #{status}_handlers
|
10
10
|
@#{status}_handlers ||= []
|
11
11
|
end
|
12
|
+
|
13
|
+
def notify_#{status}_handlers *args
|
14
|
+
#{status}_handlers.each {|handler| handler.call *args }
|
15
|
+
end
|
12
16
|
EOF
|
13
17
|
end
|
14
18
|
end
|
@@ -3,17 +3,20 @@ module Chicanery
|
|
3
3
|
def compare_jobs current_jobs, previous_jobs
|
4
4
|
return unless previous_jobs
|
5
5
|
current_jobs.each do |job_name, job|
|
6
|
-
compare_job job_name, job, previous_jobs[job_name]
|
6
|
+
compare_job job_name, job, previous_jobs[job_name] if previous_jobs[job_name]
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
def compare_job name, current, previous
|
11
|
-
return unless current
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
return unless current[:last_build_time] != previous[:last_build_time]
|
12
|
+
if current[:activity] == :building and previous[:activity] == :sleeping
|
13
|
+
notify_started_handlers name, current
|
14
|
+
return
|
15
|
+
end
|
16
|
+
notify_succeeded_handlers name, current if current[:last_build_status] == :success
|
17
|
+
notify_failed_handlers name, current if current[:last_build_status] == :failure
|
18
|
+
notify_broken_handlers name, current if current[:last_build_status] == :failure and previous[:last_build_status] == :success
|
19
|
+
notify_fixed_handlers name, current if current[:last_build_status] == :success and previous[:last_build_status] == :failure
|
17
20
|
end
|
18
21
|
end
|
19
22
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'chicanery/state_comparison'
|
2
|
+
|
3
|
+
describe Chicanery::StateComparison do
|
4
|
+
include Chicanery::StateComparison
|
5
|
+
|
6
|
+
let(:current_jobs) { {} }
|
7
|
+
let(:previous_jobs) { {} }
|
8
|
+
|
9
|
+
it 'should do nothing when there are no jobs in current state' do
|
10
|
+
should_not_receive :compare_job
|
11
|
+
previous_jobs[:job] = {}
|
12
|
+
compare_jobs current_jobs, previous_jobs
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should do nothing when there is no previous state' do
|
16
|
+
should_not_receive :compare_job
|
17
|
+
current_jobs[:job] = {}
|
18
|
+
compare_jobs current_jobs, previous_jobs
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'chicanery'
|
2
|
+
|
3
|
+
describe Chicanery do
|
4
|
+
include Chicanery
|
5
|
+
|
6
|
+
describe '#execute' do
|
7
|
+
it 'should load configuration and exit immediately when nothing is configured no poll period is provided' do
|
8
|
+
should_receive(:load).with 'configuration'
|
9
|
+
execute 'configuration'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chicanery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -59,22 +59,6 @@ dependencies:
|
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '2'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: aruba
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ~>
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
78
62
|
description: trigger various events related to a continuous integration environment
|
79
63
|
email:
|
80
64
|
- mark@ryall.name
|
@@ -84,6 +68,7 @@ extensions: []
|
|
84
68
|
extra_rdoc_files: []
|
85
69
|
files:
|
86
70
|
- .gitignore
|
71
|
+
- .travis.yml
|
87
72
|
- Gemfile
|
88
73
|
- Gemfile.lock
|
89
74
|
- LICENSE.txt
|
@@ -91,11 +76,7 @@ files:
|
|
91
76
|
- Rakefile
|
92
77
|
- bin/chicanery
|
93
78
|
- chicanery.gemspec
|
94
|
-
-
|
95
|
-
- examples/go_server.rb
|
96
|
-
- features/ci.feature
|
97
|
-
- features/step_definitions/ci_steps.rb
|
98
|
-
- features/support/env.rb
|
79
|
+
- examples/travis.rb
|
99
80
|
- lib/chicanery.rb
|
100
81
|
- lib/chicanery/cctray.rb
|
101
82
|
- lib/chicanery/handlers.rb
|
@@ -104,6 +85,8 @@ files:
|
|
104
85
|
- lib/chicanery/state_comparison.rb
|
105
86
|
- spec/broken.xml
|
106
87
|
- spec/building.xml
|
88
|
+
- spec/chicanery/state_comparison_spec.rb
|
89
|
+
- spec/chicanery_spec.rb
|
107
90
|
homepage: http://github.com/markryall/chicanery
|
108
91
|
licenses: []
|
109
92
|
post_install_message:
|
@@ -118,7 +101,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
101
|
version: '0'
|
119
102
|
segments:
|
120
103
|
- 0
|
121
|
-
hash: -
|
104
|
+
hash: -3725593527818179587
|
122
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
106
|
none: false
|
124
107
|
requirements:
|
@@ -127,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
110
|
version: '0'
|
128
111
|
segments:
|
129
112
|
- 0
|
130
|
-
hash: -
|
113
|
+
hash: -3725593527818179587
|
131
114
|
requirements: []
|
132
115
|
rubyforge_project:
|
133
116
|
rubygems_version: 1.8.23
|
@@ -135,8 +118,7 @@ signing_key:
|
|
135
118
|
specification_version: 3
|
136
119
|
summary: polls various resources related to a ci environment and performs custom notifications
|
137
120
|
test_files:
|
138
|
-
- features/ci.feature
|
139
|
-
- features/step_definitions/ci_steps.rb
|
140
|
-
- features/support/env.rb
|
141
121
|
- spec/broken.xml
|
142
122
|
- spec/building.xml
|
123
|
+
- spec/chicanery/state_comparison_spec.rb
|
124
|
+
- spec/chicanery_spec.rb
|
data/cucumber.yml
DELETED
data/examples/go_server.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
puts "loading configuration from #{__FILE__}"
|
data/features/ci.feature
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
Feature: ci
|
2
|
-
|
3
|
-
In order to know I have working software
|
4
|
-
As a software delivery team member
|
5
|
-
I want to receive notifications from my ci build
|
6
|
-
|
7
|
-
@wip
|
8
|
-
Scenario: no previous state and passing build
|
9
|
-
Given I have ci jobs:
|
10
|
-
| name | status | activity |
|
11
|
-
| job1 | success | sleeping |
|
12
|
-
| job2 | success | sleeping |
|
13
|
-
And a stdout ci handler
|
14
|
-
When I engage in chicanery
|
15
|
-
Then the exit status should be 0
|
16
|
-
And the stdout should contain:
|
17
|
-
"""
|
18
|
-
job1 is ok
|
19
|
-
job2 is ok
|
20
|
-
all jobs are ok
|
21
|
-
"""
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
Given /^I have ci jobs:$/ do |table|
|
4
|
-
@jobs = table.hashes
|
5
|
-
end
|
6
|
-
|
7
|
-
Given /^a stdout ci handler$/ do
|
8
|
-
@handlers = <<EOF
|
9
|
-
when_anything do |state|
|
10
|
-
state.jobs each do |job|
|
11
|
-
puts "#{job.name} is #{job.status}"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
EOF
|
15
|
-
end
|
16
|
-
|
17
|
-
When /^I engage in chicanery$/ do
|
18
|
-
jobs, handlers = @jobs, @handlers
|
19
|
-
template = ERB.new <<EOF
|
20
|
-
<% @jobs.each do |job| %>
|
21
|
-
job "<%= job['name'] %>
|
22
|
-
<% end %>
|
23
|
-
|
24
|
-
<% @handlers %>
|
25
|
-
EOF
|
26
|
-
write_file 'configuration', template.result(binding)
|
27
|
-
run_simple 'chicanery configuration'
|
28
|
-
end
|
data/features/support/env.rb
DELETED