[IMP] runbot: cross project trigger

Allow to create a trigger without project, that execute for every
project. In this case the repos are all the repo of the project
that where updated.

This is mainly for psxrunbot.

Also allows to create a trigger that cross category
This commit is contained in:
Xavier-Do 2022-12-08 14:38:20 +01:00
parent a563fcf907
commit 1b3e79447b
4 changed files with 12 additions and 4 deletions

View File

@ -162,8 +162,9 @@ class Batch(models.Model):
_logger.error('No dockerfile found !') _logger.error('No dockerfile found !')
triggers = self.env['runbot.trigger'].search([ # could be optimised for multiple batches. Ormcached method? triggers = self.env['runbot.trigger'].search([ # could be optimised for multiple batches. Ormcached method?
('project_id', '=', project.id), ('category_id', 'in', [False, self.category_id.id]),
('category_id', '=', self.category_id.id) ('project_id', 'in', [project.id, False] if project.enable_base_triggers else [project.id]),
('project_id', '=', False),
]).filtered( ]).filtered(
lambda t: not t.version_domain or \ lambda t: not t.version_domain or \
self.bundle_id.version_id.filtered_domain(t.get_version_domain()) self.bundle_id.version_id.filtered_domain(t.get_version_domain())
@ -172,6 +173,8 @@ class Batch(models.Model):
pushed_repo = self.commit_link_ids.mapped('commit_id.repo_id') pushed_repo = self.commit_link_ids.mapped('commit_id.repo_id')
dependency_repos = triggers.mapped('dependency_ids') dependency_repos = triggers.mapped('dependency_ids')
all_repos = triggers.mapped('repo_ids') | dependency_repos all_repos = triggers.mapped('repo_ids') | dependency_repos
if any(not trigger.project_id for trigger in triggers):
all_repos |= project.repo_ids
missing_repos = all_repos - pushed_repo missing_repos = all_repos - pushed_repo
###################################### ######################################
@ -298,6 +301,8 @@ class Batch(models.Model):
for trigger in triggers: for trigger in triggers:
trigger_custom = trigger_customs.get(trigger, self.env['runbot.bundle.trigger.custom']) trigger_custom = trigger_customs.get(trigger, self.env['runbot.bundle.trigger.custom'])
trigger_repos = trigger.repo_ids | trigger.dependency_ids trigger_repos = trigger.repo_ids | trigger.dependency_ids
if not trigger.project_id:
trigger_repos |= project.repo_ids
if trigger_repos & missing_repos: if trigger_repos & missing_repos:
self.warning('Missing commit for repo %s for trigger %s', (trigger_repos & missing_repos).mapped('name'), trigger.name) self.warning('Missing commit for repo %s for trigger %s', (trigger_repos & missing_repos).mapped('name'), trigger.name)
continue continue
@ -306,7 +311,7 @@ class Batch(models.Model):
extra_params = trigger_custom.extra_params or '' extra_params = trigger_custom.extra_params or ''
config_data = trigger_custom.config_data or {} config_data = trigger_custom.config_data or {}
params_value = { params_value = {
'version_id': version_id, 'version_id': version_id,
'extra_params': extra_params, 'extra_params': extra_params,
'config_id': config.id, 'config_id': config.id,
'project_id': project_id, 'project_id': project_id,

View File

@ -12,6 +12,7 @@ class Project(models.Model):
trigger_ids = fields.One2many('runbot.trigger', 'project_id', string='Triggers') trigger_ids = fields.One2many('runbot.trigger', 'project_id', string='Triggers')
dockerfile_id = fields.Many2one('runbot.dockerfile', index=True, help="Project Default Dockerfile") dockerfile_id = fields.Many2one('runbot.dockerfile', index=True, help="Project Default Dockerfile")
repo_ids = fields.One2many('runbot.repo', 'project_id', string='Repos') repo_ids = fields.One2many('runbot.repo', 'project_id', string='Repos')
enable_base_triggers = fields.Boolean('Enable base triggers', default=True)
sequence = fields.Integer('Sequence') sequence = fields.Integer('Sequence')

View File

@ -38,7 +38,7 @@ class Trigger(models.Model):
sequence = fields.Integer('Sequence') sequence = fields.Integer('Sequence')
name = fields.Char("Name") name = fields.Char("Name")
description = fields.Char("Description", help="Informative description") description = fields.Char("Description", help="Informative description")
project_id = fields.Many2one('runbot.project', string="Project id", required=True) # main/security/runbot project_id = fields.Many2one('runbot.project', string="Project id", default=lambda self: self.env.ref('runbot.main_project'))
repo_ids = fields.Many2many('runbot.repo', relation='runbot_trigger_triggers', string="Triggers", domain="[('project_id', '=', project_id)]") repo_ids = fields.Many2many('runbot.repo', relation='runbot_trigger_triggers', string="Triggers", domain="[('project_id', '=', project_id)]")
dependency_ids = fields.Many2many('runbot.repo', relation='runbot_trigger_dependencies', string="Dependencies") dependency_ids = fields.Many2many('runbot.repo', relation='runbot_trigger_dependencies', string="Dependencies")
config_id = fields.Many2one('runbot.build.config', string="Config", required=True) config_id = fields.Many2one('runbot.build.config', string="Config", required=True)

View File

@ -8,6 +8,7 @@
<group> <group>
<field name="name"/> <field name="name"/>
<field name="keep_sticky_running"/> <field name="keep_sticky_running"/>
<field name="enable_base_triggers"/>
<field name="dockerfile_id"/> <field name="dockerfile_id"/>
<field name="group_ids"/> <field name="group_ids"/>
<field name="trigger_ids"/> <field name="trigger_ids"/>
@ -23,6 +24,7 @@
<tree string="Projects"> <tree string="Projects">
<field name="name"/> <field name="name"/>
<field name="keep_sticky_running"/> <field name="keep_sticky_running"/>
<field name="enable_base_triggers"/>
<field name="dockerfile_id"/> <field name="dockerfile_id"/>
<field name="group_ids"/> <field name="group_ids"/>
<field name="trigger_ids"/> <field name="trigger_ids"/>