[IMP] display duplicate builds

This commit is contained in:
Gery Debongnie 2014-07-18 12:09:01 +02:00
parent 40a1d8010b
commit 0c8ddf2a0d
2 changed files with 76 additions and 59 deletions

View File

@ -307,7 +307,6 @@ class runbot_repo(osv.osv):
pending_ids = Build.search(cr, uid, domain + [('state', '=', 'pending')], order="sequence", limit=1)
pending_build = Build.browse(cr, uid, pending_ids[0])
print 'scheduling build', pending_build
pending_build.schedule()
# compute the number of testing and pending jobs again
@ -425,14 +424,14 @@ class runbot_build(osv.osv):
return r
def _get_domain(self, cr, uid, ids, field_name, arg, context=None):
r = {}
result = {}
domain = self.pool['runbot.repo'].domain(cr, uid)
for build in self.browse(cr, uid, ids, context=context):
if build.repo_id.nginx:
r[build.id] = "%s.%s" % (build.dest, domain)
result[build.id] = "%s.%s" % (build.dest, domain)
else:
r[build.id] = "%s:%s" % (domain, build.port)
return r
result[build.id] = "%s:%s" % (domain, build.port)
return result
_columns = {
'branch_id': fields.many2one('runbot.branch', 'Branch', required=True, ondelete='cascade'),
@ -885,7 +884,6 @@ class RunbotController(http.Controller):
context = {
'repos': repos,
'repo': repo,
's2h': s2human,
'workers': icp.get_param(cr, uid, 'runbot.workers', default=6),
'running_max': icp.get_param(cr, uid, 'runbot.running_max', default=75),
'pending_total': build_obj.search_count(cr, uid, [('state','=','pending')]),
@ -918,10 +916,29 @@ class RunbotController(http.Controller):
build_ids = flatten(build_by_branch_ids.values())
build_dict = {build.id: build for build in build_obj.browse(cr, uid, build_ids, context=request.context) }
def build_info(build):
real_build = build.duplicate_id if build.state == 'duplicate' else build
return {
'id': build.id,
'name': build.name,
'state': real_build.state,
'result': real_build.result,
'subject': build.subject,
'author': build.author,
'dest': build.dest,
'real_dest': real_build.dest,
'job_age': s2human(real_build.job_age),
'job_time': s2human(real_build.job_time),
'job': real_build.job,
'domain': real_build.domain,
'port': real_build.port,
'subject': build.subject,
}
def branch_info(branch):
return {
'branch': branch,
'builds': [build_dict[build_id] for build_id in build_by_branch_ids[branch.id]]
'builds': [build_info(build_dict[build_id]) for build_id in build_by_branch_ids[branch.id]]
}
context.update({
@ -955,18 +972,18 @@ class RunbotController(http.Controller):
logging_ids = registry['ir.logging'].search(cr, uid, domain)
logs = registry['ir.logging'].browse(cr, uid, logging_ids)
v = self.common(cr, uid)
#v['type'] = type
#v['level'] = level
v['build'] = build
v['other_builds'] = other_builds
v['logs'] = logs
return request.render("runbot.build", v)
context = self.common(cr, uid)
#context['type'] = type
#context['level'] = level
context['build'] = build
context['other_builds'] = other_builds
context['logs'] = logs
return request.render("runbot.build", context)
@http.route(['/runbot/build/<build_id>/force'], type='http', auth="public", website=True)
def build_force(self, build_id, **post):
registry, cr, uid, context = request.registry, request.cr, 1, request.context
repo_id = registry['runbot.build'].force(cr, 1, [int(build_id)])
repo_id = registry['runbot.build'].force(cr, uid, [int(build_id)])
return werkzeug.utils.redirect('/runbot/repo/%s' % repo_id)
@http.route(['/runbot/build/<build_id>/label/<label_id>'], type='http', auth="public", method='POST')

View File

@ -208,50 +208,50 @@
<!-- Templates -->
<template id="runbot.build_name">
<t t-if="bu.state=='pending'"><i class="text-default fa fa-pause"/> pending</t>
<t t-if="bu.state=='testing'"><i class="text-info fa fa-spinner"/> testing <t t-esc="bu.job[4:]"/> <small><t t-esc="s2h(bu.job_time)"/></small></t>
<t t-if="bu.result=='ok'"><i class="text-success fa fa-thumbs-up"/><small> age <t t-esc="s2h(bu.job_age)"/> time <t t-esc="s2h(bu.job_time)"/></small></t>
<t t-if="bu.result=='ko'"><i class="text-danger fa fa-thumbs-down"/><small> age <t t-esc="s2h(bu.job_age)"/> time <t t-esc="s2h(bu.job_time)"/></small></t>
<t t-if="bu.result=='warn'"><i class="text-warning fa fa-warning"/><small> age <t t-esc="s2h(bu.job_age)"/> time <t t-esc="s2h(bu.job_time)"/></small></t>
<t t-if="bu.result=='skipped'"><i class="text-danger fa fa-ban"/> skipped</t>
<t t-if="bu.result=='killed'"><i class="text-danger fa fa-times"/> killed</t>
<t t-if="bu['state']=='pending'"><i class="text-default fa fa-pause"/> pending</t>
<t t-if="bu['state']=='testing'"><i class="text-info fa fa-spinner"/> testing <t t-esc="bu['job']"/> <small><t t-esc="bu['job_time']"/></small></t>
<t t-if="bu['result']=='ok'"><i class="text-success fa fa-thumbs-up"/><small> age <t t-esc="bu['job_age']"/> time <t t-esc="bu['job_time']"/></small></t>
<t t-if="bu['result']=='ko'"><i class="text-danger fa fa-thumbs-down"/><small> age <t t-esc="bu['job_age']"/> time <t t-esc="bu['job_time']"/></small></t>
<t t-if="bu['result']=='warn'"><i class="text-warning fa fa-warning"/><small> age <t t-esc="bu['job_age']"/> time <t t-esc="bu['job_time']"/></small></t>
<t t-if="bu['result']=='skipped'"><i class="text-danger fa fa-ban"/> skipped</t>
<t t-if="bu['result']=='killed'"><i class="text-danger fa fa-times"/> killed</t>
</template>
<template id="runbot.build_button">
<div t-attf-class="btn-group {{klass}} pull-right">
<div t-attf-class="btn-group {{klass}}">
<a t-if="bu.state=='running'" t-attf-href="http://{{bu.domain}}/?db={{bu.dest}}-all" class="btn btn-primary"><i class="fa fa-sign-in"/></a>
<a t-attf-href="/runbot/build/{{bu.id}}" class="btn btn-default"><i class="fa fa-file-text-o"/></a>
<a t-attf-href="https://#{bu.repo_id.base}/commit/#{bu.name}" class="btn btn-default"><i class="fa fa-github"/></a>
<a t-if="bu['state']=='running'" t-attf-href="http://{{bu['domain']}}/?db={{bu['dest']}}-all" class="btn btn-primary"><i class="fa fa-sign-in"/></a>
<a t-attf-href="/runbot/build/{{bu['id']}}" class="btn btn-default"><i class="fa fa-file-text-o"/></a>
<a t-attf-href="https://#{repo.base}/commit/#{bu['name']}" class="btn btn-default"><i class="fa fa-github"/></a>
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown"><i class="fa fa-cog"/><span class="caret"></span></button>
<ul class="dropdown-menu" role="menu">
<li t-if="bu.result=='skipped'">
<a t-attf-href="/runbot/build/{{bu.id}}/force">Force Build<i class="fa fa-level-up"> </i></a>
<li t-if="bu['result']=='skipped'">
<a t-attf-href="/runbot/build/{{bu['id']}}/force">Force Build<i class="fa fa-level-up"> </i></a>
</li>
<t t-if="bu.state=='running'">
<li><a t-attf-href="http://{{bu.domain}}/?db={{bu.dest}}-all">Connect all <i class="fa fa-sign-in"></i></a></li>
<li><a t-attf-href="http://{{bu.domain}}/?db={{bu.dest}}-base">Connect base <i class="fa fa-sign-in"></i></a></li>
<li><a t-attf-href="http://{{bu.domain}}/">Connect <i class="fa fa-sign-in"></i></a></li>
<t t-if="bu['state']=='running'">
<li><a t-attf-href="http://{{bu['domain']}}/?db={{bu['real_dest']}}-all">Connect all <i class="fa fa-sign-in"></i></a></li>
<li><a t-attf-href="http://{{bu['domain']}}/?db={{bu['real_dest']}}-base">Connect base <i class="fa fa-sign-in"></i></a></li>
<li><a t-attf-href="http://{{bu['domain']}}/">Connect <i class="fa fa-sign-in"></i></a></li>
</t>
<li t-if="bu.state in ['done','running'] and bu_index==0">
<a t-attf-href="/runbot/build/#{bu.id}/force">Rebuild <i class="fa fa-refresh"/></a>
<li t-if="bu['state'] in ['done','running'] and bu_index==0">
<a t-attf-href="/runbot/build/#{bu['id']}/force">Rebuild <i class="fa fa-refresh"/></a>
</li>
<li t-if="bu.state!='testing' and bu.state!='pending'" class="divider"></li>
<li><a t-attf-href="/runbot/build/{{bu.id}}">Logs <i class="fa fa-file-text-o"/></a></li>
<li><a t-attf-href="/runbot/static/build/#{bu.dest}/logs/job_10_test_base.txt">Full base logs <i class="fa fa-file-text-o"/></a></li>
<li><a t-attf-href="/runbot/static/build/#{bu.dest}/logs/job_20_test_all.txt">Full all logs <i class="fa fa-file-text-o"/></a></li>
<li t-if="bu.state!='pending'" class="divider"></li>
<li><a t-attf-href="{{bu.branch_id.branch_url}}">Branch or pull <i class="fa fa-github"/></a></li>
<li><a t-attf-href="https://{{bu.repo_id.base}}/commit/{{bu.name}}">Commit <i class="fa fa-github"/></a></li>
<li><a t-attf-href="https://{{bu.repo_id.base}}/compare/{{bu.branch_id.branch_name}}">Compare <i class="fa fa-github"/></a></li>
<li t-if="bu['state']!='testing' and bu['state']!='pending'" class="divider"></li>
<li><a t-attf-href="/runbot/build/{{bu['id']}}">Logs <i class="fa fa-file-text-o"/></a></li>
<li><a t-attf-href="/runbot/static/build/#{bu['real_dest']}/logs/job_10_test_base.txt">Full base logs <i class="fa fa-file-text-o"/></a></li>
<li><a t-attf-href="/runbot/static/build/#{bu['real_dest']}/logs/job_20_test_all.txt">Full all logs <i class="fa fa-file-text-o"/></a></li>
<li t-if="bu['state']!='pending'" class="divider"></li>
<li><a t-attf-href="{{br['branch'].branch_url}}">Branch or pull <i class="fa fa-github"/></a></li>
<li><a t-attf-href="https://{{repo.base}}/commit/{{bu['name']}}">Commit <i class="fa fa-github"/></a></li>
<li><a t-attf-href="https://{{repo.base}}/compare/{{br['branch'].branch_name}}">Compare <i class="fa fa-github"/></a></li>
<!-- TODO branch.pull from -->
<li class="divider"></li>
<li><a t-attf-href="#" t-attf-onclick="$.post('/runbot/build/{{bu.id}}/label/1')">Toggle RDWIP label</a></li>
<li><a t-attf-href="#" t-attf-onclick="$.post('/runbot/build/{{bu.id}}/label/2')">Toggle OE label</a></li>
<li><a t-attf-href="#" t-attf-onclick="$.post('/runbot/build/{{bu['id']}}/label/1')">Toggle RDWIP label</a></li>
<li><a t-attf-href="#" t-attf-onclick="$.post('/runbot/build/{{bu['id']}}/label/2')">Toggle OE label</a></li>
<li class="divider"></li>
<li class="disabled"><a href="#">Runtime: <t t-esc="bu.job_time"/>s</a></li>
<li class="disabled"><a href="#">Port: <t t-esc="bu.port"/></a></li>
<li class="disabled"><a href="#">Age: <t t-esc="s2h(bu.job_age)"/></a></li>
<li class="disabled"><a href="#">Runtime: <t t-esc="bu['job_time']"/>s</a></li>
<li class="disabled"><a href="#">Port: <t t-esc="bu['port']"/></a></li>
<li class="disabled"><a href="#">Age: <t t-esc="bu['job_age']"/></a></li>
</ul>
</div>
</div>
@ -352,29 +352,29 @@
<td>
<i t-if="br['branch'].sticky" class="fa fa-star"/>
<b t-esc="br['branch'].branch_name"/>
<small><t t-esc="s2h(br['builds'][0].job_age)"/></small><br/>
<small><t t-esc="br['builds'][0]['job_age']"/></small><br/>
<div class="btn-group btn-group-xs">
<a t-attf-href="{{br['branch'].branch_url}}" class="btn btn-default btn-xs">Branch or pull <i class="fa fa-github"/></a>
</div>
</td>
<t t-foreach="br['builds']" t-as="bu">
<t t-if="bu.state=='pending'"><t t-set="klass">default</t></t>
<t t-if="bu.state=='testing'"><t t-set="klass">info</t></t>
<t t-if="bu.state in ['running','done'] and bu.result == 'ko'"><t t-set="klass">danger</t></t>
<t t-if="bu.state in ['running','done'] and bu.result == 'warn'"><t t-set="klass">warning</t></t>
<t t-if="bu.state in ['running','done'] and bu.result == 'ok'"><t t-set="klass">success</t></t>
<t t-if="bu.state in ['running','done'] and bu.result == 'skipped'"><t t-set="klass">default</t></t>
<t t-if="bu.state in ['running','done'] and bu.result == 'killed'"><t t-set="klass">killed</t></t>
<t t-if="bu['state']=='pending'"><t t-set="klass">default</t></t>
<t t-if="bu['state']=='testing'"><t t-set="klass">info</t></t>
<t t-if="bu['state'] in ['running','done'] and bu['result'] == 'ko'"><t t-set="klass">danger</t></t>
<t t-if="bu['state'] in ['running','done'] and bu['result'] == 'warn'"><t t-set="klass">warning</t></t>
<t t-if="bu['state'] in ['running','done'] and bu['result'] == 'ok'"><t t-set="klass">success</t></t>
<t t-if="bu['state'] in ['running','done'] and bu['result'] == 'skipped'"><t t-set="klass">default</t></t>
<t t-if="bu['state'] in ['running','done'] and bu['result'] == 'killed'"><t t-set="klass">killed</t></t>
<td t-attf-class="{{klass}}">
<t t-call="runbot.build_button"><t t-set="klass">btn-group-sm</t></t>
<t t-if="bu.subject">
<span t-esc="bu.subject[:32] + ('...' if bu.subject[32:] else '') " t-att-title="bu.subject"/>
<t t-if="bu['subject']">
<span t-esc="bu['subject'][:32] + ('...' if bu['subject'][32:] else '') " t-att-title="bu['subject']"/>
<br/>
</t>
<t t-id="bu.author">
<t t-esc="bu.author"/><br/>
<t t-id="bu['author']">
<t t-esc="bu['author']"/><br/>
</t>
<small><t t-esc="bu.dest"/></small><br/>
<small><t t-esc="bu['dest']"/></small><br/>
<t t-call="runbot.build_name"/>
</td>
</t>