kid80-cijoe 0.1.3 → 0.2.0
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/Rakefile +34 -1
- data/VERSION +1 -1
- data/deps.rip +0 -1
- data/lib/cijoe.rb +33 -12
- data/lib/cijoe/build.rb +5 -1
- data/lib/cijoe/campfire.rb +20 -14
- data/lib/cijoe/config.rb +19 -1
- data/lib/cijoe/public/screen.css +3 -7
- data/lib/cijoe/version.rb +1 -1
- data/lib/cijoe/views/template.erb +2 -30
- metadata +1 -1
data/Rakefile
CHANGED
@@ -16,10 +16,43 @@ begin
|
|
16
16
|
gemspec.authors = ["Chris Wanstrath"]
|
17
17
|
gemspec.add_dependency 'choice'
|
18
18
|
gemspec.add_dependency 'sinatra'
|
19
|
-
gemspec.add_dependency 'open4'
|
20
19
|
gemspec.version = CIJoe::Version.to_s
|
21
20
|
end
|
22
21
|
rescue LoadError
|
23
22
|
puts "Jeweler not available."
|
24
23
|
puts "Install it with: gem install jeweler"
|
25
24
|
end
|
25
|
+
|
26
|
+
require 'rake/testtask'
|
27
|
+
Rake::TestTask.new(:test) do |test|
|
28
|
+
test.libs << 'lib' << 'test'
|
29
|
+
test.pattern = 'test/**/test_*.rb'
|
30
|
+
test.verbose = true
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'rcov/rcovtask'
|
35
|
+
Rcov::RcovTask.new do |test|
|
36
|
+
test.libs << 'test'
|
37
|
+
test.pattern = 'test/**/test_*.rb'
|
38
|
+
test.verbose = true
|
39
|
+
end
|
40
|
+
rescue LoadError
|
41
|
+
task :rcov do
|
42
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
task :test => :check_dependencies
|
47
|
+
|
48
|
+
task :default => :test
|
49
|
+
|
50
|
+
require 'rake/rdoctask'
|
51
|
+
Rake::RDocTask.new do |rdoc|
|
52
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
53
|
+
|
54
|
+
rdoc.rdoc_dir = 'rdoc'
|
55
|
+
rdoc.title = "someproject #{version}"
|
56
|
+
rdoc.rdoc_files.include('README*')
|
57
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/deps.rip
CHANGED
data/lib/cijoe.rb
CHANGED
@@ -13,12 +13,6 @@
|
|
13
13
|
#
|
14
14
|
# Seriously, I'm gonna be nuts about keeping this simple.
|
15
15
|
|
16
|
-
begin
|
17
|
-
require 'open4'
|
18
|
-
rescue LoadError
|
19
|
-
abort "** Please install open4"
|
20
|
-
end
|
21
|
-
|
22
16
|
require 'cijoe/version'
|
23
17
|
require 'cijoe/config'
|
24
18
|
require 'cijoe/commit'
|
@@ -74,6 +68,7 @@ class CIJoe
|
|
74
68
|
@current_build.status = status
|
75
69
|
@current_build.output = output
|
76
70
|
@last_build = @current_build
|
71
|
+
|
77
72
|
@current_build = nil
|
78
73
|
write_build 'current', @current_build
|
79
74
|
write_build 'last', @last_build
|
@@ -89,22 +84,42 @@ class CIJoe
|
|
89
84
|
Thread.new { build! }
|
90
85
|
end
|
91
86
|
|
87
|
+
def open_pipe(cmd)
|
88
|
+
read, write = IO.pipe
|
89
|
+
|
90
|
+
pid = fork do
|
91
|
+
read.close
|
92
|
+
STDOUT.reopen write
|
93
|
+
exec cmd
|
94
|
+
end
|
95
|
+
|
96
|
+
write.close
|
97
|
+
|
98
|
+
yield read, pid
|
99
|
+
end
|
100
|
+
|
92
101
|
# update git then run the build
|
93
102
|
def build!
|
94
103
|
build = @current_build
|
95
|
-
|
104
|
+
output = ''
|
96
105
|
git_update
|
97
106
|
build.sha = git_sha
|
98
107
|
write_build 'current', build
|
99
108
|
|
100
|
-
|
109
|
+
open_pipe("#{runner_command} 2>&1") do |pipe, pid|
|
110
|
+
puts "#{Time.now.to_i}: Building #{build.short_sha}: pid=#{pid}"
|
111
|
+
|
101
112
|
build.pid = pid
|
102
113
|
write_build 'current', build
|
103
|
-
|
114
|
+
output = pipe.read
|
104
115
|
end
|
105
116
|
|
106
|
-
status
|
117
|
+
status = $?.exitstatus.to_i
|
118
|
+
puts "#{Time.now.to_i}: Built #{build.short_sha}: status=#{status}"
|
119
|
+
|
120
|
+
status == 0 ? build_worked(output) : build_failed('', output)
|
107
121
|
rescue Object => e
|
122
|
+
puts "Exception building: #{e.message} (#{e.class})"
|
108
123
|
build_failed('', e.to_s)
|
109
124
|
end
|
110
125
|
|
@@ -153,8 +168,14 @@ class CIJoe
|
|
153
168
|
|
154
169
|
# restore current / last build state from disk.
|
155
170
|
def restore
|
156
|
-
@last_build
|
157
|
-
|
171
|
+
unless @last_build
|
172
|
+
@last_build = read_build('last')
|
173
|
+
end
|
174
|
+
|
175
|
+
unless @current_build
|
176
|
+
@current_build = read_build('current')
|
177
|
+
end
|
178
|
+
|
158
179
|
Process.kill(0, @current_build.pid) if @current_build && @current_build.pid
|
159
180
|
rescue Errno::ESRCH
|
160
181
|
# build pid isn't running anymore. assume previous
|
data/lib/cijoe/build.rb
CHANGED
data/lib/cijoe/campfire.rb
CHANGED
@@ -2,7 +2,7 @@ class CIJoe
|
|
2
2
|
module Campfire
|
3
3
|
def self.activate
|
4
4
|
if valid_config?
|
5
|
-
require '
|
5
|
+
require 'tinder'
|
6
6
|
|
7
7
|
CIJoe::Build.class_eval do
|
8
8
|
include CIJoe::Campfire
|
@@ -13,8 +13,9 @@ class CIJoe
|
|
13
13
|
puts "Can't load Campfire notifier."
|
14
14
|
puts "Please add the following to your project's .git/config:"
|
15
15
|
puts "[campfire]"
|
16
|
-
puts "\
|
17
|
-
puts "\
|
16
|
+
puts "\tuser = your@campfire.email"
|
17
|
+
puts "\tpass = passw0rd"
|
18
|
+
puts "\tsubdomain = whatever"
|
18
19
|
puts "\troom = Awesomeness"
|
19
20
|
puts "\tssl = false"
|
20
21
|
end
|
@@ -22,22 +23,23 @@ class CIJoe
|
|
22
23
|
|
23
24
|
def self.config
|
24
25
|
@config ||= {
|
25
|
-
:
|
26
|
-
:
|
26
|
+
:subdomain => Config.campfire.subdomain.to_s,
|
27
|
+
:user => Config.campfire.user.to_s,
|
28
|
+
:pass => Config.campfire.pass.to_s,
|
27
29
|
:room => Config.campfire.room.to_s,
|
28
|
-
:
|
30
|
+
:ssl => Config.campfire.ssl.to_s.strip == 'true'
|
29
31
|
}
|
30
32
|
end
|
31
33
|
|
32
34
|
def self.valid_config?
|
33
|
-
%w(
|
34
|
-
puts config.inspect if config[key.intern].nil?
|
35
|
+
%w( subdomain user pass room ).all? do |key|
|
35
36
|
!config[key.intern].empty?
|
36
37
|
end
|
37
38
|
end
|
38
|
-
|
39
|
+
|
39
40
|
def notify
|
40
|
-
room.speak "#{short_message}. #{commit.url}
|
41
|
+
room.speak "#{short_message}. #{commit.url}"
|
42
|
+
room.play "#{play_sound}"
|
41
43
|
room.paste full_message if failed?
|
42
44
|
room.leave
|
43
45
|
end
|
@@ -45,8 +47,12 @@ class CIJoe
|
|
45
47
|
private
|
46
48
|
def room
|
47
49
|
@room ||= begin
|
48
|
-
|
49
|
-
|
50
|
+
config = Campfire.config
|
51
|
+
options = {}
|
52
|
+
options[:ssl] = config[:ssl] ? true : false
|
53
|
+
campfire = Tinder::Campfire.new(config[:subdomain], options)
|
54
|
+
campfire.login(config[:user], config[:pass])
|
55
|
+
campfire.find_room_by_name(config[:room])
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
@@ -55,7 +61,7 @@ class CIJoe
|
|
55
61
|
end
|
56
62
|
|
57
63
|
def play_sound
|
58
|
-
"
|
64
|
+
"#{worked? ? "rimshot" : "trombone"}"
|
59
65
|
end
|
60
66
|
|
61
67
|
def full_message
|
@@ -68,4 +74,4 @@ Commit Author: #{commit.author}
|
|
68
74
|
EOM
|
69
75
|
end
|
70
76
|
end
|
71
|
-
end
|
77
|
+
end
|
data/lib/cijoe/config.rb
CHANGED
@@ -14,11 +14,29 @@ class CIJoe
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_s
|
17
|
-
|
17
|
+
git_command = "git config #{config_string}"
|
18
|
+
result = `#{git_command} 2>&1`.chomp
|
19
|
+
process_status = $?
|
20
|
+
|
21
|
+
if successful_command?(process_status) || config_command_with_empty_value?(result,process_status)
|
22
|
+
return result
|
23
|
+
else
|
24
|
+
raise "Error calling git config, is a recent version of git installed? Command: #{git_command}, Error: #{result}"
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
def config_string
|
21
29
|
@parent ? "#{@parent.config_string}.#{@command}" : @command
|
22
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def successful_command?(process_status)
|
35
|
+
process_status.exitstatus.to_i == 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def config_command_with_empty_value?(result, process_status)
|
39
|
+
process_status.exitstatus.to_i == 1 && result.empty?
|
40
|
+
end
|
23
41
|
end
|
24
42
|
end
|
data/lib/cijoe/public/screen.css
CHANGED
@@ -11,10 +11,6 @@
|
|
11
11
|
padding: 0;
|
12
12
|
}
|
13
13
|
|
14
|
-
html, body {
|
15
|
-
height: 100%;
|
16
|
-
}
|
17
|
-
|
18
14
|
body {
|
19
15
|
background-color: white;
|
20
16
|
font: 13.34px helvetica, arial, clean, sans-serif;
|
@@ -198,8 +194,8 @@ ul.posts {
|
|
198
194
|
|
199
195
|
pre.terminal {
|
200
196
|
border: 1px solid black;
|
201
|
-
background-color: #
|
202
|
-
color:
|
197
|
+
background-color: #fff;
|
198
|
+
color: #333;
|
203
199
|
padding: 5px;
|
204
200
|
overflow: auto;
|
205
201
|
word-wrap: break-word;
|
@@ -207,6 +203,6 @@ pre.terminal {
|
|
207
203
|
|
208
204
|
pre.terminal code {
|
209
205
|
font-family: 'Bitstream Vera Sans Mono', 'Courier', monospace;
|
210
|
-
background-color: #
|
206
|
+
background-color: #fff;
|
211
207
|
}
|
212
208
|
|
data/lib/cijoe/version.rb
CHANGED
@@ -2,17 +2,12 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<link href="<%= cijoe_root %>/screen.css" media="screen" rel="stylesheet" type="text/css" />
|
5
|
+
<link rel="shortcut icon" href="<%= cijoe_root %>/favicon.ico" type="image/x-icon" />
|
5
6
|
<title><%= h(joe.project) %>: CI Joe</title>
|
6
7
|
</head>
|
7
8
|
<body>
|
8
9
|
<div class="site">
|
9
|
-
<div class="title">
|
10
|
-
<a href="<%= cijoe_root %>/">CI Joe</a>
|
11
|
-
<span class="extra">because knowing is half the battle</span>
|
12
|
-
</div>
|
13
|
-
|
14
10
|
<div id="home">
|
15
|
-
<h1><a href="<%= joe.url %>"><%= joe.project %></a></h1>
|
16
11
|
<ul class="posts">
|
17
12
|
<% if joe.current_build %>
|
18
13
|
<li>
|
@@ -35,30 +30,7 @@
|
|
35
30
|
<% end %>
|
36
31
|
</ul>
|
37
32
|
</div>
|
38
|
-
|
39
|
-
<div class="footer">
|
40
|
-
<div class="contact">
|
41
|
-
<p>
|
42
|
-
<a href="http://github.com/defunkt/cijoe/tree/master#readme">Documentation</a><br/>
|
43
|
-
<a href="http://github.com/defunkt/cijoe">Source</a><br/>
|
44
|
-
<a href="http://github.com/defunkt/cijoe/issues">Issues</a><br/>
|
45
|
-
<a href="http://twitter.com/defunkt">Twitter</a>
|
46
|
-
</p>
|
47
|
-
</div>
|
48
|
-
<div class="contact">
|
49
|
-
<p>
|
50
|
-
Designed by <a href="http://tom.preston-werner.com/">Tom Preston-Werner</a><br/>
|
51
|
-
Influenced by <a href="http://integrityapp.com/">Integrity</a><br/>
|
52
|
-
Built with <a href="http://sinatrarb.com/">Sinatra</a><br/>
|
53
|
-
Keep it simple, Sam.
|
54
|
-
</p>
|
55
|
-
</div>
|
56
|
-
<div class="rss">
|
57
|
-
<a href="http://github.com/defunkt/cijoe">
|
58
|
-
<img src="<%= cijoe_root %>/octocat.png" alt="Octocat!" />
|
59
|
-
</a>
|
60
|
-
</div>
|
61
|
-
</div>
|
33
|
+
|
62
34
|
</div>
|
63
35
|
</body>
|
64
36
|
</html>
|