cerberus 0.2.1 → 0.2.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/CHANGES +9 -1
- data/README +8 -8
- data/Rakefile +1 -1
- data/doc/FAQ +12 -0
- data/doc/OPTIONS +4 -2
- data/lib/cerberus/builder/maven2.rb +29 -0
- data/lib/cerberus/builder/rake.rb +37 -0
- data/lib/cerberus/manager.rb +21 -39
- data/lib/cerberus/publisher/base.rb +6 -6
- data/lib/cerberus/publisher/irc.rb +2 -2
- data/lib/cerberus/publisher/jabber.rb +2 -2
- data/lib/cerberus/publisher/mail.rb +4 -4
- data/lib/cerberus/publisher/rss.rb +3 -3
- data/lib/cerberus/scm/svn.rb +20 -12
- data/lib/cerberus/utils.rb +6 -0
- data/lib/cerberus/version.rb +1 -1
- data/test/data/application.dump +47 -0
- data/test/functional_test.rb +15 -0
- data/test/integration_test.rb +2 -1
- data/test/irc_publisher_test.rb +2 -2
- data/test/jabber_publisher_test.rb +2 -2
- data/test/mail_publisher_test.rb +2 -2
- data/test/maven2_builer_test.rb +68 -0
- data/test/mock/manager.rb +11 -0
- data/test/rss_publisher_test.rb +2 -2
- metadata +5 -4
- data/test/mock/build.rb +0 -10
data/CHANGES
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
= Cerberus Changelog
|
2
2
|
|
3
|
+
== Version 0.2.2
|
4
|
+
Minor fix release
|
5
|
+
|
6
|
+
* Make rake executable recongnition process less verbose
|
7
|
+
* Refactored builder mecahnism in Cerberus. Now adding new Builder possible in much more easiest way
|
8
|
+
* Added Maven2 builder
|
9
|
+
* Add possibility to specify Builder type on application creation by BUILDER=xxx option
|
10
|
+
* Process correctly folders locked by SVN
|
11
|
+
|
3
12
|
== Version 0.2.1
|
4
13
|
Minor fix release
|
5
14
|
|
6
15
|
* publisher -> active flag now not mandatory. Use 'mail' publisher as active if not set any
|
7
16
|
|
8
|
-
|
9
17
|
== Version 0.2.0
|
10
18
|
Config file was changed since 0.1.1 and you need regenerate config files.
|
11
19
|
Or change it by hands: see doc/OPTIONS file to list of all avalable options.
|
data/README
CHANGED
@@ -17,14 +17,14 @@ He guarded the gate to Hades (the Greek underworld) and ensured that the dead co
|
|
17
17
|
|
18
18
|
So Cerberus will guard your tests and not allow your project to go to the world of dead.
|
19
19
|
|
20
|
-
There
|
21
|
-
Main advantages of Cerberus over other solutions:
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
There are several CI solutions already present, why do you need to use Cerberus?
|
21
|
+
Main advantages of Cerberus over other solutions are:
|
22
|
+
1) Cerberus could be installed on any machine not only where SVN repository located.
|
23
|
+
2) Cerberus works not only for Rails projects, but for any other Ruby projects as well as for other platforms (Maven2 for Java)
|
24
|
+
3) Cerberus multiplatform solution: it runs excellent both on *nix and Windows.
|
25
|
+
4) Cerberus distributed via RubyGems, so it is very easy to install and very easy to update to the latest stable version
|
26
|
+
5) Cerberus very easy to start using. Just type 'cerberus add PROJECT_URL|PROJECT_DIR'
|
27
|
+
6) Cerberus is lightweight solution: most of the time ruby process even not runs - Rake runs only in case if changes in project sources are found.
|
28
28
|
|
29
29
|
|
30
30
|
To use Cerberus it is very easy. First install it. Easiest way to do it through RubyGems package manager.
|
data/Rakefile
CHANGED
@@ -51,7 +51,7 @@ GEM_SPEC = Gem::Specification.new do |s|
|
|
51
51
|
Cerberus could be easily invoked from Cron (for Unix) or nnCron (for Windows) utilities.
|
52
52
|
DESC
|
53
53
|
|
54
|
-
s.add_dependency 'actionmailer', '>= 1.2.
|
54
|
+
s.add_dependency 'actionmailer', '>= 1.2.5'
|
55
55
|
s.add_dependency 'rake', '>= 0.7.1'
|
56
56
|
s.add_dependency 'jabber4r', '>= 0.8.0'
|
57
57
|
s.add_dependency 'Ruby-IRC', '>= 1.0.3'
|
data/doc/FAQ
CHANGED
@@ -19,3 +19,15 @@ Action:
|
|
19
19
|
SWHide NormalPriority
|
20
20
|
START-APPW: c:\progra~1\ruby\bin\cerberus.CMD build cerberus
|
21
21
|
)#
|
22
|
+
|
23
|
+
|
24
|
+
* How to change task for Rake
|
25
|
+
In my project we need to run Rails migrations before tests. But by default Cerberus runs :default task.
|
26
|
+
How could I run migations?
|
27
|
+
|
28
|
+
it is easy - just set Rake tasks option in config
|
29
|
+
builder:
|
30
|
+
rake:
|
31
|
+
task: migrate test
|
32
|
+
|
33
|
+
And it would run migrations
|
data/doc/OPTIONS
CHANGED
@@ -27,7 +27,7 @@ publisher:
|
|
27
27
|
scm:
|
28
28
|
type: svn A
|
29
29
|
url: A
|
30
|
-
builder
|
30
|
+
builder:
|
31
31
|
type: rake #supported: maven2 A
|
32
32
|
rake: C
|
33
33
|
task: test CA
|
@@ -38,8 +38,10 @@ L - Only for command line interface
|
|
38
38
|
C - Cerberus config
|
39
39
|
A - application level config
|
40
40
|
|
41
|
+
|
41
42
|
L
|
42
43
|
recipients (add)
|
43
44
|
verbose or quite ??(add, build)
|
44
45
|
application_name (add)
|
45
|
-
scm (add, default svn)
|
46
|
+
scm (add, default svn)
|
47
|
+
builder
|
@@ -1,2 +1,31 @@
|
|
1
1
|
class Cerberus::Builder::Maven2
|
2
|
+
attr_reader :output
|
3
|
+
|
4
|
+
def initialize(config)
|
5
|
+
@config = config
|
6
|
+
end
|
7
|
+
|
8
|
+
def run
|
9
|
+
Dir.chdir @config[:application_root]
|
10
|
+
cmd = @config[:builder, :maven2, :cmd] || 'mvn'
|
11
|
+
task = @config[:builder, :maven2, :task] || 'test'
|
12
|
+
output = `#{@config[:bin_path]}#{cmd} #{task} 2>&1`
|
13
|
+
@output = add_error_information(output)
|
14
|
+
successful?
|
15
|
+
end
|
16
|
+
|
17
|
+
def successful?
|
18
|
+
$?.exitstatus == 0 and not @output.include?('[ERROR] BUILD FAILURE')
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_error_information(str)
|
22
|
+
output = ''
|
23
|
+
while str =~ /^(.|\n)*Running (.*)\n(.|\n)* <<< FAILURE!$/
|
24
|
+
failed_class = $2
|
25
|
+
output << $` << $&
|
26
|
+
output << "\n" << IO.readlines("#{@config[:application_root]}/target/surefire-reports/#{failed_class}.txt")[4..-1].join
|
27
|
+
str = $'
|
28
|
+
end
|
29
|
+
output << str
|
30
|
+
end
|
2
31
|
end
|
@@ -1,2 +1,39 @@
|
|
1
1
|
class Cerberus::Builder::Rake
|
2
|
+
include Cerberus::Utils
|
3
|
+
attr_reader :output
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
@config = config
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
Dir.chdir @config[:application_root]
|
11
|
+
@output = `#{@config[:bin_path]}#{choose_rake_exec()} #{@config[:builder, :rake, :task]} 2>&1`
|
12
|
+
successful?
|
13
|
+
end
|
14
|
+
|
15
|
+
def successful?
|
16
|
+
$?.exitstatus == 0 and not @output.include?('rake aborted!')
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def choose_rake_exec
|
21
|
+
ext = ['']
|
22
|
+
|
23
|
+
if os() == :windows
|
24
|
+
ext << '.bat' << '.cmd'
|
25
|
+
end
|
26
|
+
|
27
|
+
silence_stream(STDERR) {
|
28
|
+
ext.each do |e|
|
29
|
+
begin
|
30
|
+
out = `#{@config[:bin_path]}rake#{e} --version`
|
31
|
+
return "rake#{e}" if out =~ /rake/
|
32
|
+
rescue
|
33
|
+
end
|
34
|
+
end
|
35
|
+
}
|
36
|
+
|
37
|
+
raise "Rake builder did not find. Make sure that such script exists and have executable permissions."
|
38
|
+
end
|
2
39
|
end
|
data/lib/cerberus/manager.rb
CHANGED
@@ -13,7 +13,7 @@ require 'cerberus/scm/svn'
|
|
13
13
|
|
14
14
|
module Cerberus
|
15
15
|
SCM_TYPES = {
|
16
|
-
|
16
|
+
:svn => Cerberus::SCM::SVN
|
17
17
|
}
|
18
18
|
|
19
19
|
PUBLISHER_TYPES = {
|
@@ -23,22 +23,26 @@ module Cerberus
|
|
23
23
|
:rss => Cerberus::Publisher::RSS
|
24
24
|
}
|
25
25
|
|
26
|
+
BUILDER_TYPES = {
|
27
|
+
:maven2 => Cerberus::Builder::Maven2,
|
28
|
+
:rake => Cerberus::Builder::Rake
|
29
|
+
}
|
30
|
+
|
26
31
|
class AddCommand
|
27
32
|
EXAMPLE_CONFIG = File.expand_path(File.dirname(__FILE__) + '/config.example.yml')
|
28
33
|
include Cerberus::Utils
|
29
34
|
|
30
35
|
def initialize(path, cli_options = {})
|
31
|
-
@path, @
|
36
|
+
@path, @cli_options = path, HashWithIndifferentAccess.new(cli_options)
|
32
37
|
end
|
33
38
|
|
34
39
|
def run
|
35
|
-
scm_type = @
|
36
|
-
say "SCM #{scm_type} not supported" unless SCM_TYPES[scm_type]
|
37
|
-
|
38
|
-
scm = SCM_TYPES[scm_type].new(@path, @config)
|
40
|
+
scm_type = @cli_options[:scm] || 'svn'
|
41
|
+
say "SCM #{scm_type} not supported" unless SCM_TYPES[scm_type.to_sym]
|
42
|
+
scm = SCM_TYPES[scm_type.to_sym].new(@path, @cli_options)
|
39
43
|
say "Can't find any #{scm_type} application under #{@path}" unless scm.url
|
40
44
|
|
41
|
-
application_name = @
|
45
|
+
application_name = @cli_options[:application_name] || extract_project_name(@path)
|
42
46
|
|
43
47
|
create_example_config
|
44
48
|
|
@@ -48,10 +52,11 @@ module Cerberus
|
|
48
52
|
app_config = { 'scm' => {
|
49
53
|
'url' => scm.url,
|
50
54
|
'type' => scm_type },
|
51
|
-
'publisher' => {'mail' => {'recipients' => @
|
55
|
+
'publisher' => {'mail' => {'recipients' => @cli_options[:recipients]}},
|
56
|
+
'builder' => {'type' => @cli_options[:builder]}
|
52
57
|
}
|
53
58
|
dump_yml(config_name, app_config)
|
54
|
-
puts "Application '#{application_name}' was successfully added to Cerberus" unless @
|
59
|
+
puts "Application '#{application_name}' was successfully added to Cerberus" unless @cli_options[:quiet]
|
55
60
|
end
|
56
61
|
|
57
62
|
private
|
@@ -68,7 +73,7 @@ module Cerberus
|
|
68
73
|
|
69
74
|
class BuildCommand
|
70
75
|
include Cerberus::Utils
|
71
|
-
attr_reader :
|
76
|
+
attr_reader :builder, :success, :scm, :status
|
72
77
|
|
73
78
|
def initialize(application_name, cli_options = {})
|
74
79
|
unless File.exists?("#{HOME}/config/#{application_name}.yml")
|
@@ -82,7 +87,11 @@ module Cerberus
|
|
82
87
|
|
83
88
|
@status = Status.new("#{app_root}/status.log")
|
84
89
|
|
85
|
-
|
90
|
+
scm_type = @config[:scm, :type] || 'svn'
|
91
|
+
@scm = SCM_TYPES[scm_type.to_sym].new(@config[:application_root], @config)
|
92
|
+
|
93
|
+
builder_type = @config[:builder, :type] || 'rake'
|
94
|
+
@builder = BUILDER_TYPES[builder_type.to_sym].new(@config)
|
86
95
|
end
|
87
96
|
|
88
97
|
def run
|
@@ -92,7 +101,7 @@ module Cerberus
|
|
92
101
|
|
93
102
|
state =
|
94
103
|
if @scm.has_changes? or not previous_status
|
95
|
-
if status =
|
104
|
+
if status = @builder.run
|
96
105
|
@status.keep(:succesful)
|
97
106
|
case previous_status
|
98
107
|
when :failed
|
@@ -134,33 +143,6 @@ module Cerberus
|
|
134
143
|
end
|
135
144
|
end
|
136
145
|
end
|
137
|
-
|
138
|
-
private
|
139
|
-
def make
|
140
|
-
Dir.chdir @config[:application_root]
|
141
|
-
@output = `#{@config[:bin_path]}#{choose_rake_exec()} #{@config[:builder, :rake, :task]} 2>&1`
|
142
|
-
make_successful?
|
143
|
-
end
|
144
|
-
|
145
|
-
def make_successful?
|
146
|
-
$?.exitstatus == 0 and not @output.include?('rake aborted!')
|
147
|
-
end
|
148
|
-
|
149
|
-
def choose_rake_exec
|
150
|
-
ext = ['']
|
151
|
-
|
152
|
-
if os() == :windows
|
153
|
-
ext << '.bat' << '.cmd'
|
154
|
-
end
|
155
|
-
|
156
|
-
ext.each{|e|
|
157
|
-
begin
|
158
|
-
out = `#{@config[:bin_path]}rake#{e} --version`
|
159
|
-
return "rake#{e}" if out =~ /rake/
|
160
|
-
rescue
|
161
|
-
end
|
162
|
-
}
|
163
|
-
end
|
164
146
|
end
|
165
147
|
|
166
148
|
class BuildAllCommand
|
@@ -3,24 +3,24 @@ require 'cerberus/version'
|
|
3
3
|
module Cerberus
|
4
4
|
module Publisher
|
5
5
|
class Base
|
6
|
-
def self.formatted_message(state,
|
6
|
+
def self.formatted_message(state, manager, options)
|
7
7
|
subject =
|
8
8
|
case state
|
9
9
|
when :setup
|
10
|
-
"Cerberus set up for project (##{
|
10
|
+
"Cerberus set up for project (##{manager.scm.current_revision})"
|
11
11
|
when :broken
|
12
|
-
"Build still broken (##{
|
12
|
+
"Build still broken (##{manager.scm.current_revision})"
|
13
13
|
when :failure
|
14
|
-
"Build broken by #{
|
14
|
+
"Build broken by #{manager.scm.last_author} (##{manager.scm.current_revision})"
|
15
15
|
when :revival
|
16
|
-
"Build fixed by #{
|
16
|
+
"Build fixed by #{manager.scm.last_author} (##{manager.scm.current_revision})"
|
17
17
|
else
|
18
18
|
raise "Unknown build state #{state}"
|
19
19
|
end
|
20
20
|
|
21
21
|
subject = "[#{options[:application_name]}] #{subject}"
|
22
22
|
generated_by = "--\nCerberus #{Cerberus::VERSION::STRING}, http://rubyforge.org/projects/cerberus"
|
23
|
-
body = [
|
23
|
+
body = [ manager.scm.last_commit_message, manager.builder.output, generated_by ].join("\n\n")
|
24
24
|
|
25
25
|
return subject, body
|
26
26
|
end
|
@@ -2,10 +2,10 @@ require 'IRC'
|
|
2
2
|
require 'cerberus/publisher/base'
|
3
3
|
|
4
4
|
class Cerberus::Publisher::IRC < Cerberus::Publisher::Base
|
5
|
-
def self.publish(state,
|
5
|
+
def self.publish(state, manager, options)
|
6
6
|
irc_options = options[:publisher, :irc]
|
7
7
|
raise "There is no channel provided for IRC publisher" unless irc_options[:channel]
|
8
|
-
subject,body = Cerberus::Publisher::Base.formatted_message(state,
|
8
|
+
subject,body = Cerberus::Publisher::Base.formatted_message(state, manager, options)
|
9
9
|
message = subject + "\n" + '*' * subject.length + "\n" + body
|
10
10
|
|
11
11
|
|
@@ -2,12 +2,12 @@ require 'jabber4r/jabber4r'
|
|
2
2
|
require 'cerberus/publisher/base'
|
3
3
|
|
4
4
|
class Cerberus::Publisher::Jabber < Cerberus::Publisher::Base
|
5
|
-
def self.publish(state,
|
5
|
+
def self.publish(state, manager, options)
|
6
6
|
begin
|
7
7
|
jabber_options = options[:publisher, :jabber]
|
8
8
|
raise "There is no recipients provided for Jabber publisher" unless jabber_options[:recipients]
|
9
9
|
|
10
|
-
subject,body = Cerberus::Publisher::Base.formatted_message(state,
|
10
|
+
subject,body = Cerberus::Publisher::Base.formatted_message(state, manager, options)
|
11
11
|
|
12
12
|
session = login(jabber_options[:jid], jabber_options[:password])
|
13
13
|
jabber_options[:recipients].split(',').each do |address|
|
@@ -2,12 +2,12 @@ require 'action_mailer'
|
|
2
2
|
require 'cerberus/publisher/base'
|
3
3
|
|
4
4
|
class Cerberus::Publisher::Mail < Cerberus::Publisher::Base
|
5
|
-
def self.publish(state,
|
5
|
+
def self.publish(state, manager, options)
|
6
6
|
mail_opts = options[:publisher, :mail].dup
|
7
7
|
raise "There is no recipients provided for mail publisher" unless mail_opts[:recipients]
|
8
8
|
|
9
9
|
configure(mail_opts)
|
10
|
-
ActionMailerPublisher.deliver_message(state,
|
10
|
+
ActionMailerPublisher.deliver_message(state, manager, options)
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
@@ -21,8 +21,8 @@ class Cerberus::Publisher::Mail < Cerberus::Publisher::Base
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class ActionMailerPublisher < ActionMailer::Base
|
24
|
-
def message(state,
|
25
|
-
@subject, @body = Cerberus::Publisher::Base.formatted_message(state,
|
24
|
+
def message(state, manager, options)
|
25
|
+
@subject, @body = Cerberus::Publisher::Base.formatted_message(state, manager, options)
|
26
26
|
@recipients, @sent_on = options[:publisher, :mail, :recipients], Time.now
|
27
27
|
@from = options[:publisher, :mail, :sender] || "'Cerberus' <cerberus@example.com>"
|
28
28
|
# raise "Please specify recipient addresses for application '#{options[:application_name]}'" unless options[:recipients]
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'cerberus/publisher/base'
|
2
2
|
|
3
3
|
class Cerberus::Publisher::RSS < Cerberus::Publisher::Base
|
4
|
-
def self.publish(state,
|
4
|
+
def self.publish(state, manager, options)
|
5
5
|
config = options[:publisher, :rss]
|
6
|
-
subject,body = Cerberus::Publisher::Base.formatted_message(state,
|
6
|
+
subject,body = Cerberus::Publisher::Base.formatted_message(state, manager, options)
|
7
7
|
|
8
8
|
pub_date = Time.now.iso8601
|
9
9
|
result = <<-END
|
@@ -21,6 +21,6 @@ class Cerberus::Publisher::RSS < Cerberus::Publisher::Base
|
|
21
21
|
</rss>
|
22
22
|
END
|
23
23
|
|
24
|
-
|
24
|
+
IO.write(config[:file], result)
|
25
25
|
end
|
26
26
|
end
|
data/lib/cerberus/scm/svn.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
1
|
class Cerberus::SCM::SVN
|
2
|
-
def initialize(path,
|
2
|
+
def initialize(path, config = {})
|
3
3
|
raise "Path can't be nil" unless path
|
4
4
|
|
5
|
-
@path, @
|
5
|
+
@path, @config = path.strip, config
|
6
6
|
@encoded_path = (@path.include?(' ') ? "\"#{@path}\"" : @path)
|
7
|
+
|
8
|
+
if test(?d, @path + '/.svn') #check first that it was not locked
|
9
|
+
execute("cleanup") if locked?
|
10
|
+
FileUtils.rm_rf @path if locked? #In case if we could not unlock from command line - remove this directory at all
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
14
|
def update!
|
10
15
|
if test(?d, @path + '/.svn')
|
11
|
-
execute("
|
12
|
-
@status = execute("svn update")
|
16
|
+
@status = execute("update")
|
13
17
|
else
|
14
18
|
FileUtils.mkpath(@path) unless test(?d,@path)
|
15
|
-
@status = execute("
|
19
|
+
@status = execute("checkout", nil, @config[:scm, :url])
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
@@ -29,7 +33,7 @@ class Cerberus::SCM::SVN
|
|
29
33
|
end
|
30
34
|
|
31
35
|
def last_commit_message
|
32
|
-
message = execute("
|
36
|
+
message = execute("log", "--limit 1 -v")
|
33
37
|
#strip first line that contains command line itself (svn log --limit ...)
|
34
38
|
if ((idx = message.index('-'*72)) != 0 )
|
35
39
|
message[idx..-1]
|
@@ -43,11 +47,15 @@ class Cerberus::SCM::SVN
|
|
43
47
|
end
|
44
48
|
|
45
49
|
private
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
def locked?
|
51
|
+
execute("st") =~ /^..L/
|
52
|
+
end
|
53
|
+
|
54
|
+
def info
|
55
|
+
@info ||= YAML.load(execute("info"))
|
56
|
+
end
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
58
|
+
def execute(command, parameters = nil, pre_parameters = nil)
|
59
|
+
`#{@config[:bin_path]}svn #{command} #{pre_parameters} #{@encoded_path} #{parameters}`
|
60
|
+
end
|
53
61
|
end
|
data/lib/cerberus/utils.rb
CHANGED
data/lib/cerberus/version.rb
CHANGED
data/test/data/application.dump
CHANGED
@@ -78,3 +78,50 @@ class ATest < Test::Unit::TestCase
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
+
Revision-number: 2
|
82
|
+
Prop-content-length: 127
|
83
|
+
Content-length: 127
|
84
|
+
|
85
|
+
K 7
|
86
|
+
svn:log
|
87
|
+
V 24
|
88
|
+
Added custom rake tasks
|
89
|
+
|
90
|
+
K 10
|
91
|
+
svn:author
|
92
|
+
V 8
|
93
|
+
Apomozov
|
94
|
+
K 8
|
95
|
+
svn:date
|
96
|
+
V 27
|
97
|
+
2006-08-21T12:15:18.697839Z
|
98
|
+
PROPS-END
|
99
|
+
|
100
|
+
Node-path: Rakefile
|
101
|
+
Node-kind: file
|
102
|
+
Node-action: change
|
103
|
+
Text-content-length: 354
|
104
|
+
Text-content-md5: f2c9b7345783c55045e523e052ddaf9e
|
105
|
+
Content-length: 354
|
106
|
+
|
107
|
+
require 'rake'
|
108
|
+
require 'rake/testtask'
|
109
|
+
|
110
|
+
task :default => :test
|
111
|
+
|
112
|
+
desc "Run the unit tests in test/unit"
|
113
|
+
Rake::TestTask.new(:test) do |t|
|
114
|
+
t.libs << "test"
|
115
|
+
t.pattern = 'test/*_test.rb'
|
116
|
+
t.verbose = true
|
117
|
+
end
|
118
|
+
|
119
|
+
task :custom1 do
|
120
|
+
puts "Task 'custom1' has been invoked"
|
121
|
+
end
|
122
|
+
|
123
|
+
task :custom2 do
|
124
|
+
puts "Task 'custom2' has been invoked"
|
125
|
+
end
|
126
|
+
|
127
|
+
|
data/test/functional_test.rb
CHANGED
@@ -49,6 +49,11 @@ class FunctionalTest < Test::Unit::TestCase
|
|
49
49
|
build = Cerberus::BuildCommand.new('myapp')
|
50
50
|
build.run
|
51
51
|
assert_equal 1, ActionMailer::Base.deliveries.size #first email that project was setup
|
52
|
+
output = ActionMailer::Base.deliveries[0].body
|
53
|
+
|
54
|
+
#Check outpus that run needed tasks
|
55
|
+
assert_match /1 tests, 1 assertions, 0 failures, 0 errors/, output
|
56
|
+
assert output !~ /Task 'custom1' has been invoked/
|
52
57
|
|
53
58
|
status_file = HOME + '/work/myapp/status.log'
|
54
59
|
assert File.exists?(status_file)
|
@@ -140,4 +145,14 @@ class FunctionalTest < Test::Unit::TestCase
|
|
140
145
|
assert_equal 'succesful', IO.read(status_file)
|
141
146
|
end
|
142
147
|
end
|
148
|
+
|
149
|
+
def test_custom_task_for_rake
|
150
|
+
add_application('rake_cust', SVN_URL, 'builder' => {'rake' => {'task' => 'custom1 custom2'}})
|
151
|
+
build = Cerberus::BuildAllCommand.new
|
152
|
+
build.run
|
153
|
+
assert_equal 1, ActionMailer::Base.deliveries.size
|
154
|
+
output = ActionMailer::Base.deliveries[0].body
|
155
|
+
assert_match /Task 'custom1' has been invoked/, output
|
156
|
+
assert_match /Task 'custom2' has been invoked/, output
|
157
|
+
end
|
143
158
|
end
|
data/test/integration_test.rb
CHANGED
@@ -25,7 +25,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_add_project_with_parameters
|
28
|
-
output = run_cerb(" add #{SVN_URL} APPLICATION_NAME=hello_world
|
28
|
+
output = run_cerb(" add #{SVN_URL} APPLICATION_NAME=hello_world RECIPIENTS=aa@gmail.com BUILDER=maven2")
|
29
29
|
assert_match /was successfully added/, output
|
30
30
|
|
31
31
|
assert File.exists?(HOME + '/config/hello_world.yml')
|
@@ -33,6 +33,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
33
33
|
|
34
34
|
assert_equal SVN_URL, cfg['scm']['url']
|
35
35
|
assert_equal 'aa@gmail.com', cfg['publisher']['mail']['recipients']
|
36
|
+
assert_equal 'maven2', cfg['builder']['type']
|
36
37
|
end
|
37
38
|
|
38
39
|
def test_run_project
|
data/test/irc_publisher_test.rb
CHANGED
@@ -3,12 +3,12 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
3
3
|
require 'cerberus/publisher/irc'
|
4
4
|
require 'cerberus/config'
|
5
5
|
require 'mock/irc'
|
6
|
-
require 'mock/
|
6
|
+
require 'mock/manager'
|
7
7
|
|
8
8
|
class IRCPublisherTest < Test::Unit::TestCase
|
9
9
|
def test_publisher
|
10
10
|
options = Cerberus::Config.new(nil, :publisher => {:irc => {:channel => 'hello'}}, :application_name => 'IrcApp')
|
11
|
-
build =
|
11
|
+
build = DummyManager.new('last message', 'this is output', 1232, 'anatol')
|
12
12
|
|
13
13
|
Cerberus::Publisher::IRC.publish(:setup, build, options)
|
14
14
|
|
@@ -2,12 +2,12 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
2
2
|
|
3
3
|
require 'cerberus/publisher/jabber'
|
4
4
|
require 'mock/jabber4r'
|
5
|
-
require 'mock/
|
5
|
+
require 'mock/manager'
|
6
6
|
|
7
7
|
class JabberPublisherTest < Test::Unit::TestCase
|
8
8
|
def test_publisher
|
9
9
|
options = Cerberus::Config.new(nil, :publisher => {:jabber => {:recipients => ' jit1@google.com, another@google.com '}}, :application_name => 'MegaApp')
|
10
|
-
build =
|
10
|
+
build = DummyManager.new('last message', 'this is output', 1232, 'anatol')
|
11
11
|
|
12
12
|
Cerberus::Publisher::Jabber.publish(:setup, build, options)
|
13
13
|
|
data/test/mail_publisher_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
require 'cerberus/publisher/mail'
|
4
|
-
require 'mock/
|
4
|
+
require 'mock/manager'
|
5
5
|
|
6
6
|
class MailPublisherTest < Test::Unit::TestCase
|
7
7
|
def setup
|
@@ -12,7 +12,7 @@ class MailPublisherTest < Test::Unit::TestCase
|
|
12
12
|
options = Cerberus::Config.new(nil, :publisher => {
|
13
13
|
:mail => {:recipients => 'anatol.pomozov@hello.com', :sender => 'haha', :delivery_method => 'test'}},
|
14
14
|
:application_name => 'MyApp')
|
15
|
-
build =
|
15
|
+
build = DummyManager.new('last message', 'this is output', 1232, 'anatol')
|
16
16
|
|
17
17
|
Cerberus::Publisher::Mail.publish(:setup, build, options)
|
18
18
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
require 'cerberus/builder/maven2'
|
4
|
+
require 'mock/manager'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
class Cerberus::Builder::Maven2
|
8
|
+
attr_writer :output
|
9
|
+
end
|
10
|
+
|
11
|
+
class Maven2BuilderTest < Test::Unit::TestCase
|
12
|
+
def test_builder
|
13
|
+
tmp = Dir::tmpdir
|
14
|
+
builder = Cerberus::Builder::Maven2.new(:application_root => tmp)
|
15
|
+
builder.output = MVN_OUTPUT
|
16
|
+
assert !builder.successful?
|
17
|
+
|
18
|
+
surefire_file = "#{tmp}/target/surefire-reports/wicket.markup.html.form.persistence.CookieValuePersisterTest.txt"
|
19
|
+
FileUtils.mkpath File.dirname(surefire_file)
|
20
|
+
IO.write(surefire_file, SUREFIRE_CLASS_OUTPUT)
|
21
|
+
|
22
|
+
output = builder.add_error_information(MVN_OUTPUT)
|
23
|
+
assert output.include?('at wicket.markup.html.basic.SimplePageTest.testRenderHomePage_3(SimplePageTest.java:285)')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
MVN_OUTPUT =<<-END
|
29
|
+
-------------------------------------------------------
|
30
|
+
T E S T S
|
31
|
+
-------------------------------------------------------
|
32
|
+
Running wicket.markup.html.list.PagedTableNavigatorWithMarginTest
|
33
|
+
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.313 sec
|
34
|
+
Running wicket.markup.html.list.IncrementalTableNavigationTest
|
35
|
+
=== wicket.markup.html.list.IncrementalTableNavigationPage ===
|
36
|
+
=== wicket.markup.html.list.IncrementalTableNavigationPage : nextNext ===
|
37
|
+
=== wicket.markup.html.list.IncrementalTableNavigationPage : prev ===
|
38
|
+
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec
|
39
|
+
Running wicket.markup.html.form.persistence.CookieValuePersisterTest
|
40
|
+
=== wicket.markup.html.list.IncrementalTableNavigationPage ===
|
41
|
+
=== wicket.markup.html.list.IncrementalTableNavigationPage : nextNext ===
|
42
|
+
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.516 sec <<< FAILURE!
|
43
|
+
Running wicket.util.string.StringListTest
|
44
|
+
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec
|
45
|
+
|
46
|
+
Results :
|
47
|
+
Tests run: 449, Failures: 4, Errors: 9, Skipped: 0
|
48
|
+
|
49
|
+
[INFO] ------------------------------------------------------------------------
|
50
|
+
[ERROR] BUILD FAILURE
|
51
|
+
[INFO] ------------------------------------------------------------------------
|
52
|
+
[INFO] There are test failures.
|
53
|
+
END
|
54
|
+
|
55
|
+
SUREFIRE_CLASS_OUTPUT =<<-END
|
56
|
+
-------------------------------------------------------------------------------
|
57
|
+
Test set: wicket.markup.html.basic.SimplePageTest
|
58
|
+
-------------------------------------------------------------------------------
|
59
|
+
Tests run: 13, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.521 sec <<< FAILURE!
|
60
|
+
testRenderHomePage_3(wicket.markup.html.basic.SimplePageTest) Time elapsed: 0.06 sec <<< FAILURE!
|
61
|
+
junit.framework.AssertionFailedError
|
62
|
+
at junit.framework.Assert.fail(Assert.java:47)
|
63
|
+
at junit.framework.Assert.assertTrue(Assert.java:20)
|
64
|
+
at junit.framework.Assert.assertTrue(Assert.java:27)
|
65
|
+
at wicket.WicketTestCase.executeTest(WicketTestCase.java:78)
|
66
|
+
at wicket.markup.html.basic.SimplePageTest.testRenderHomePage_3(SimplePageTest.java:285)
|
67
|
+
|
68
|
+
END
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class DummyManager
|
2
|
+
attr_reader :builder, :scm
|
3
|
+
|
4
|
+
DummyScm = Struct.new(:last_commit_message, :current_revision, :last_author)
|
5
|
+
DummyBuilder = Struct.new(:output)
|
6
|
+
|
7
|
+
def initialize(last_commit_message, output, current_revision, last_author)
|
8
|
+
@scm = DummyScm.new(last_commit_message, current_revision, last_author)
|
9
|
+
@builder = DummyBuilder.new(output)
|
10
|
+
end
|
11
|
+
end
|
data/test/rss_publisher_test.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
require 'cerberus/publisher/rss'
|
4
|
-
require 'mock/
|
4
|
+
require 'mock/manager'
|
5
5
|
require 'tempfile'
|
6
6
|
|
7
7
|
class RSSPublisherTest < Test::Unit::TestCase
|
8
8
|
def test_publisher
|
9
9
|
rss_file = tf = Tempfile.new('cerberus-rss')
|
10
10
|
options = Cerberus::Config.new(nil, :publisher => {:rss => {:file => rss_file.path}}, :application_name => 'RSSApp')
|
11
|
-
build =
|
11
|
+
build = DummyManager.new('last message', 'this is output', 1235, 'anatol')
|
12
12
|
|
13
13
|
Cerberus::Publisher::RSS.publish(:setup, build, options)
|
14
14
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: cerberus
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2006-08-
|
6
|
+
version: 0.2.2
|
7
|
+
date: 2006-08-26 00:00:00 +04:00
|
8
8
|
summary: Cerberus is a Continuous Integration tool that could be easily run from Cron.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -60,13 +60,14 @@ files:
|
|
60
60
|
- test/irc_publisher_test.rb
|
61
61
|
- test/jabber_publisher_test.rb
|
62
62
|
- test/mail_publisher_test.rb
|
63
|
+
- test/maven2_builer_test.rb
|
63
64
|
- test/mock
|
64
65
|
- test/rss_publisher_test.rb
|
65
66
|
- test/test_helper.rb
|
66
67
|
- test/data/application.dump
|
67
|
-
- test/mock/build.rb
|
68
68
|
- test/mock/irc.rb
|
69
69
|
- test/mock/jabber4r.rb
|
70
|
+
- test/mock/manager.rb
|
70
71
|
- LICENSE
|
71
72
|
- README
|
72
73
|
- CHANGES
|
@@ -95,7 +96,7 @@ dependencies:
|
|
95
96
|
requirements:
|
96
97
|
- - ">="
|
97
98
|
- !ruby/object:Gem::Version
|
98
|
-
version: 1.2.
|
99
|
+
version: 1.2.5
|
99
100
|
version:
|
100
101
|
- !ruby/object:Gem::Dependency
|
101
102
|
name: rake
|
data/test/mock/build.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
class DummyBuild
|
2
|
-
attr_reader :output, :scm
|
3
|
-
SCM = Struct.new(:last_commit_message, :current_revision, :last_author)
|
4
|
-
|
5
|
-
def initialize(last_commit_message, output, current_revision, last_author)
|
6
|
-
@output = output
|
7
|
-
|
8
|
-
@scm = SCM.new(last_commit_message, current_revision, last_author)
|
9
|
-
end
|
10
|
-
end
|