continuous4r 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +83 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/lib/capistrano_formatter.rb +19 -0
- data/lib/continuous4r/version.rb +9 -0
- data/lib/continuous4r.rb +490 -0
- data/lib/flog_formatter.rb +48 -0
- data/lib/heckle_formatter.rb +27 -0
- data/lib/httperf_formatter.rb +160 -0
- data/lib/site/body-capistrano.rhtml +8 -0
- data/lib/site/body-changelog.rhtml +8 -0
- data/lib/site/body-continuous4r-reports.rhtml +83 -0
- data/lib/site/body-dcov.rhtml +27 -0
- data/lib/site/body-dependencies.rhtml +52 -0
- data/lib/site/body-flog.rhtml +15 -0
- data/lib/site/body-heckle.rhtml +16 -0
- data/lib/site/body-httperf.rhtml +8 -0
- data/lib/site/body-index.rhtml +71 -0
- data/lib/site/body-issue-tracking.rhtml +38 -0
- data/lib/site/body-kwala.rhtml +35 -0
- data/lib/site/body-railroad.rhtml +29 -0
- data/lib/site/body-rcov.rhtml +23 -0
- data/lib/site/body-rdoc.rhtml +12 -0
- data/lib/site/body-scm-usage.rhtml +37 -0
- data/lib/site/body-stats.rhtml +8 -0
- data/lib/site/body-team-list.rhtml +73 -0
- data/lib/site/body-tests.rhtml +8 -0
- data/lib/site/body-zentest.rhtml +8 -0
- data/lib/site/header.rhtml +41 -0
- data/lib/site/images/continuous4r-logo.png +0 -0
- data/lib/site/images/external.png +0 -0
- data/lib/site/images/icon_error_sml.gif +0 -0
- data/lib/site/images/icon_success_sml.gif +0 -0
- data/lib/site/images/newwindow.png +0 -0
- data/lib/site/menu-capistrano.rhtml +23 -0
- data/lib/site/menu-changelog.rhtml +23 -0
- data/lib/site/menu-continuous4r-reports.rhtml +31 -0
- data/lib/site/menu-dcov.rhtml +23 -0
- data/lib/site/menu-dependencies.rhtml +19 -0
- data/lib/site/menu-flog.rhtml +23 -0
- data/lib/site/menu-heckle.rhtml +23 -0
- data/lib/site/menu-httperf.rhtml +23 -0
- data/lib/site/menu-index.rhtml +19 -0
- data/lib/site/menu-issue-tracking.rhtml +19 -0
- data/lib/site/menu-kwala.rhtml +23 -0
- data/lib/site/menu-railroad.rhtml +23 -0
- data/lib/site/menu-rcov.rhtml +23 -0
- data/lib/site/menu-rdoc.rhtml +23 -0
- data/lib/site/menu-scm-usage.rhtml +19 -0
- data/lib/site/menu-stats.rhtml +23 -0
- data/lib/site/menu-team-list.rhtml +19 -0
- data/lib/site/menu-tests.rhtml +23 -0
- data/lib/site/menu-zentest.rhtml +23 -0
- data/lib/site/style/commons-maven.css +113 -0
- data/lib/site/style/maven-base.css +151 -0
- data/lib/site/style/maven-theme.css +100 -0
- data/lib/site/style/project.css +1 -0
- data/lib/stats_formatter.rb +51 -0
- data/lib/subversion_extractor.rb +64 -0
- data/lib/tests_formatter.rb +65 -0
- data/lib/zen_test_formatter.rb +48 -0
- data/log/debug.log +0 -0
- data/script/destroy +14 -0
- data/script/destroy.cmd +1 -0
- data/script/generate +14 -0
- data/script/generate.cmd +1 -0
- data/script/txt2html +74 -0
- data/script/txt2html.cmd +1 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/test_continuous4r.rb +11 -0
- data/test/test_helper.rb +2 -0
- data/website/index.html +411 -0
- data/website/index.txt +298 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +141 -0
data/lib/continuous4r.rb
ADDED
@@ -0,0 +1,490 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'XmlElements'
|
5
|
+
require 'date'
|
6
|
+
require 'capistrano_formatter.rb'
|
7
|
+
require 'heckle_formatter.rb'
|
8
|
+
require 'httperf_formatter.rb'
|
9
|
+
require 'stats_formatter.rb'
|
10
|
+
require 'tests_formatter.rb'
|
11
|
+
require 'zen_test_formatter.rb'
|
12
|
+
require 'subversion_extractor.rb'
|
13
|
+
|
14
|
+
# ==============================================================================
|
15
|
+
# Classe modelisant un fichier de description de projet Ruby/Rails
|
16
|
+
# Author:: Vincent Dubois
|
17
|
+
# Date : 03 decembre 2007
|
18
|
+
# ==============================================================================
|
19
|
+
module Continuous4r
|
20
|
+
|
21
|
+
# Support de CruiseControl.rb
|
22
|
+
WORK_DIR = "#{ENV['CC_BUILD_ARTIFACTS'].nil? ? "continuous4r_build" : "#{ENV['CC_BUILD_ARTIFACTS']}/continuous4r_build"}"
|
23
|
+
|
24
|
+
# Methode de generation du site au complet
|
25
|
+
def self.generate_site
|
26
|
+
project = XmlElements.fromString(File.read("#{RAILS_ROOT}/continuous4r-project.xml"))
|
27
|
+
generation_date = DateTime.now
|
28
|
+
puts "====================================================================="
|
29
|
+
puts " Continuous Integration for Ruby, starting website generation..."
|
30
|
+
puts "---------------------------------------------------------------------"
|
31
|
+
puts " Project name : #{project['name']}"
|
32
|
+
puts " Project URL : #{project.url.text}"
|
33
|
+
puts " Generation date : #{generation_date}"
|
34
|
+
puts "---------------------------------------------------------------------"
|
35
|
+
|
36
|
+
# Vérification de présence et de la version de Rubygems
|
37
|
+
puts " Checking presence and version of RubyGems..."
|
38
|
+
rubygems_version = `gem --version`
|
39
|
+
if rubygems_version.empty?
|
40
|
+
raise " You don't seem to have RubyGems installed, please go first to http://rubygems.rubyforge.org"
|
41
|
+
end
|
42
|
+
|
43
|
+
# Vérification de la présence d'eRuby
|
44
|
+
puts " Checking presence of eRuby for website build..."
|
45
|
+
eruby_version = `eruby --version`
|
46
|
+
if eruby_version.empty?
|
47
|
+
raise " You don't seem to have eRuby installed, please go first to http://www.eruby.info/"
|
48
|
+
end
|
49
|
+
|
50
|
+
# Verification de la presence d'hpricot
|
51
|
+
hpricot_version = `gem list|grep hpricot`
|
52
|
+
if hpricot_version.empty?
|
53
|
+
puts " Installing Hpricot..."
|
54
|
+
hpricot_installed = system("sudo gem install hpricot")
|
55
|
+
if !hpricot_installed
|
56
|
+
raise " Install for Hpricot failed with command 'sudo gem install hpricot'\n BUILD FAILED."
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Chargement/Vérification des gems nécessaires à l'application
|
61
|
+
puts " Checking gems for this project, please hold on..."
|
62
|
+
project.gems.each('gem') do |gem|
|
63
|
+
puts " Checking for #{gem['name']} gem, version #{gem['version']}..."
|
64
|
+
gem_version = `gem list|grep #{gem['name']}`
|
65
|
+
if gem_version.empty? or gem_version.index("#{gem['version']}").nil?
|
66
|
+
gem_installed = `gem install #{gem['name']} --version #{gem['version']} 2>&1`
|
67
|
+
if !gem_installed.index("ERROR").nil?
|
68
|
+
raise " Unable to install #{gem['name']} gem with version #{gem['version']}.\n BUILD FAILED."
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
puts "---------------------------------------------------------------------"
|
74
|
+
# Création du répertoire de travail
|
75
|
+
if File.exist? "#{WORK_DIR}"
|
76
|
+
`rm -Rf #{WORK_DIR}`
|
77
|
+
end
|
78
|
+
Dir.mkdir "#{WORK_DIR}"
|
79
|
+
|
80
|
+
auto_install = project.tasks['autoinstall']
|
81
|
+
auto_install ||= "false"
|
82
|
+
|
83
|
+
# Construction des taches
|
84
|
+
begin
|
85
|
+
project.tasks.each('task') do |task|
|
86
|
+
self.build_task task, project['name'], project.scm, auto_install
|
87
|
+
puts "\n---------------------------------------------------------------------"
|
88
|
+
end
|
89
|
+
puts " All tasks done."
|
90
|
+
rescue Exception => e
|
91
|
+
if e.to_s == "no childs named 'task' found!"
|
92
|
+
puts " No task to build."
|
93
|
+
else
|
94
|
+
raise e
|
95
|
+
end
|
96
|
+
end
|
97
|
+
puts "\n---------------------------------------------------------------------"
|
98
|
+
# On copie les feuilles de styles
|
99
|
+
`cp -R #{File.dirname(__FILE__)}/site/style/ #{WORK_DIR}/`
|
100
|
+
# On copie les images
|
101
|
+
`cp -R #{File.dirname(__FILE__)}/site/images/ #{WORK_DIR}/`
|
102
|
+
`cp #{File.dirname(__FILE__)}/site/images/continuous4r-logo.png #{WORK_DIR}/`
|
103
|
+
puts " Building project information page..."
|
104
|
+
eruby_run "index"
|
105
|
+
puts " Building team list page..."
|
106
|
+
eruby_run "team-list"
|
107
|
+
puts " Building project dependencies page..."
|
108
|
+
eruby_run "dependencies"
|
109
|
+
puts " Building source control management page..."
|
110
|
+
eruby_run "scm-usage"
|
111
|
+
puts " Building issue tracking page..."
|
112
|
+
eruby_run "issue-tracking"
|
113
|
+
puts " Building project reports page..."
|
114
|
+
eruby_run "continuous4r-reports"
|
115
|
+
begin
|
116
|
+
project.tasks.each('task') do |task|
|
117
|
+
puts " Building #{task['name']} page..."
|
118
|
+
eruby_run task['name']
|
119
|
+
end
|
120
|
+
rescue Exception => e
|
121
|
+
unless e.to_s == "no childs named 'task' found!"
|
122
|
+
raise e
|
123
|
+
end
|
124
|
+
end
|
125
|
+
puts "\n BUILD SUCCESSFUL."
|
126
|
+
puts "====================================================================="
|
127
|
+
end
|
128
|
+
|
129
|
+
# Methode qui permet de construire une tache de nom donne
|
130
|
+
def self.build_task task, project_name, scm, auto_install
|
131
|
+
case task['name']
|
132
|
+
# ==========================================================================
|
133
|
+
# Construction de la tache dcov (couverture rdoc)
|
134
|
+
# ==========================================================================
|
135
|
+
when 'dcov'
|
136
|
+
# On verifie la presence de dcov
|
137
|
+
dcov_version = `gem list|grep dcov`
|
138
|
+
if dcov_version.empty?
|
139
|
+
if auto_install == "true"
|
140
|
+
puts " Installing dcov..."
|
141
|
+
dcov_installed = system("sudo gem install dcov")
|
142
|
+
if !dcov_installed
|
143
|
+
raise " Install for dcov failed with command 'sudo gem install dcov'\n BUILD FAILED."
|
144
|
+
end
|
145
|
+
else
|
146
|
+
raise " You don't seem to have dcov installed. You can install it with 'gem install dcov'.\n BUILD FAILED."
|
147
|
+
end
|
148
|
+
end
|
149
|
+
# On lance la generation
|
150
|
+
puts " Building dcov rdoc coverage report..."
|
151
|
+
dcov_pass = system("dcov -p #{task.params.pattern['value']}")
|
152
|
+
if !dcov_pass
|
153
|
+
raise " Execution of dcov failed with command 'dcov -p #{task.params.pattern['value']}'.\n BUILD FAILED."
|
154
|
+
end
|
155
|
+
# ==========================================================================
|
156
|
+
# Construction de la tache rcov (couverture des tests sur le code)
|
157
|
+
# ==========================================================================
|
158
|
+
when 'rcov'
|
159
|
+
# On verifie la presence de rcov
|
160
|
+
rcov_version = `gem list|grep rcov`
|
161
|
+
if rcov_version.empty?
|
162
|
+
if auto_install == "true"
|
163
|
+
puts " Installing rcov..."
|
164
|
+
rcov_installed = system("sudo gem install rcov")
|
165
|
+
if !rcov_installed
|
166
|
+
raise " Install for rcov failed with command 'sudo gem install rcov'\n BUILD FAILED."
|
167
|
+
end
|
168
|
+
else
|
169
|
+
raise " You don't seem to have rcov installed. You can install it with 'gem install rcov'.\n BUILD FAILED."
|
170
|
+
end
|
171
|
+
end
|
172
|
+
# On lance la generation
|
173
|
+
puts " Building rcov code coverage report..."
|
174
|
+
rcov_pass = system("rcov --rails --exclude rcov,rubyforge #{task.params.file['path']}")
|
175
|
+
if !rcov_pass
|
176
|
+
raise " Execution of rcov failed with command 'rcov --rails --exclude rcov,rubyforge #{task.params.file['path']}'.\n BUILD FAILED."
|
177
|
+
end
|
178
|
+
# On recupere le rapport genere
|
179
|
+
Dir.mkdir "#{WORK_DIR}/rcov"
|
180
|
+
`cp #{task.params.reports['path']}/* #{WORK_DIR}/rcov`
|
181
|
+
# ==========================================================================
|
182
|
+
# Construction de la tache rdoc (apidoc)
|
183
|
+
# ==========================================================================
|
184
|
+
when 'rdoc'
|
185
|
+
# On lance la generation
|
186
|
+
puts " Building rdoc api and rdoc generation report..."
|
187
|
+
File.delete("rdoc.log") if File.exist?("rdoc.log")
|
188
|
+
rdoc_pass = system("rake doc:reapp > rdoc.log")
|
189
|
+
if !rdoc_pass
|
190
|
+
raise " Execution of rdoc failed with command 'rake doc:reapp'.\n BUILD FAILED."
|
191
|
+
end
|
192
|
+
# On recupere la documentation et le fichier de log generes
|
193
|
+
Dir.mkdir "#{WORK_DIR}/rdoc"
|
194
|
+
`cp -R doc/app/ #{WORK_DIR}/rdoc`
|
195
|
+
`cp rdoc.log #{WORK_DIR}/rdoc`
|
196
|
+
# ==========================================================================
|
197
|
+
# Construction de la tache flog (complexite du code ruby)
|
198
|
+
# ==========================================================================
|
199
|
+
when 'flog'
|
200
|
+
# On verifie la presence de flog
|
201
|
+
flog_version = `gem list|grep flog`
|
202
|
+
if flog_version.empty?
|
203
|
+
if auto_install == "true"
|
204
|
+
puts " Installing flog..."
|
205
|
+
flog_installed = system("sudo gem install flog")
|
206
|
+
if !flog_installed
|
207
|
+
raise " Install for flog failed with command 'sudo gem install flog'\n BUILD FAILED."
|
208
|
+
end
|
209
|
+
else
|
210
|
+
raise " You don't seem to have flog installed. You can install it with 'gem install flog'.\n BUILD FAILED."
|
211
|
+
end
|
212
|
+
end
|
213
|
+
# On lance la generation
|
214
|
+
puts " Building flog code complexity analysis report..."
|
215
|
+
flog_pass = system("find app -name \\*.rb | xargs flog > flog.log")
|
216
|
+
if !flog_pass
|
217
|
+
raise " Execution of flog failed with command 'find app -name \\*.rb | xargs flog > flog.log'.\n BUILD FAILED."
|
218
|
+
end
|
219
|
+
# On recupere le fichier de log genere
|
220
|
+
Dir.mkdir "#{WORK_DIR}/flog"
|
221
|
+
`cp flog.log #{WORK_DIR}/flog`
|
222
|
+
# ==========================================================================
|
223
|
+
# Construction de la tache kwala (métriques et rapports de qualite ruby)
|
224
|
+
# ==========================================================================
|
225
|
+
when 'kwala'
|
226
|
+
# On verifie la presence de kwala
|
227
|
+
kwala_result = `kwala`
|
228
|
+
if kwala_result.empty?
|
229
|
+
raise " You don't seem to have kwala installed. please go first to http://kwala.rubyforge.org/."
|
230
|
+
end
|
231
|
+
# On lance la generation
|
232
|
+
puts " Building kwala code reports..."
|
233
|
+
actions = ""
|
234
|
+
task.params.actions.each('action') do |action|
|
235
|
+
actions = actions + " -a #{action.text}"
|
236
|
+
end
|
237
|
+
if actions.empty?
|
238
|
+
raise " You must specify at least one action for your kwala task."
|
239
|
+
end
|
240
|
+
kwala_pass = system("kwala -p #{project_name} -d . -o #{WORK_DIR}/kwala #{actions}")
|
241
|
+
if !kwala_pass
|
242
|
+
raise " Execution of kwala failed with command 'kwala -p #{project_name} -d . -o #{WORK_DIR}/kwala #{actions}'.\n BUILD FAILED."
|
243
|
+
end
|
244
|
+
# ==========================================================================
|
245
|
+
# Construction de la tache railroad (graphes modeles et controleurs)
|
246
|
+
# ==========================================================================
|
247
|
+
when 'railroad'
|
248
|
+
# On verifie la presence de railroad
|
249
|
+
railroad_version = `gem list|grep railroad`
|
250
|
+
if railroad_version.empty?
|
251
|
+
if auto_install == "true"
|
252
|
+
puts " Installing railroad..."
|
253
|
+
railroad_installed = system("sudo gem install railroad")
|
254
|
+
if !railroad_installed
|
255
|
+
raise " Install for railroad failed with command 'sudo gem install railroad'\n BUILD FAILED."
|
256
|
+
end
|
257
|
+
else
|
258
|
+
raise " You don't seem to have railroad installed. You can install it with 'gem install railroad'.\n BUILD FAILED."
|
259
|
+
end
|
260
|
+
end
|
261
|
+
# On lance la generation
|
262
|
+
puts " Building railroad graphs..."
|
263
|
+
if task.params.generate.text == "all" or task.params.generate.text == "models"
|
264
|
+
railroad_pass = system("railroad -i -a -M | dot -Tsvg > models.svg")
|
265
|
+
if !railroad_pass
|
266
|
+
raise " Execution of railroad failed with command 'railroad -i -a -M | dot -Tsvg > models.svg'.\n BUILD FAILED."
|
267
|
+
end
|
268
|
+
end
|
269
|
+
if task.params.generate.text == "all" or task.params.generate.text == "controllers"
|
270
|
+
railroad_pass = system("railroad -i -a -C | dot -Tsvg > controllers.svg")
|
271
|
+
if !railroad_pass
|
272
|
+
raise " Execution of railroad failed with command 'railroad -i -a -C | dot -Tsvg > controllers.svg'.\n BUILD FAILED."
|
273
|
+
end
|
274
|
+
end
|
275
|
+
# TODO Verifier tout ceci.
|
276
|
+
`for file in *.svg
|
277
|
+
do
|
278
|
+
/bin/mv $file $file.old
|
279
|
+
sed 's/font-size:14.00/font-size:11.00/g' < $file.old > $file
|
280
|
+
done
|
281
|
+
rm *.svg.old`
|
282
|
+
# On recupere les graphes generes
|
283
|
+
Dir.mkdir "#{WORK_DIR}/railroad"
|
284
|
+
`cp *.svg #{WORK_DIR}/railroad`
|
285
|
+
# ==========================================================================
|
286
|
+
# Construction de la tache stress (montee en charge de l'application)
|
287
|
+
# ==========================================================================
|
288
|
+
when 'httperf'
|
289
|
+
# On verifie la presence de httperf
|
290
|
+
httperf_version = `httperf --version`
|
291
|
+
if httperf_version.empty?
|
292
|
+
raise " You don't seem to have httperf installed. You can install it whith 'sudo apt-get install httperf', or go download it on http://www.hpl.hp.com/research/linux/httperf/."
|
293
|
+
end
|
294
|
+
# On verifie la presence de mongrel (on ne va pas stresser l'application
|
295
|
+
# avec webrick, tout de meme).
|
296
|
+
mongrel_version = `gem list|grep mongrel`
|
297
|
+
if mongrel_version.empty? or mongrel_version.match(/mongrel /).nil?
|
298
|
+
if auto_install == "true"
|
299
|
+
puts " Installing Mongrel..."
|
300
|
+
mongrel_installed = system("sudo gem install railroad")
|
301
|
+
if !mongrel_installed
|
302
|
+
raise " Install for Mongrel failed with command 'sudo gem install mongrel'\n BUILD FAILED."
|
303
|
+
end
|
304
|
+
else
|
305
|
+
raise " You don't seem to have mongrel installed. You can install it with 'gem install mongrel'.\n BUILD FAILED."
|
306
|
+
end
|
307
|
+
end
|
308
|
+
Dir.mkdir "#{WORK_DIR}/httperf"
|
309
|
+
# On demarre la ou les instances de mongrel
|
310
|
+
puts " Starting server instance(s) for application stressing..."
|
311
|
+
task.params.ports.each('port') do |port|
|
312
|
+
mongrel_start_log = `mongrel_rails start -e production -l #{WORK_DIR}/httperf/mongrel_#{port.text}.log -p #{port.text} -d -P log/mongrel_#{port.text}.pid`
|
313
|
+
if !mongrel_start_log.empty?
|
314
|
+
raise "BUILD FAILED."
|
315
|
+
end
|
316
|
+
end
|
317
|
+
fork { sleep(3) }
|
318
|
+
# On stresse l'application
|
319
|
+
if File.exist?("httperf.html")
|
320
|
+
File.delete("httperf.html")
|
321
|
+
end
|
322
|
+
task.params.processes.each('process') do |process|
|
323
|
+
params = ""
|
324
|
+
if !process['requests'].nil? and !process['requests'].empty?
|
325
|
+
params = params + " --num-conns=#{process['requests']}"
|
326
|
+
end
|
327
|
+
if !process['sessions'].nil? and !process['sessions'].empty?
|
328
|
+
params = params + " --wsess=#{process['sessions']}"
|
329
|
+
end
|
330
|
+
if !process['rate'].nil? and !process['rate'].empty?
|
331
|
+
params = params + " --rate=#{process['rate']}"
|
332
|
+
end
|
333
|
+
if !process['timeout'].nil? and !process['timeout'].empty?
|
334
|
+
params = params + " --timeout=#{process['timeout']}"
|
335
|
+
end
|
336
|
+
httperf_results = `httperf --port #{process['port']} --server 127.0.0.1 --uri #{process['url']}#{params}`
|
337
|
+
h = File.open("httperf.html", "a")
|
338
|
+
h.write(HttperfFormatter.new(httperf_results, process.description.text).to_html)
|
339
|
+
h.close
|
340
|
+
end
|
341
|
+
# On arrete la ou les instances de mongrel
|
342
|
+
puts "\n Stopping server instance(s)..."
|
343
|
+
task.params.ports.each('port') do |port|
|
344
|
+
puts `mongrel_rails stop -P log/mongrel_#{port.text}.pid`
|
345
|
+
end
|
346
|
+
# ==========================================================================
|
347
|
+
# Construction de la tache heckle (eprouvage des tests)
|
348
|
+
# ==========================================================================
|
349
|
+
when 'heckle'
|
350
|
+
# On verifie la presence de heckle
|
351
|
+
heckle_result = `heckle`
|
352
|
+
if heckle_result.empty?
|
353
|
+
if auto_install == "true"
|
354
|
+
puts " Installing heckle..."
|
355
|
+
heckle_installed = system("sudo gem install heckle")
|
356
|
+
if !heckle_installed
|
357
|
+
raise " Install for heckle failed with command 'sudo gem install heckle'\n BUILD FAILED."
|
358
|
+
end
|
359
|
+
else
|
360
|
+
raise " You don't seem to have heckle installed. You can install it with 'gem install heckle'.\n BUILD FAILED."
|
361
|
+
end
|
362
|
+
end
|
363
|
+
# On lance la generation
|
364
|
+
puts " Building heckle reports..."
|
365
|
+
heckle_report = File.open("heckle.html", "w")
|
366
|
+
heckle_report.write(HeckleFormatter.new(task.params).to_html)
|
367
|
+
heckle_report.close
|
368
|
+
# ==========================================================================
|
369
|
+
# Construction de la tache stats (statistiques code Ruby)
|
370
|
+
# ==========================================================================
|
371
|
+
when 'stats'
|
372
|
+
# On lance la generation
|
373
|
+
puts " Building stats report..."
|
374
|
+
stats_result = `rake stats`
|
375
|
+
stats_report = File.open("stats.html", "w")
|
376
|
+
stats_report.write(StatsFormatter.new(stats_result).to_html)
|
377
|
+
stats_report.close
|
378
|
+
# ==========================================================================
|
379
|
+
# Construction de la tache tests (tests unitaires, toutes categories)
|
380
|
+
# ==========================================================================
|
381
|
+
when 'tests'
|
382
|
+
# On lance la generation
|
383
|
+
puts " Building tests report..."
|
384
|
+
if File.exist?("tests.html")
|
385
|
+
File.delete("tests.html")
|
386
|
+
end
|
387
|
+
tests_report = File.open("tests.html", "a")
|
388
|
+
tests_report.write(TestsFormatter.new(task.params).to_html)
|
389
|
+
tests_report.close
|
390
|
+
# ==========================================================================
|
391
|
+
# Construction de la tache zentest (manques dans les tests unitaires)
|
392
|
+
# ==========================================================================
|
393
|
+
when 'zentest'
|
394
|
+
# On vérifie la presence de ZenTest
|
395
|
+
zentest_result = `zentest`
|
396
|
+
if zentest_result.empty?
|
397
|
+
if auto_install == "true"
|
398
|
+
puts " Installing ZenTest..."
|
399
|
+
zentest_installed = system("sudo gem install ZenTest")
|
400
|
+
if !zentest_installed
|
401
|
+
raise " Install for ZenTest failed with command 'sudo gem install ZenTest'.\n BUILD FAILED."
|
402
|
+
end
|
403
|
+
else
|
404
|
+
raise " You don't seem to have ZenTest installed. You can install it with 'gem install ZenTest'.\n BUILD FAILED."
|
405
|
+
end
|
406
|
+
end
|
407
|
+
# On lance la generation
|
408
|
+
puts " Building ZenTest report..."
|
409
|
+
zentest_report = File.open("zentest.html", "w")
|
410
|
+
zentest_report.write(ZenTestFormatter.new(task.params).to_html)
|
411
|
+
zentest_report.close
|
412
|
+
# ==========================================================================
|
413
|
+
# Construction de la tache capistrano (logs des deploiements effectues)
|
414
|
+
# ==========================================================================
|
415
|
+
when 'capistrano'
|
416
|
+
# On vérifie la presence de Capistrano
|
417
|
+
cap_result = `cap --version`
|
418
|
+
if cap_result.empty?
|
419
|
+
raise " You don't seem to have Capistrano installed. You can install it with 'gem install capistrano'."
|
420
|
+
end
|
421
|
+
# On lance la generation
|
422
|
+
puts " Building Capistrano log report..."
|
423
|
+
capistrano_report = File.open("capistrano.html", "w")
|
424
|
+
task.params.each('runner') do |runner|
|
425
|
+
if File.exist?("capistrano.log")
|
426
|
+
File.delete("capistrano.log")
|
427
|
+
end
|
428
|
+
capistrano_pass = system("cap #{runner['task']} 2> capistrano.log")
|
429
|
+
if !capistrano_pass
|
430
|
+
capistrano_report.close
|
431
|
+
raise(" Capistrano deployment with command \'cap #{runner['task']}\' did not pass.\n BUILD FAILED.")
|
432
|
+
else
|
433
|
+
capistrano_report.write(CapistranoFormatter.new(runner['task'],File.read("capistrano.log")).to_html)
|
434
|
+
end
|
435
|
+
end
|
436
|
+
capistrano_report.close
|
437
|
+
# ===========================================================================
|
438
|
+
# Construction de la tache changelog (changements du referentiel de sources)
|
439
|
+
# ===========================================================================
|
440
|
+
when 'changelog'
|
441
|
+
unless scm.repository_type.text == "svn"
|
442
|
+
raise " Only Subversion is supported at the moment. You need to deactivate the 'changelog' task.\n BUILD FAILED."
|
443
|
+
end
|
444
|
+
# On verifie l'existence de Subversion
|
445
|
+
svn_version = `svn --version`
|
446
|
+
if svn_version.empty?
|
447
|
+
raise " Subversion don't seem to be installed. Go see Subversion website on http://subversion.tigris.org.\n BUILD FAILED"
|
448
|
+
end
|
449
|
+
# Gestion de la derniere version
|
450
|
+
# 1 - On verifie le repertoire home/continuous4r
|
451
|
+
unless File.exist?(ENV["HOME"] + "/.continuous4r")
|
452
|
+
Dir.mkdir(ENV["HOME"] + "/.continuous4r")
|
453
|
+
end
|
454
|
+
# 2 - On verifie le numero de version
|
455
|
+
scm_current_version = scm['min_revision']
|
456
|
+
scm_current_version ||= "1"
|
457
|
+
scm_last_version = 1
|
458
|
+
if File.exist?(ENV["HOME"] + "/.continuous4r/#{project_name}_#{scm.repository_type.text}.version")
|
459
|
+
scm_current_version = File.read(ENV["HOME"] + "/.continuous4r/#{project_name}_#{scm.repository_type.text}.version")
|
460
|
+
end
|
461
|
+
# 3 - On extrait les informations du referentiel
|
462
|
+
case scm.repository_type.text
|
463
|
+
when "svn"
|
464
|
+
scm_last_version = SubversionExtractor.extract_changelog(scm_current_version.to_i,scm,"changelog.html")
|
465
|
+
end
|
466
|
+
# 4 - On ecrit le nouveau numero de revision
|
467
|
+
rev_file = File.open(ENV["HOME"] + "/.continuous4r/#{project_name}_#{scm.repository_type.text}.version","w")
|
468
|
+
rev_file.write(scm_last_version)
|
469
|
+
rev_file.close
|
470
|
+
else
|
471
|
+
raise " Don't know how to build '#{task['name']}' task."
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
# Methode qui permet de construire une page avec eruby, et de lever une exception au besoin
|
476
|
+
def self.eruby_run page
|
477
|
+
command = "eruby #{File.dirname(__FILE__)}/site/header.rhtml >> #{WORK_DIR}/#{page}.html"
|
478
|
+
if !system(command)
|
479
|
+
raise "BUILD FAILED."
|
480
|
+
end
|
481
|
+
command = "eruby #{File.dirname(__FILE__)}/site/menu-#{page}.rhtml >> #{WORK_DIR}/#{page}.html"
|
482
|
+
if !system(command)
|
483
|
+
raise "BUILD FAILED."
|
484
|
+
end
|
485
|
+
command = "eruby #{File.dirname(__FILE__)}/site/body-#{page}.rhtml >> #{WORK_DIR}/#{page}.html"
|
486
|
+
if !system(command)
|
487
|
+
raise "BUILD FAILED."
|
488
|
+
end
|
489
|
+
end
|
490
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# ================================================
|
2
|
+
# Classe de formatage de resultat renvoye par flog
|
3
|
+
# Author: Vincent Dubois
|
4
|
+
# ================================================
|
5
|
+
class FlogFormatter
|
6
|
+
attr_accessor :results
|
7
|
+
|
8
|
+
# Constructeur
|
9
|
+
def initialize results
|
10
|
+
self.results = results
|
11
|
+
end
|
12
|
+
|
13
|
+
# Methode qui permet de fabriquer le flux HTML a partir du flux console flog
|
14
|
+
def to_html
|
15
|
+
lines = self.results.split(/$/)
|
16
|
+
total_score = lines[0].split(" = ")[1]
|
17
|
+
html = "<h3>Total score : #{total_score}</h3>"
|
18
|
+
# On supprime les deux premieres lignes (total et ligne vide) et la derniere (ligne vide)
|
19
|
+
lines.delete_at(0)
|
20
|
+
lines.delete_at(0)
|
21
|
+
lines.delete_at(lines.length-1)
|
22
|
+
begin
|
23
|
+
lines.each_with_index do |line, index|
|
24
|
+
html = html + format_line(line, index)
|
25
|
+
end
|
26
|
+
rescue Exception => e
|
27
|
+
raise " Unable to format flog results. Exception is : #{e.to_s}"
|
28
|
+
end
|
29
|
+
html = html + "</tbody></table>"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Méthode qui permet de formater une ligne de resultat
|
33
|
+
def format_line line, index
|
34
|
+
html = ""
|
35
|
+
if line[1..1] != ' '
|
36
|
+
if index != 0
|
37
|
+
html = html + "</tbody></table><br/>"
|
38
|
+
end
|
39
|
+
html = html + "<table class='bodyTable'><thead><th>Element</th><th>Score</th></thead><tbody>"
|
40
|
+
total_score = line.split(': ')[1]
|
41
|
+
total_score = total_score.split(/\(|\)/)
|
42
|
+
html = html + "<tr class='#{index % 2 == 0 ? "a" : "b"}'><td><b>#{line.split(': ')[0]}</b></td><td><b>#{total_score}</b></td></tr>"
|
43
|
+
else
|
44
|
+
html = html + "<tr class='#{index % 2 == 0 ? "a" : "b"}'><td>     #{line.split(': ')[1]}</td><td>#{line.split(': ')[0]}</td></tr>"
|
45
|
+
end
|
46
|
+
return html
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'XmlElements'
|
3
|
+
# =====================================================
|
4
|
+
# Classe de formatage des resultats renvoyes par heckle
|
5
|
+
# Author: Vincent Dubois
|
6
|
+
# =====================================================
|
7
|
+
class HeckleFormatter
|
8
|
+
attr_accessor :params
|
9
|
+
|
10
|
+
# Constructeur
|
11
|
+
def initialize params
|
12
|
+
self.params = params
|
13
|
+
end
|
14
|
+
|
15
|
+
# Methode qui permet de fabriquer le flux HTML a partir des flux console heckle
|
16
|
+
def to_html
|
17
|
+
html = "<table class='bodyTable'><thead><th>Testing element</th><th>Pass</th><th>Result</th></thead><tbody>"
|
18
|
+
i = 0
|
19
|
+
self.params.each('test') do |test|
|
20
|
+
puts " Running heckle on #{test['class']} against #{test['test_pattern']}..."
|
21
|
+
pass = system("heckle #{test['class']} -t #{test['test_pattern']} > heckle.log")
|
22
|
+
html = html + "<tr class='#{ i % 2 == 0 ? 'a' : 'b'}'><td><strong>#{test['class']}</strong> against <strong>#{test['test_pattern']}</strong></td><td style='text-align: center;'><img src='images/icon_#{pass ? 'success' : 'error'}_sml.gif'/></td><td><pre>#{File.read("heckle.log")}</pre></td></tr>"
|
23
|
+
i = i + 1
|
24
|
+
end
|
25
|
+
html = html + "</tbody></table>"
|
26
|
+
end
|
27
|
+
end
|