Skip to content

Commit a7f8c80

Browse files
committed
[IMP] runbot: get docker metadata after build
The docker metadata are currently computed only on some images durring the nightly. This aims to get metadata after each docker image build in order to be able to rely on them when needed.
1 parent 36b35b6 commit a7f8c80

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

runbot/models/docker.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33
import os
44
import re
5+
import docker
56
from odoo import api, fields, models
67
from odoo.addons.base.models.ir_qweb import QWebException
78

@@ -155,8 +156,15 @@ def copy(self, default=None):
155156
return copied_record
156157

157158
def _compute_last_successful_result(self):
159+
rg = self.env['runbot.docker_build_result']._read_group(
160+
[('result', '=', 'success'), ('dockerfile_id', 'in', self.ids)],
161+
['dockerfile_id'],
162+
['id:max'],
163+
)
164+
result_ids = dict(rg)
165+
158166
for record in self:
159-
record.last_successful_result = next((result for result in record.build_results if result.result == 'success'), record.build_results.browse())
167+
record.last_successful_result = result_ids.get(record)
160168

161169
@api.depends('bundle_ids', 'referencing_dockerlayer_ids', 'project_ids', 'version_ids')
162170
def _compute_use_count(self):
@@ -287,6 +295,35 @@ def clean_comments(text):
287295
'content': 'USER {USERNAME}',
288296
})
289297

298+
def _get_docker_metadata(self, image_id):
299+
_logger.info(f'Fetching metadata for image {image_id}')
300+
metadata = {}
301+
commands = {
302+
'release': 'lsb_release -ds',
303+
'python': 'python3 --version',
304+
'chrome': 'google-chrome --version',
305+
'psql': 'psql --version',
306+
'pip_packages': 'python3 -m pip freeze',
307+
'debian_packages': "dpkg-query -W -f '${Package}==${Version}\n'",
308+
}
309+
if image_id:
310+
try:
311+
docker_client = docker.from_env()
312+
for key, command in commands.items():
313+
name = f"GetDockerInfos_{image_id}_{key}"
314+
try:
315+
result = docker_client.containers.run(image_id, name=name,command=['/bin/bash', '-c', command], detach=False, remove=True)
316+
result = result.decode('utf-8').strip()
317+
if 'packages' in key:
318+
result = result.split('\n')
319+
except docker.errors.ContainerError:
320+
result = None
321+
metadata[key] = result
322+
except Exception as e:
323+
_logger.exception(f'Error while fetching metadata for image {image_id}')
324+
return {'error': str(e)}
325+
return metadata
326+
290327
def _build(self, host=None):
291328
docker_build_path = self.env['runbot.runbot']._path('docker', self.image_tag)
292329
os.makedirs(docker_build_path, exist_ok=True)
@@ -322,7 +359,10 @@ def _build(self, host=None):
322359
if previous_result.content != docker_build_result_values['content']: # docker image changed
323360
should_save_result = True
324361

362+
325363
if should_save_result:
364+
if success:
365+
docker_build_result_values['metadata'] = self._get_docker_metadata(docker_build_result_values['identifier'])
326366
result = self.env['runbot.docker_build_result'].create(docker_build_result_values)
327367
if not success:
328368
message = f'Build failure, check results for more info ({result.summary})'
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.o_field_widget.o_field_runbotjsonb {
2+
width: 100%;
3+
white-space: pre-wrap;
4+
}

runbot/views/dockerfile_views.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@
187187
<page string="Content">
188188
<field name="content"/>
189189
</page>
190+
<page string="Metadata">
191+
<field name="metadata"/>
192+
</page>
190193
</notebook>
191194
</sheet>
192195
</form>

0 commit comments

Comments
 (0)