From da5eeb8a669b6068d35686f8bc13c51192244a1b Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Mon, 24 Mar 2025 09:33:01 +0100 Subject: [PATCH] [IMP] runbot: add in_error on dockerfile --- runbot/container.py | 5 +++-- runbot/models/docker.py | 14 +++++++++++++- runbot/models/host.py | 24 ++++++++++++++++-------- runbot/views/dockerfile_views.xml | 5 ++++- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/runbot/container.py b/runbot/container.py index c95729b1..5e43c5f8 100644 --- a/runbot/container.py +++ b/runbot/container.py @@ -151,12 +151,13 @@ def docker_tag(identifier_or_tag, new_tag): def _docker_tag(identifier_or_tag, new_tag): if not identifier_or_tag: return - _logger.info('Tagging image %s to "%s"', identifier_or_tag, new_tag) docker_client = docker.from_env() repo, tag = new_tag.split(':') # runbot DockerFile tags contains the repo part try: image = docker_client.images.get(identifier_or_tag) - image.tag(repo, tag) + if new_tag not in image.tags: + _logger.info('Tagging image %s to "%s"', identifier_or_tag, new_tag) + image.tag(repo, tag) except docker.errors.ImageNotFound: _logger.warning('failed to find docker image with identifier %s', identifier_or_tag) except docker.errors.APIError: diff --git a/runbot/models/docker.py b/runbot/models/docker.py index d2c2a1fd..0e17ca08 100644 --- a/runbot/models/docker.py +++ b/runbot/models/docker.py @@ -126,12 +126,14 @@ class Dockerfile(models.Model): active = fields.Boolean('Active', default=True, tracking=True) image_identifier = fields.Char('Identifier', tracking=True) image_future_identifier = fields.Char('Future Identifier', tracking=True) + image_previous_identifier = fields.Char('Previous Identifier', tracking=True) image_tag = fields.Char(compute='_compute_image_tag', store=True) image_future_tag = fields.Char(compute='_compute_image_helper_tags') image_previous_tag = fields.Char(compute='_compute_image_helper_tags') template_id = fields.Many2one('ir.ui.view', string='Docker Template', domain=[('type', '=', 'qweb')], context={'default_type': 'qweb', 'default_arch_base': ''}) arch_base = fields.Text(related='template_id.arch_base', readonly=False, related_sudo=True) dockerfile = fields.Text(compute='_compute_dockerfile', tracking=True) + in_error = fields.Boolean('In error', help='The last build failed.', default=False) to_build = fields.Boolean('To Build', help='Build Dockerfile. Check this when the Dockerfile is ready.', default=False) always_pull = fields.Boolean('Always pull', help='Always Pull on the hosts, not only at the use time', default=False, tracking=True, copy=False) version_ids = fields.One2many('runbot.version', 'dockerfile_id', string='Versions') @@ -196,6 +198,10 @@ class Dockerfile(models.Model): rec.dockerfile = content + @api.onchange('dockerfile') + def onchange_dockerfile(self): + self.in_error = False + @api.depends('name') def _compute_image_tag(self): for rec in self: @@ -214,6 +220,12 @@ class Dockerfile(models.Model): keys = re.findall(r' + @@ -100,11 +101,13 @@ runbot.dockerfile.list runbot.dockerfile - + + +