[IMP] runbot: small change of docker_build api

returns now a dict instead of a tuple for easier extension
This commit is contained in:
Xavier-Do 2024-08-29 09:43:01 +02:00
parent e4b04a42d1
commit efafa2e165
2 changed files with 19 additions and 9 deletions

View File

@ -110,19 +110,31 @@ def _docker_build(build_dir, image_tag):
:param image_tag: name used to tag the resulting docker image
:return: tuple(success, msg) where success is a boolean and msg is the error message or None
"""
result = {
'image': False,
'msg': '',
}
docker_client = docker.from_env()
start = time.time()
try:
docker_image, result_stream = docker_client.images.build(path=build_dir, tag=image_tag, rm=True)
result_stream = list(result_stream)
msg = ''.join([r.get('stream', '') for r in result_stream])
return docker_image, msg
result['image'] = docker_image
result['msg'] = msg
except docker.errors.APIError as e:
_logger.error('Build of image %s failed', image_tag)
return (False, e.explanation)
result['msg'] = e.explanation
except docker.errors.BuildError as e:
_logger.error('Build of image %s failed', image_tag)
msg = f"{''.join(l.get('stream') or '' for l in e.build_log)}\nERROR:{e.msg}"
return (False, msg)
result['msg'] = msg
duration = time.time() - start
if duration > 1:
_logger.info('Dockerfile %s finished build in %s', image_tag, duration)
result['duration'] = duration
return result
def docker_push(image_tag):
return _docker_push(image_tag)

View File

@ -289,7 +289,6 @@ class Dockerfile(models.Model):
})
def _build(self, host=None):
start = time.time()
docker_build_path = self.env['runbot.runbot']._path('docker', self.image_tag)
os.makedirs(docker_build_path, exist_ok=True)
@ -298,15 +297,14 @@ class Dockerfile(models.Model):
with open(self.env['runbot.runbot']._path('docker', self.image_tag, 'Dockerfile'), 'w') as Dockerfile:
Dockerfile.write(content)
docker_build_identifier, msg = docker_build(docker_build_path, self.image_tag)
duration = time.time() - start
result = docker_build(docker_build_path, self.image_tag)
docker_build_identifier = result['image']
duration = result['duration']
msg = result['msg']
docker_build_result_values = {'dockerfile_id': self.id, 'output': msg, 'duration': duration, 'content': content, 'host_id': host and host.id}
duration = time.time() - start
if docker_build_identifier:
docker_build_result_values['result'] = 'success'
docker_build_result_values['identifier'] = docker_build_identifier.id
if duration > 1:
_logger.info('Dockerfile %s finished build in %s', self.image_tag, duration)
else:
docker_build_result_values['result'] = 'error'
self.to_build = False