cruisecontrolrb_to_hipchat 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a3a4f5d9a20f3fbddddcb6384b120cfe03a92f66
4
+ data.tar.gz: a72a8694de06e3f4b81a273d8346e00af53e19a4
5
+ SHA512:
6
+ metadata.gz: 922963784bf5fd209f9bdef8e97c1deae19067d0873f28df1418229262494a83f8f498375964a0868ec285b3be1e5fd6e47252f0e614d0d3bdbdbc7fc9880aff
7
+ data.tar.gz: 6ef87dfc667c106a55ff2346bb320ae0a8716d81952cf1470c4d26375d73eb8ee9dff31cea812a1694f30bb357eaaaa6f7b613801971f9509a02ab95db68edd5
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cruisecontrolrb_to_hipchat.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Emmanuel Pinault
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ This is a little Sinatra app notifies Hipchat of any changes in the build status on your CruiseControl.rb install.
2
+
3
+ Heroku-ready! Just follow these steps:
4
+
5
+ 1. Grab a copy of the source
6
+
7
+ git clone git@github.com:andrewpbrett/cruisecontrolrb_to_hipchat.git
8
+
9
+ 2. Create a Heroku app
10
+
11
+ heroku create myapp
12
+
13
+ 3. Required configuration
14
+
15
+ heroku config:add HIPCHAT_AUTH_TOKEN=your_auth_token
16
+ heroku config:add HIPCHAT_ROOM_ID=your_room_id
17
+ heroku config:add CC_URL=your_cruise_control_url
18
+
19
+ 4. Optional configuration:
20
+
21
+ Basic auth for your CruiseControlrb install (recommended):
22
+
23
+ heroku config:add CC_USERNAME=your_username
24
+ heroku config:add CC_PASSWORD=your_password
25
+
26
+ heroku config:add POLLING_INTERVAL # polling interval in minutes. defaults to 1 minute.
27
+ heroku config:add HIPCHAT_FROM=cruise-control # who the messages are "from" in hipchat. defaults to 'cruise-control'
28
+
29
+ 5. Deploy to Heroku
30
+
31
+ git push heroku master
32
+
33
+ 6. Set up something to ping your app regularly in order to [prevent it from idling](http://stackoverflow.com/questions/5480337/easy-way-to-prevent-heroku-idling). The New Relic add-on seems to do the trick, but so does a cron job, pingdom, etc., etc., etc. ...
34
+
35
+ 7. Have a beer while you wait for your first notification in Hipchat.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cruisecontrolrb_to_hipchat'
4
+
5
+ Dante.run('myapp') do |opts|
6
+ # opts: host, pid_path, port, daemonize, user, group
7
+
8
+ raise 'Missing required Cruisecontrol host: export CC_HOST=<your_cc_host>' unless host = ENV["CC_HOST"]
9
+ raise 'Missing required HipChat api token, export HIPCHAT_AUTH_TOKEN=<token>' unless token = ENV["HIPCHAT_AUTH_TOKEN"]
10
+ raise 'Missing required HipChat Room to send message to, export HIPCHAT_ROOM_ID=<room_id>' unless room = ENV["HIPCHAT_ROOM_ID"]
11
+
12
+ options = {cc_host: host,
13
+ cc_username: ENV["CC_USERNAME"] || "",
14
+ cc_password: ENV["CC_PASSWORD"] || "",
15
+ hipchat_api_token: token,
16
+ hipchat_room_id: room ,
17
+ polling_interval: ENV["POLLING_INTERVAL"] || 5}
18
+
19
+ CruisecontrolrbToHipchat::Runner.run(options)
20
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cruisecontrolrb_to_hipchat/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cruisecontrolrb_to_hipchat"
8
+ spec.version = CruisecontrolrbToHipchat::VERSION
9
+ spec.authors = ["epinault"]
10
+ spec.email = ["emmanuel.pinault@zumobi.com"]
11
+ spec.summary = %q{A simple daemon to report last build status from cruisecontrol}
12
+ spec.description = %q{Inspired from https://github.com/andrewpbrett/cruisecontrolrb_to_hipchat but with support of more recent api and multiple projects}
13
+ spec.homepage = "http://github.com/zumobi/cruisecontrolrb_to_hipchat"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "dante", "~> 0.2.0"
22
+ spec.add_dependency "hipchat", "~> 1.2.0"
23
+ spec.add_dependency "nokogiri", "~> 1.6.2"
24
+ spec.add_dependency "httparty", "~> 0.13.1"
25
+ spec.add_dependency "rufus-scheduler"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.6"
28
+ spec.add_development_dependency "rake"
29
+ end
@@ -0,0 +1,59 @@
1
+ require "cruisecontrolrb_to_hipchat/version"
2
+ require "cruisecontrolrb_to_hipchat/cruisecontrolrb"
3
+ require "cruisecontrolrb_to_hipchat/hipchat"
4
+ require 'httparty'
5
+ require 'nokogiri'
6
+ require 'hipchat'
7
+ require 'dante'
8
+ require 'rufus-scheduler'
9
+
10
+ module CruisecontrolrbToHipchat
11
+
12
+ class Runner
13
+ attr_accessor :previous_statuses
14
+ attr_accessor :current_activities
15
+ attr_reader :config
16
+
17
+ def self.run(config)
18
+ new(config).execute
19
+ end
20
+
21
+ def initialize(config)
22
+ @config = config
23
+ @previous_statuses = {}
24
+ @current_activities = {}
25
+ end
26
+
27
+ def execute
28
+ scheduler = Rufus::Scheduler.new(:blocking => true, :overlap => false)
29
+
30
+ scheduler.every("#{config[:polling_interval]}s") do
31
+
32
+ statuses = Cruisecontrolrb.new(config[:cc_host], config[:cc_username], config[:cc_password]).fetch_statuses
33
+
34
+ unless statuses.empty?
35
+
36
+ statuses.each do |status_hash|
37
+ name = status_hash[:name]
38
+ url = File.join(status_hash[:webUrl].gsub("projects", "builds"), status_hash[:lastBuildLabel])
39
+
40
+ if status_hash[:activity] == "Building" and current_activities[name] != "Building"
41
+ msg = "CruiseControl has started to build project #{name}. <a href=\"#{url}\">See details</a>"
42
+ Hipchat.new(config[:hipchat_api_token], config[:hipchat_room_id]).send_message msg
43
+ current_activities[name] = "Building"
44
+ elsif (current_activities[name] == "Building" and status_hash[:activity] != "Building")
45
+ current_activities[name] = status_hash[:activity]
46
+
47
+ color = (status_hash[:lastBuildStatus] == "Success") ? "green" : "red"
48
+ message = (status_hash[:lastBuildStatus] == "Success") ? "<a href=\"#{url}\">Success</a>! #{name} is looking good. You are a stud! :D" : "You are a failure! #{name} is broken. <a href=\"#{url}\">See details</a> and fix it now! >:-("
49
+ Hipchat.new(config[:hipchat_api_token], config[:hipchat_room_id]).send_message message, color
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ scheduler.join
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,35 @@
1
+ require 'httparty'
2
+ require 'nokogiri'
3
+
4
+ module CruisecontrolrbToHipchat
5
+
6
+ class Cruisecontrolrb
7
+
8
+ include HTTParty
9
+
10
+ def initialize(base_url, username = nil, password = nil)
11
+ @auth = { :username => username, :password => password }
12
+ @base_url = base_url
13
+ end
14
+
15
+ def fetch_statuses
16
+ options = { :basic_auth => @auth }
17
+
18
+ noko = Nokogiri::XML(self.class.get("http://#{@base_url}/XmlStatusReport.aspx", options).parsed_response)
19
+ projects = noko.search("Project")
20
+ return [] unless projects.first
21
+
22
+ projects.map do |project|
23
+
24
+ status_hash = { lastBuildStatus: project["lastBuildStatus"],
25
+ webUrl: project["webUrl"],
26
+ lastBuildLabel: project["lastBuildLabel"],
27
+ activity: project["activity"],
28
+ name: project['name'] }
29
+ status_hash
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module CruisecontrolrbToHipchat
3
+ class Hipchat
4
+ attr_reader :client, :options
5
+ def initialize(api_token, room, options = {})
6
+ @options = options
7
+ @options[:user] ||= "cruise-control"
8
+ @options[:notify] ||= true
9
+ @room = room
10
+ @client = HipChat::Client.new(api_token)
11
+ end
12
+
13
+ def send_message(mesg, color = nil)
14
+ client[@room].send(options[:user], mesg, {:notify => options[:notify], :color => color})
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module CruisecontrolrbToHipchat
2
+ VERSION = "0.0.1"
3
+ end
data/test.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'rufus-scheduler'
2
+
3
+ Process.daemon
4
+
5
+ scheduler = Rufus::Scheduler.new
6
+
7
+ scheduler.every '3s' do
8
+ puts 'Hello... Rufus'
9
+ end
10
+
11
+ scheduler.join
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cruisecontrolrb_to_hipchat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - epinault
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dante
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: hipchat
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.6.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.6.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.13.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.13.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: rufus-scheduler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Inspired from https://github.com/andrewpbrett/cruisecontrolrb_to_hipchat
112
+ but with support of more recent api and multiple projects
113
+ email:
114
+ - emmanuel.pinault@zumobi.com
115
+ executables:
116
+ - cruisecontrolrb_to_hipchat
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".gitignore"
121
+ - Gemfile
122
+ - Gemfile.lock
123
+ - LICENSE.txt
124
+ - README.md
125
+ - Rakefile
126
+ - bin/cruisecontrolrb_to_hipchat
127
+ - cruisecontrolrb_to_hipchat.gemspec
128
+ - lib/cruisecontrolrb_to_hipchat.rb
129
+ - lib/cruisecontrolrb_to_hipchat/cruisecontrolrb.rb
130
+ - lib/cruisecontrolrb_to_hipchat/hipchat.rb
131
+ - lib/cruisecontrolrb_to_hipchat/version.rb
132
+ - test.rb
133
+ homepage: http://github.com/zumobi/cruisecontrolrb_to_hipchat
134
+ licenses:
135
+ - MIT
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.2.2
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: A simple daemon to report last build status from cruisecontrol
157
+ test_files: []