mirror of
https://github.com/odoo/runbot.git
synced 2025-03-27 05:15:45 +07:00
[IMP] runbot: various improvements
- Add a keep running flag on the build to allow a build to stay in running state until the flag is switched off ( or the build killed) - Do not update configs and config_steps data - Add a first/last_seen_build and first/last_seen_date on build.error - Children error builds now include the parent builds too - Use a notebook on build.error form view to display builds and linked errors - Update result when a build triggers a change from 'warn' to 'ko' too - Add the sticky flag on the error logs stored sql view
This commit is contained in:
parent
b7df8566e4
commit
56999ecfb4
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
<record id="runbot_build_config_step_test_base" model="runbot.build.config.step">
|
<record id="runbot_build_config_step_test_base" model="runbot.build.config.step">
|
||||||
<field name="name">base</field>
|
<field name="name">base</field>
|
||||||
<field name="install_modules">base</field>
|
<field name="install_modules">base</field>
|
||||||
@ -117,4 +118,5 @@
|
|||||||
<field name="step_order_ids" eval="[(5,0,0), (0, 0, {'step_id': ref('runbot_build_config_step_test_click_all')})]"/>
|
<field name="step_order_ids" eval="[(5,0,0), (0, 0, {'step_id': ref('runbot_build_config_step_test_click_all')})]"/>
|
||||||
<field name="protected" eval="True"/>
|
<field name="protected" eval="True"/>
|
||||||
</record>
|
</record>
|
||||||
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
@ -107,6 +107,7 @@ class runbot_build(models.Model):
|
|||||||
string='Source export path mode')
|
string='Source export path mode')
|
||||||
build_url = fields.Char('Build url', compute='_compute_build_url', store=False)
|
build_url = fields.Char('Build url', compute='_compute_build_url', store=False)
|
||||||
build_error_ids = fields.Many2many('runbot.build.error', 'runbot_build_error_ids_runbot_build_rel', string='Errors')
|
build_error_ids = fields.Many2many('runbot.build.error', 'runbot_build_error_ids_runbot_build_rel', string='Errors')
|
||||||
|
keep_running = fields.Boolean('Keep running', help='Keep running')
|
||||||
|
|
||||||
@api.depends('config_id')
|
@api.depends('config_id')
|
||||||
def _compute_log_list(self): # storing this field because it will be access trhoug repo viewn and keep track of the list at create
|
def _compute_log_list(self): # storing this field because it will be access trhoug repo viewn and keep track of the list at create
|
||||||
@ -607,9 +608,11 @@ class runbot_build(models.Model):
|
|||||||
else: # testing/running build
|
else: # testing/running build
|
||||||
if build.local_state == 'testing':
|
if build.local_state == 'testing':
|
||||||
# failfast in case of docker error (triggered in database)
|
# failfast in case of docker error (triggered in database)
|
||||||
if (not build.local_result or build.local_result == 'ok') and build.triggered_result:
|
if build.triggered_result:
|
||||||
build.local_result = build.triggered_result
|
worst_result = self._get_worst_result([build.triggered_result, build.local_result])
|
||||||
build._github_status() # failfast
|
if worst_result != build.local_result:
|
||||||
|
build.local_result = build.triggered_result
|
||||||
|
build._github_status() # failfast
|
||||||
# check if current job is finished
|
# check if current job is finished
|
||||||
if docker_is_running(build._get_docker_name()):
|
if docker_is_running(build._get_docker_name()):
|
||||||
timeout = min(build.active_step.cpu_limit, int(icp.get_param('runbot.runbot_timeout', default=10000)))
|
timeout = min(build.active_step.cpu_limit, int(icp.get_param('runbot.runbot_timeout', default=10000)))
|
||||||
|
@ -34,6 +34,10 @@ class RunbotBuildError(models.Model):
|
|||||||
child_ids = fields.One2many('runbot.build.error', 'parent_id', string='Child Errors')
|
child_ids = fields.One2many('runbot.build.error', 'parent_id', string='Child Errors')
|
||||||
children_build_ids = fields.Many2many('runbot.build', compute='_compute_children_build_ids', string='Children builds')
|
children_build_ids = fields.Many2many('runbot.build', compute='_compute_children_build_ids', string='Children builds')
|
||||||
error_history_ids = fields.One2many('runbot.build.error', compute='_compute_error_history_ids', string='Old errors')
|
error_history_ids = fields.One2many('runbot.build.error', compute='_compute_error_history_ids', string='Old errors')
|
||||||
|
first_seen_build_id = fields.Many2one('runbot.build', compute='_compute_first_seen_build_id', string='First Seen build')
|
||||||
|
first_seen_date = fields.Datetime(string='First Seen Date', related='first_seen_build_id.create_date')
|
||||||
|
last_seen_build_id = fields.Many2one('runbot.build', compute='_compute_last_seen_build_id', string='Last Seen build')
|
||||||
|
last_seen_date = fields.Datetime(string='Last Seen Date', related='last_seen_build_id.create_date')
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
@ -48,7 +52,7 @@ class RunbotBuildError(models.Model):
|
|||||||
@api.depends('build_ids')
|
@api.depends('build_ids')
|
||||||
def _compute_build_counts(self):
|
def _compute_build_counts(self):
|
||||||
for build_error in self:
|
for build_error in self:
|
||||||
build_error.build_count = len(build_error.build_ids) + len(build_error.children_build_ids)
|
build_error.build_count = len(build_error.children_build_ids)
|
||||||
|
|
||||||
@api.depends('build_ids')
|
@api.depends('build_ids')
|
||||||
def _compute_branch_ids(self):
|
def _compute_branch_ids(self):
|
||||||
@ -68,7 +72,18 @@ class RunbotBuildError(models.Model):
|
|||||||
@api.depends('child_ids')
|
@api.depends('child_ids')
|
||||||
def _compute_children_build_ids(self):
|
def _compute_children_build_ids(self):
|
||||||
for build_error in self:
|
for build_error in self:
|
||||||
build_error.children_build_ids = build_error.mapped('child_ids.build_ids')
|
all_builds = build_error.build_ids | build_error.mapped('child_ids.build_ids')
|
||||||
|
build_error.children_build_ids = all_builds.sorted(key=lambda rec: rec.id, reverse=True)
|
||||||
|
|
||||||
|
@api.depends('build_ids', 'child_ids')
|
||||||
|
def _compute_last_seen_build_id(self):
|
||||||
|
for build_error in self:
|
||||||
|
build_error.last_seen_build_id = build_error.children_build_ids and build_error.children_build_ids[0] or False
|
||||||
|
|
||||||
|
@api.depends('build_ids', 'child_ids')
|
||||||
|
def _compute_first_seen_build_id(self):
|
||||||
|
for build_error in self:
|
||||||
|
build_error.first_seen_build_id = build_error.children_build_ids and build_error.children_build_ids[-1] or False
|
||||||
|
|
||||||
@api.depends('fingerprint')
|
@api.depends('fingerprint')
|
||||||
def _compute_error_history_ids(self):
|
def _compute_error_history_ids(self):
|
||||||
|
@ -79,6 +79,7 @@ class RunbotErrorLog(models.Model):
|
|||||||
hidden = fields.Boolean(string='Hidden', readonly=True)
|
hidden = fields.Boolean(string='Hidden', readonly=True)
|
||||||
branch_id = fields.Many2one('runbot.branch', string='Branch', readonly=True)
|
branch_id = fields.Many2one('runbot.branch', string='Branch', readonly=True)
|
||||||
branch_name = fields.Char(string='Branch name', readonly=True)
|
branch_name = fields.Char(string='Branch name', readonly=True)
|
||||||
|
branch_sticky = fields.Boolean(string='Sticky', readonly=True)
|
||||||
repo_id = fields.Many2one('runbot.repo', string='Repo', readonly=True)
|
repo_id = fields.Many2one('runbot.repo', string='Repo', readonly=True)
|
||||||
repo_name = fields.Char(string='Repo name', readonly=True)
|
repo_name = fields.Char(string='Repo name', readonly=True)
|
||||||
repo_short_name = fields.Char(compute='_compute_repo_short_name', readonly=True)
|
repo_short_name = fields.Char(compute='_compute_repo_short_name', readonly=True)
|
||||||
@ -136,6 +137,7 @@ class RunbotErrorLog(models.Model):
|
|||||||
bu.hidden AS hidden,
|
bu.hidden AS hidden,
|
||||||
br.id AS branch_id,
|
br.id AS branch_id,
|
||||||
br.branch_name AS branch_name,
|
br.branch_name AS branch_name,
|
||||||
|
br.sticky AS branch_sticky,
|
||||||
re.id AS repo_id,
|
re.id AS repo_id,
|
||||||
re.name AS repo_name
|
re.name AS repo_name
|
||||||
FROM
|
FROM
|
||||||
|
@ -475,7 +475,7 @@ class runbot_repo(models.Model):
|
|||||||
pending_build._schedule()
|
pending_build._schedule()
|
||||||
|
|
||||||
# terminate and reap doomed build
|
# terminate and reap doomed build
|
||||||
build_ids = Build.search(domain_host + [('local_state', '=', 'running')], order='job_start desc').ids
|
build_ids = Build.search(domain_host + [('local_state', '=', 'running'), ('keep_running', '!=', True)], order='job_start desc').ids
|
||||||
# sort builds: the last build of each sticky branch then the rest
|
# sort builds: the last build of each sticky branch then the rest
|
||||||
sticky = {}
|
sticky = {}
|
||||||
non_sticky = []
|
non_sticky = []
|
||||||
|
@ -22,40 +22,60 @@
|
|||||||
<field name="branch_ids" widget="many2many_tags"/>
|
<field name="branch_ids" widget="many2many_tags"/>
|
||||||
<field name="repo_ids" widget="many2many_tags"/>
|
<field name="repo_ids" widget="many2many_tags"/>
|
||||||
<field name="tag_ids" widget="many2many_tags"/>
|
<field name="tag_ids" widget="many2many_tags"/>
|
||||||
|
<field name="first_seen_date"/>
|
||||||
|
<field name="first_seen_build_id"/>
|
||||||
|
<field name="last_seen_date"/>
|
||||||
|
<field name="last_seen_build_id"/>
|
||||||
</group>
|
</group>
|
||||||
<field name="build_ids" nolabel="1" widget="many2many" options="{'not_delete': True, 'no_create': True}">
|
<notebook>
|
||||||
<tree>
|
<page string="Builds">
|
||||||
<field name="create_date"/>
|
<field name="build_ids" nolabel="1" widget="many2many" options="{'not_delete': True, 'no_create': True}">
|
||||||
<field name="id"/>
|
<tree>
|
||||||
<field name="repo_id"/>
|
<field name="create_date"/>
|
||||||
<field name="branch_id"/>
|
<field name="id"/>
|
||||||
<field name="dest"/>
|
<field name="repo_id"/>
|
||||||
<field name="build_url" widget="url" readonly="1" text="View build"/>
|
<field name="branch_id"/>
|
||||||
</tree>
|
<field name="dest"/>
|
||||||
</field>
|
<field name="build_url" widget="url" readonly="1" text="View build"/>
|
||||||
<label for="children_build_ids" string="Linked errors builds"/>
|
</tree>
|
||||||
<field name="children_build_ids" widget="many2many" options="{'not_delete': True, 'no_create': True}">
|
</field>
|
||||||
<tree>
|
</page>
|
||||||
<field name="create_date"/>
|
<page string="All Errors Builds">
|
||||||
<field name="id"/>
|
<field name="children_build_ids" widget="many2many" options="{'not_delete': True, 'no_create': True}">
|
||||||
<field name="repo_id"/>
|
<tree>
|
||||||
<field name="branch_id"/>
|
<field name="create_date"/>
|
||||||
<field name="dest"/>
|
<field name="id"/>
|
||||||
<field name="build_url" widget="url" readonly="1" text="View build"/>
|
<field name="repo_id"/>
|
||||||
</tree>
|
<field name="branch_id"/>
|
||||||
</field>
|
<field name="dest"/>
|
||||||
<label for="error_history_ids" string="Error history"/>
|
<field name="build_url" widget="url" readonly="1" text="View build"/>
|
||||||
<field name="error_history_ids" widget="one2many" options="{'not_delete': True, 'no_create': True}">
|
</tree>
|
||||||
<tree>
|
</field>
|
||||||
<field name="create_date"/>
|
</page>
|
||||||
<field name="module_name"/>
|
<page string="Linked Errors">
|
||||||
<field name="summary"/>
|
<field name="child_ids" widget="many2many" options="{'not_delete': True, 'no_create': True}">
|
||||||
<field name="random"/>
|
<tree>
|
||||||
<field name="build_count"/>
|
<field name="create_date"/>
|
||||||
<field name="responsible"/>
|
<field name="module_name"/>
|
||||||
<field name="fixing_commit"/>
|
<field name="summary"/>
|
||||||
</tree>
|
<field name="build_count"/>
|
||||||
</field>
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
<page string="Error history">
|
||||||
|
<field name="error_history_ids" widget="one2many" options="{'not_delete': True, 'no_create': True}">
|
||||||
|
<tree>
|
||||||
|
<field name="create_date"/>
|
||||||
|
<field name="module_name"/>
|
||||||
|
<field name="summary"/>
|
||||||
|
<field name="random"/>
|
||||||
|
<field name="build_count"/>
|
||||||
|
<field name="responsible"/>
|
||||||
|
<field name="fixing_commit"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
</sheet>
|
</sheet>
|
||||||
<div class="oe_chatter">
|
<div class="oe_chatter">
|
||||||
<field name="message_follower_ids" widget="mail_followers"/>
|
<field name="message_follower_ids" widget="mail_followers"/>
|
||||||
@ -72,7 +92,8 @@
|
|||||||
<tree string="Errors">
|
<tree string="Errors">
|
||||||
<field name="module_name"/>
|
<field name="module_name"/>
|
||||||
<field name="summary"/>
|
<field name="summary"/>
|
||||||
<field name="random"/>
|
<field name="random" string="Random"/>
|
||||||
|
<field name="last_seen_date" string="Last Seen"/>
|
||||||
<field name="build_count"/>
|
<field name="build_count"/>
|
||||||
<field name="responsible"/>
|
<field name="responsible"/>
|
||||||
<field name="fixing_commit"/>
|
<field name="fixing_commit"/>
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
<field name="orphan_result" readonly="1"/>
|
<field name="orphan_result" readonly="1"/>
|
||||||
<field name="hidden" groups="base.group_no_one"/>
|
<field name="hidden" groups="base.group_no_one"/>
|
||||||
<field name="build_url" widget="url" readonly="1"/>
|
<field name="build_url" widget="url" readonly="1"/>
|
||||||
|
<field name="keep_running"/>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
</form>
|
</form>
|
||||||
|
@ -74,6 +74,7 @@
|
|||||||
<filter string="Failed builds" name="failed_builds" domain="[('global_state', '=', 'done'), ('global_result', '=', 'ko')]"/>
|
<filter string="Failed builds" name="failed_builds" domain="[('global_state', '=', 'done'), ('global_result', '=', 'ko')]"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter string="Master branches" name="master_branches" domain="[('branch_name', '=', 'master')]"/>
|
<filter string="Master branches" name="master_branches" domain="[('branch_name', '=', 'master')]"/>
|
||||||
|
<filter string="Sticky branches" name="sticky_branches" domain="[('branch_sticky', '=', True)]"/>
|
||||||
</search>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@ -82,7 +83,7 @@
|
|||||||
<field name="name">Error Logs</field>
|
<field name="name">Error Logs</field>
|
||||||
<field name="res_model">runbot.error.log</field>
|
<field name="res_model">runbot.error.log</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
<field name="context">{'search_default_master_branches': True, 'search_default_failed_builds': True}</field>
|
<field name="context">{'search_default_sticky_branches': True, 'search_default_failed_builds': True}</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
|
Loading…
Reference in New Issue
Block a user