heidi 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +29 -0
- data/VERSION +1 -1
- data/bin/heidi +13 -2
- data/heidi.gemspec +1 -1
- data/lib/heidi/build.rb +7 -2
- data/lib/heidi/builder.rb +1 -1
- data/lib/heidi/hook.rb +4 -1
- data/lib/heidi/integrator.rb +11 -7
- data/lib/heidi/project.rb +10 -2
- data/lib/heidi/web/views/build.erb +5 -0
- data/lib/heidi/web.rb +32 -2
- metadata +18 -18
data/README.rdoc
CHANGED
@@ -93,6 +93,35 @@ Any build is named after it's commit hash (5f6db178c for instance)
|
|
93
93
|
Any successful integration attempt is stored in a tar-ball with the name of
|
94
94
|
the build (5f6db178c.tar.bz2) inside projects/$project/logs/$build/
|
95
95
|
|
96
|
+
== Locking
|
97
|
+
|
98
|
+
Heidi locks the projects she's working on. Letting two Heidi's onto the
|
99
|
+
mountain should not be a problem. If you believe a project's lock is stale
|
100
|
+
just remove projects/$project/.lock
|
101
|
+
|
102
|
+
== Integrating
|
103
|
+
|
104
|
+
With crontab for instance...
|
105
|
+
|
106
|
+
PATH=$PATH:/usr/local/bin
|
107
|
+
MAILTO=icann@example.org
|
108
|
+
|
109
|
+
# m h dom mon dow command
|
110
|
+
*/5 * * * 1-6 cd /path/to/heidi_root && bundle exec heidi integrate
|
111
|
+
|
112
|
+
Or by hand
|
113
|
+
|
114
|
+
heidi integrate [$project]
|
115
|
+
|
116
|
+
== Results
|
117
|
+
|
118
|
+
And off course you would like to see some results...
|
119
|
+
|
120
|
+
% cd /path/to/heidi
|
121
|
+
% heidi_web
|
122
|
+
|
123
|
+
Just make sure to set your firewall straight
|
124
|
+
|
96
125
|
== Contributing to heidi
|
97
126
|
|
98
127
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/bin/heidi
CHANGED
@@ -6,6 +6,8 @@ require 'heidi'
|
|
6
6
|
cmd = ARGV.shift
|
7
7
|
for_a = ARGV.shift
|
8
8
|
|
9
|
+
ENV['PATH'] = "/bin:/usr/bin:/usr/local/bin"
|
10
|
+
|
9
11
|
shell = SimpleShell.new
|
10
12
|
|
11
13
|
def check_heidi_root()
|
@@ -58,8 +60,17 @@ when "project"
|
|
58
60
|
cached.git %W(config heidi.name #{for_a})
|
59
61
|
end
|
60
62
|
end
|
63
|
+
puts "Creating default test hook: projects/#{for_a}/hooks/test/01_rspec"
|
64
|
+
File.open("projects/#{for_a}/hooks/tests/01_rspec", File::CREAT|File::WRONLY) do |f|
|
65
|
+
f.puts %q(#!/bin/sh
|
66
|
+
|
67
|
+
# edit this file to your needs
|
68
|
+
bundle exec rake spec
|
69
|
+
)
|
70
|
+
end
|
71
|
+
shell.chmod %W(+x projects/#{for_a}/hooks/test/01_rspec)
|
61
72
|
puts "\n"
|
62
|
-
puts "Now
|
73
|
+
puts "Now edit or add some hooks and run: heidi integrate #{for_a}"
|
63
74
|
|
64
75
|
when "drop"
|
65
76
|
check_heidi_root
|
@@ -80,7 +91,7 @@ when "integrate"
|
|
80
91
|
next if !for_a.nil? && project.name != for_a
|
81
92
|
project.fetch
|
82
93
|
msg = project.integrate
|
83
|
-
unless msg.nil?
|
94
|
+
unless msg.nil? || msg == true
|
84
95
|
$stderr.puts "#{project.name}: #{msg}"
|
85
96
|
end
|
86
97
|
end
|
data/heidi.gemspec
CHANGED
data/lib/heidi/build.rb
CHANGED
@@ -105,6 +105,7 @@ class Heidi
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def unlock
|
108
|
+
return unless locked?
|
108
109
|
log(:info, "Unlocking build")
|
109
110
|
File.unlink lock_file
|
110
111
|
end
|
@@ -148,8 +149,12 @@ class Heidi
|
|
148
149
|
"DNF"
|
149
150
|
end
|
150
151
|
|
151
|
-
|
152
|
-
|
152
|
+
# file handle to tar ball
|
153
|
+
def tar_ball
|
154
|
+
ball = File.join(@root, "#{commit}.tar.bz2")
|
155
|
+
|
156
|
+
return nil if !File.exists?(ball)
|
157
|
+
return File.open(ball, File::RDONLY)
|
153
158
|
end
|
154
159
|
|
155
160
|
class Logs
|
data/lib/heidi/builder.rb
CHANGED
@@ -82,7 +82,7 @@ class Heidi
|
|
82
82
|
|
83
83
|
def create_tar_ball
|
84
84
|
shell = SimpleShell.new(build.root)
|
85
|
-
shell.mv %W(build
|
85
|
+
shell.mv %W(build #{build.commit})
|
86
86
|
tar = shell.tar %W(-cjf #{build.commit}.tar.bz2 #{build.commit})
|
87
87
|
if tar.S?.to_i == 0
|
88
88
|
shell.rm %W(-rf #{build.commit}/)
|
data/lib/heidi/hook.rb
CHANGED
data/lib/heidi/integrator.rb
CHANGED
@@ -8,9 +8,10 @@ class Heidi
|
|
8
8
|
attr_reader :build, :project
|
9
9
|
|
10
10
|
def initialize(project)
|
11
|
-
@project
|
12
|
-
@build
|
13
|
-
@failed
|
11
|
+
@project = project
|
12
|
+
@build = Heidi::Build.new(project)
|
13
|
+
@failed = false
|
14
|
+
@hooks_ran = []
|
14
15
|
end
|
15
16
|
|
16
17
|
def failure
|
@@ -32,9 +33,11 @@ class Heidi
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def integrate
|
35
|
-
@start = Time.now
|
36
|
-
build.lock
|
37
36
|
build.load_hooks
|
37
|
+
return "no test hooks!" if build.hooks[:tests].empty?
|
38
|
+
|
39
|
+
build.lock
|
40
|
+
@start = Time.now
|
38
41
|
build.clean
|
39
42
|
|
40
43
|
return failure if !run_hooks(:before)
|
@@ -64,11 +67,10 @@ class Heidi
|
|
64
67
|
# always unlock the build root, no matter what
|
65
68
|
build.unlock
|
66
69
|
|
67
|
-
return @failed == true ? false : true
|
68
|
-
|
69
70
|
end
|
70
71
|
|
71
72
|
def run_hooks(where)
|
73
|
+
return true if @hooks_ran.include?(where)
|
72
74
|
return true if build.hooks[where].nil? || build.hooks[where].empty?
|
73
75
|
|
74
76
|
hooks_failed = false
|
@@ -87,6 +89,8 @@ class Heidi
|
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
92
|
+
@hooks_ran << where
|
93
|
+
|
90
94
|
return hooks_failed == true ? false : true
|
91
95
|
end
|
92
96
|
|
data/lib/heidi/project.rb
CHANGED
@@ -71,11 +71,19 @@ class Heidi
|
|
71
71
|
|
72
72
|
def integrate
|
73
73
|
return "locked" if locked?
|
74
|
+
return true if self.current_build == self.commit
|
75
|
+
|
76
|
+
status = "unknown"
|
74
77
|
|
75
|
-
status = ""
|
76
78
|
self.lock do
|
77
79
|
res = Heidi::Integrator.new(self).integrate
|
78
|
-
|
80
|
+
if res == true
|
81
|
+
status = nil
|
82
|
+
elsif res.is_a? String
|
83
|
+
status = res
|
84
|
+
else
|
85
|
+
status = "failed"
|
86
|
+
end
|
79
87
|
end
|
80
88
|
|
81
89
|
return status
|
@@ -5,6 +5,11 @@
|
|
5
5
|
|
6
6
|
<h2 class="<%= build.status %>"><%= build.commit %></h2>
|
7
7
|
|
8
|
+
<% if build.status == "passed" %>
|
9
|
+
<a href='/projects/<%= project.name %>/build/<%= build.commit %>/tar_ball'>download</a>
|
10
|
+
<br /><br />
|
11
|
+
<% end %>
|
12
|
+
|
8
13
|
| <% build.logs.each do |log| %>
|
9
14
|
<a href="#<%= log.file_name %>"><%= log.file_name %></a> |
|
10
15
|
<% end %>
|
data/lib/heidi/web.rb
CHANGED
@@ -27,10 +27,10 @@ class Heidi
|
|
27
27
|
set :root, dir
|
28
28
|
|
29
29
|
get '/' do
|
30
|
-
redirect '/projects', 302
|
30
|
+
redirect '/projects/', 302
|
31
31
|
end
|
32
32
|
|
33
|
-
get '/projects' do
|
33
|
+
get '/projects/' do
|
34
34
|
erb(:home, { :locals => { :projects => @heidi.projects }})
|
35
35
|
end
|
36
36
|
|
@@ -54,6 +54,36 @@ class Heidi
|
|
54
54
|
erb(:build, { :locals => { :build => build, :project => project }})
|
55
55
|
end
|
56
56
|
|
57
|
+
get '/projects/:name/build/:commit/tar_ball' do
|
58
|
+
project = @heidi[params[:name]]
|
59
|
+
if project.nil?
|
60
|
+
return "no project by that name: #{params[:name]}"
|
61
|
+
end
|
62
|
+
|
63
|
+
# load build of project
|
64
|
+
build = Heidi::Build.new(project, params[:commit])
|
65
|
+
|
66
|
+
ball = build.tar_ball
|
67
|
+
if ball.nil?
|
68
|
+
return "no tar ball here..."
|
69
|
+
end
|
70
|
+
|
71
|
+
content_type 'application/x-tar'
|
72
|
+
headers "Content-type" => "application/x-tar",
|
73
|
+
"Content-disposition" => "attachment; filename=#{build.commit}.tar.bz2"
|
74
|
+
|
75
|
+
stream do |out|
|
76
|
+
while true
|
77
|
+
begin
|
78
|
+
out << ball.sysread(1024)
|
79
|
+
rescue EOFError
|
80
|
+
break
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
57
87
|
put '/projects/:name/build' do
|
58
88
|
project = $heidi[params[:name]]
|
59
89
|
if project.nil?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heidi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-07 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thin
|
16
|
-
requirement: &
|
16
|
+
requirement: &74669360 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *74669360
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sinatra
|
27
|
-
requirement: &
|
27
|
+
requirement: &74669010 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *74669010
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: simple_shell
|
38
|
-
requirement: &
|
38
|
+
requirement: &74668670 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *74668670
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &74668320 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.8.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *74668320
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rdoc
|
60
|
-
requirement: &
|
60
|
+
requirement: &74667940 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '3.12'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *74667940
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
|
-
requirement: &
|
71
|
+
requirement: &74667560 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.0.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *74667560
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: jeweler
|
82
|
-
requirement: &
|
82
|
+
requirement: &74667230 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.8.3
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *74667230
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rcov
|
93
|
-
requirement: &
|
93
|
+
requirement: &74666910 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *74666910
|
102
102
|
description: CI-Joe alike CI system called Heidi.
|
103
103
|
email: hartog@organisedminds.com
|
104
104
|
executables:
|
@@ -164,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
segments:
|
166
166
|
- 0
|
167
|
-
hash:
|
167
|
+
hash: -666476931
|
168
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
169
|
none: false
|
170
170
|
requirements:
|