diff --git a/runbot/models/batch.py b/runbot/models/batch.py index 63ead5e4..70a0f739 100644 --- a/runbot/models/batch.py +++ b/runbot/models/batch.py @@ -372,7 +372,7 @@ class Batch(models.Model): # in any case, search for an existing build config = trigger_custom.config_id or trigger.config_id extra_params = trigger_custom.extra_params or '' - config_data = trigger_custom.config_data or {} + config_data = dict(trigger.config_data or {}) | dict(trigger_custom.config_data or {}) params_value = { 'version_id': version_id, 'extra_params': extra_params, diff --git a/runbot/models/repo.py b/runbot/models/repo.py index 278a9be1..3fc47cff 100644 --- a/runbot/models/repo.py +++ b/runbot/models/repo.py @@ -14,6 +14,7 @@ from pathlib import Path from odoo import models, fields, api from odoo.tools import file_open, mail from ..common import os, RunbotException, make_github_session, sanitize +from ..fields import JsonDictField from odoo.exceptions import UserError from odoo.tools.safe_eval import safe_eval @@ -70,6 +71,7 @@ class Trigger(models.Model): ) module_filters = fields.One2many('runbot.module.filter', 'trigger_id', string="Module filters", help='Will be combined with repo module filters when used with this trigger') config_id = fields.Many2one('runbot.build.config', string="Config", required=True) + config_data = JsonDictField('Config Data') batch_dependent = fields.Boolean('Batch Dependent', help="Force adding batch in build parameters to make it unique and give access to bundle") ci_context = fields.Char("CI context", tracking=True) diff --git a/runbot/tests/test_build.py b/runbot/tests/test_build.py index a1a5b750..b55d89b7 100644 --- a/runbot/tests/test_build.py +++ b/runbot/tests/test_build.py @@ -181,6 +181,64 @@ class TestBuildParams(RunbotCaseMinimalSetup): batch._process() self.assertEqual(batch.state, 'done') + def test_trigger_config_data(self): + """Test that a config_data on the trigger is given to the build""" + self.additionnal_setup() + self.start_patchers() + + # A commit is found on the dev remote + branch_a_name = 'master-test-something' + self.push_commit(self.remote_server_dev, branch_a_name, 'nice subject', sha='d0d0caca') + # batch preparation + self.repo_server.project_id.process_delay = 10 + self.repo_server._update_batches() + + # set config data on the trigger + self.trigger_server.config_data = {'moc_var': 'bar'} + + # create a custom trigger for the bundle + bundle = self.Bundle.search([('name', '=', branch_a_name), ('project_id', '=', self.project.id)]) + + self.repo_server.project_id.process_delay = 0 + bundle.last_batch._process() + build_slot = bundle.last_batch.slot_ids.filtered(lambda rec: rec.trigger_id == self.trigger_server) + self.assertIn( + 'moc_var', build_slot.params_id.config_data + ) + self.assertEqual('bar', build_slot.params_id.config_data['moc_var']) + + def test_trigger_config_data_custom_trigger(self): + """Test that a config_data on a custom trigger overrides the config_data on the trigger""" + self.additionnal_setup() + self.start_patchers() + + # A commit is found on the dev remote + branch_a_name = 'master-test-something' + self.push_commit(self.remote_server_dev, branch_a_name, 'nice subject', sha='d0d0caca') + # batch preparation + self.repo_server.project_id.process_delay = 10 + self.repo_server._update_batches() + + # set config data on the trigger + self.trigger_server.config_data = {'moc_var': 'bar'} + + # create a custom trigger for the bundle + bundle = self.Bundle.search([('name', '=', branch_a_name), ('project_id', '=', self.project.id)]) + + # create a custom trigger with the custom config linked to the bundle + self.env['runbot.bundle.trigger.custom'].create({ + 'trigger_id': self.trigger_server.id, + 'bundle_id': bundle.id, + 'config_data': {'moc_var': 'foo'}, + }) + + self.repo_server.project_id.process_delay = 0 + bundle.last_batch._process() + build_slot = bundle.last_batch.slot_ids.filtered(lambda rec: rec.trigger_id == self.trigger_server) + self.assertIn( + 'moc_var', build_slot.params_id.config_data + ) + self.assertEqual('foo', build_slot.params_id.config_data['moc_var']) class TestBuildResult(RunbotCase):