chicanery 0.0.1 → 0.0.2
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/.gitignore +2 -1
- data/Gemfile.lock +46 -0
- data/bin/chicanery +3 -3
- data/chicanery.gemspec +4 -3
- data/cucumber.yml +2 -0
- data/examples/go_server.rb +1 -0
- data/features/ci.feature +21 -0
- data/features/step_definitions/ci_steps.rb +28 -0
- data/features/support/env.rb +3 -0
- data/lib/chicanery/cctray.rb +36 -0
- data/lib/chicanery/handlers.rb +15 -0
- data/lib/chicanery/persistence.rb +16 -0
- data/lib/chicanery/servers.rb +11 -0
- data/lib/chicanery/state_comparison.rb +18 -0
- data/lib/chicanery.rb +26 -3
- data/spec/broken.xml +2 -2
- metadata +38 -10
- data/lib/chicanery/cli.rb +0 -7
- data/lib/chicanery/version.rb +0 -3
data/.gitignore
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
chicanery (0.0.2)
|
5
|
+
nokogiri (~> 1)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
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
|
+
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
|
+
nokogiri (1.5.5)
|
29
|
+
rake (0.9.2.2)
|
30
|
+
rspec (2.11.0)
|
31
|
+
rspec-core (~> 2.11.0)
|
32
|
+
rspec-expectations (~> 2.11.0)
|
33
|
+
rspec-mocks (~> 2.11.0)
|
34
|
+
rspec-core (2.11.1)
|
35
|
+
rspec-expectations (2.11.3)
|
36
|
+
diff-lcs (~> 1.1.3)
|
37
|
+
rspec-mocks (2.11.3)
|
38
|
+
|
39
|
+
PLATFORMS
|
40
|
+
ruby
|
41
|
+
|
42
|
+
DEPENDENCIES
|
43
|
+
aruba (~> 0)
|
44
|
+
chicanery!
|
45
|
+
rake (~> 0)
|
46
|
+
rspec (~> 2)
|
data/bin/chicanery
CHANGED
data/chicanery.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'chicanery
|
4
|
+
require 'chicanery'
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "chicanery"
|
@@ -17,8 +17,9 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
-
gem.add_dependency 'nokogiri', '~>1
|
20
|
+
gem.add_dependency 'nokogiri', '~>1'
|
21
21
|
|
22
|
-
gem.add_development_dependency 'rake', '~>0
|
22
|
+
gem.add_development_dependency 'rake', '~>0'
|
23
23
|
gem.add_development_dependency 'rspec', '~>2'
|
24
|
+
gem.add_development_dependency 'aruba', '~>0'
|
24
25
|
end
|
data/cucumber.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
puts "loading configuration from #{__FILE__}"
|
data/features/ci.feature
ADDED
@@ -0,0 +1,21 @@
|
|
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
|
+
"""
|
@@ -0,0 +1,28 @@
|
|
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
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
module Chicanery
|
6
|
+
class Cctray
|
7
|
+
attr_reader :name, :uri, :user, :password
|
8
|
+
|
9
|
+
def initialize name, url, user, password
|
10
|
+
@name, @uri, @user, @password = name, URI(url), user, password
|
11
|
+
end
|
12
|
+
|
13
|
+
def get
|
14
|
+
req = Net::HTTP::Get.new(uri.path)
|
15
|
+
req.basic_auth user, password
|
16
|
+
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', verify_mode: OpenSSL::SSL::VERIFY_NONE) do |https|
|
17
|
+
https.request(req)
|
18
|
+
end
|
19
|
+
res.body
|
20
|
+
end
|
21
|
+
|
22
|
+
def jobs
|
23
|
+
jobs = {}
|
24
|
+
Nokogiri::XML(get).css("Project").each do |project|
|
25
|
+
jobs[project[:name]]= {
|
26
|
+
activity: project[:activity],
|
27
|
+
last_build_status: project[:lastBuildStatus] == 'Success' ? :success : :failure,
|
28
|
+
last_build_time: DateTime.parse(project[:lastBuildTime]),
|
29
|
+
url: project[:webUrl],
|
30
|
+
last_label: project[:lastBuildLabel]
|
31
|
+
}
|
32
|
+
end
|
33
|
+
jobs
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Chicanery
|
2
|
+
module Handlers
|
3
|
+
%w{run succeeded failed broken fixed}.each do |status|
|
4
|
+
class_eval <<-EOF
|
5
|
+
def when_#{status} &block
|
6
|
+
#{status}_handlers << block
|
7
|
+
end
|
8
|
+
|
9
|
+
def #{status}_handlers
|
10
|
+
@#{status}_handlers ||= []
|
11
|
+
end
|
12
|
+
EOF
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Chicanery
|
4
|
+
module Persistence
|
5
|
+
def persist state
|
6
|
+
File.open 'state', 'w' do |file|
|
7
|
+
file.puts state.to_yaml
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def restore
|
12
|
+
return {} unless File.exist? 'state'
|
13
|
+
YAML.load_file 'state'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Chicanery
|
2
|
+
module StateComparison
|
3
|
+
def compare_jobs current_jobs, previous_jobs
|
4
|
+
return unless previous_jobs
|
5
|
+
current_jobs.each do |job_name, job|
|
6
|
+
compare_job job_name, job, previous_jobs[job_name]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def compare_job name, current, previous
|
11
|
+
return unless current[:last_build_time] > previous[:last_build_time]
|
12
|
+
succeeded_handlers.each {|handler| handler.call name, current } if current[:last_build_status] == :success
|
13
|
+
failed_handlers.each {|handler| handler.call name, current } if current[:last_build_status] == :failure
|
14
|
+
broken_handlers.each {|handler| handler.call name, current } if current[:last_build_status] == :failure and previous[:last_build_status] == :success
|
15
|
+
fixed_handlers.each {|handler| handler.call name, current } if current[:last_build_status] == :success and previous[:last_build_status] == :failure
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/chicanery.rb
CHANGED
@@ -1,5 +1,28 @@
|
|
1
|
-
require
|
1
|
+
require 'chicanery/persistence'
|
2
|
+
require 'chicanery/servers'
|
3
|
+
require 'chicanery/handlers'
|
4
|
+
require 'chicanery/state_comparison'
|
2
5
|
|
3
6
|
module Chicanery
|
4
|
-
|
5
|
-
|
7
|
+
include Persistence
|
8
|
+
include Servers
|
9
|
+
include Handlers
|
10
|
+
include StateComparison
|
11
|
+
|
12
|
+
VERSION = "0.0.2"
|
13
|
+
|
14
|
+
def execute *args
|
15
|
+
load args.shift
|
16
|
+
previous_state = restore
|
17
|
+
current_state = {
|
18
|
+
servers: {}
|
19
|
+
}
|
20
|
+
servers.each do |server|
|
21
|
+
current_jobs = server.jobs
|
22
|
+
compare_jobs current_jobs, previous_state[:servers][server.name] if previous_state[:servers]
|
23
|
+
current_state[:servers][server.name] = current_jobs
|
24
|
+
end
|
25
|
+
run_handlers.each {|handler| handler.call current_state }
|
26
|
+
persist current_state
|
27
|
+
end
|
28
|
+
end
|
data/spec/broken.xml
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
<Project name="sampleproject :: specs :: specs" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="55" lastBuildTime="2012-11-10T12:39:46" webUrl="http://192.168.1.2:8153/go/tab/build/detail/sampleproject/55/specs/1/specs" />
|
6
6
|
<Project name="sampleproject :: features" activity="Sleeping" lastBuildStatus="Failure" lastBuildLabel="55" lastBuildTime="2012-11-10T13:06:00" webUrl="http://192.168.1.2:8153/go/pipelines/sampleproject/55/features/1">
|
7
7
|
<messages>
|
8
|
-
<message text="
|
8
|
+
<message text="build breaker <buildbreaker@sampleproject.com>" kind="Breakers" />
|
9
9
|
</messages>
|
10
10
|
</Project>
|
11
11
|
<Project name="sampleproject :: features :: features" activity="Sleeping" lastBuildStatus="Failure" lastBuildLabel="55" lastBuildTime="2012-11-10T13:06:00" webUrl="http://192.168.1.2:8153/go/tab/build/detail/sampleproject/55/features/1/features">
|
12
12
|
<messages>
|
13
|
-
<message text="
|
13
|
+
<message text="build breaker <buildbreaker@sampleproject.com>" kind="Breakers" />
|
14
14
|
</messages>
|
15
15
|
</Project>
|
16
16
|
<Project name="sampleproject :: staging" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="51" lastBuildTime="2012-10-23T00:23:22" webUrl="http://192.168.1.2:8153/go/pipelines/sampleproject/51/staging/1" />
|
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.2
|
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-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '1
|
21
|
+
version: '1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '1
|
29
|
+
version: '1'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rake
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '0
|
37
|
+
version: '0'
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: '0
|
45
|
+
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rspec
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +59,22 @@ 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'
|
62
78
|
description: trigger various events related to a continuous integration environment
|
63
79
|
email:
|
64
80
|
- mark@ryall.name
|
@@ -69,14 +85,23 @@ extra_rdoc_files: []
|
|
69
85
|
files:
|
70
86
|
- .gitignore
|
71
87
|
- Gemfile
|
88
|
+
- Gemfile.lock
|
72
89
|
- LICENSE.txt
|
73
90
|
- README.md
|
74
91
|
- Rakefile
|
75
92
|
- bin/chicanery
|
76
93
|
- chicanery.gemspec
|
94
|
+
- cucumber.yml
|
95
|
+
- examples/go_server.rb
|
96
|
+
- features/ci.feature
|
97
|
+
- features/step_definitions/ci_steps.rb
|
98
|
+
- features/support/env.rb
|
77
99
|
- lib/chicanery.rb
|
78
|
-
- lib/chicanery/
|
79
|
-
- lib/chicanery/
|
100
|
+
- lib/chicanery/cctray.rb
|
101
|
+
- lib/chicanery/handlers.rb
|
102
|
+
- lib/chicanery/persistence.rb
|
103
|
+
- lib/chicanery/servers.rb
|
104
|
+
- lib/chicanery/state_comparison.rb
|
80
105
|
- spec/broken.xml
|
81
106
|
- spec/building.xml
|
82
107
|
homepage: http://github.com/markryall/chicanery
|
@@ -93,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
118
|
version: '0'
|
94
119
|
segments:
|
95
120
|
- 0
|
96
|
-
hash: -
|
121
|
+
hash: -836833897029006138
|
97
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
123
|
none: false
|
99
124
|
requirements:
|
@@ -102,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
127
|
version: '0'
|
103
128
|
segments:
|
104
129
|
- 0
|
105
|
-
hash: -
|
130
|
+
hash: -836833897029006138
|
106
131
|
requirements: []
|
107
132
|
rubyforge_project:
|
108
133
|
rubygems_version: 1.8.23
|
@@ -110,5 +135,8 @@ signing_key:
|
|
110
135
|
specification_version: 3
|
111
136
|
summary: polls various resources related to a ci environment and performs custom notifications
|
112
137
|
test_files:
|
138
|
+
- features/ci.feature
|
139
|
+
- features/step_definitions/ci_steps.rb
|
140
|
+
- features/support/env.rb
|
113
141
|
- spec/broken.xml
|
114
142
|
- spec/building.xml
|
data/lib/chicanery/cli.rb
DELETED
data/lib/chicanery/version.rb
DELETED