continuous4r 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.
- 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
|