[FIX] runbot: various fixes (data improvement, python step, logs, ...)

This commit is contained in:
Xavier-Do 2019-05-20 10:52:13 +02:00
parent 8a7e0b20aa
commit 427639b77a
6 changed files with 24 additions and 16 deletions

View File

@ -54,7 +54,7 @@
<record id="runbot_build_config_step_test_coverage" model="runbot.build.config.step">
<field name="name">coverage</field>
<field name="install_modules">*</field>
<field name="cpu_limit">5400</field>
<field name="cpu_limit">7000</field>
<field name="test_enable" eval="True"/>
<field name="coverage" eval="True"/>
<field name="protected" eval="True"/>
@ -74,6 +74,7 @@
<field name="create_config_ids" eval="[(4, ref('runbot_build_config_light_test'))]"/>
<field name="number_builds">10</field>
<field name="protected" eval="True"/>
<field name="force_build" eval="True"/>
</record>
<record id="runbot_build_config_multibuild" model="runbot.build.config">

View File

@ -121,7 +121,7 @@ class runbot_build(models.Model):
else:
record.global_state = record.local_state
def _get_youngest_state(self, states, max=False):
def _get_youngest_state(self, states):
index = min([self._get_state_score(state) for state in states])
return state_order[index]
@ -288,10 +288,12 @@ class runbot_build(models.Model):
def _end_test(self):
for build in self:
if build.parent_id:
if build.parent_id and build.global_state in ('running', 'done'):
global_result = build.global_result
loglevel = 'OK' if global_result == 'ok' else 'WARNING' if global_result == 'warn' else 'ERROR'
build.parent_id._log('children_build', 'returned a "%s" result ' % (global_result), level=loglevel, log_type='subbuild', path=self.id)
if build.parent_id.local_state in ('running', 'done'):
build.parent_id._end_test()
@api.depends('name', 'branch_id.name')
def _compute_dest(self):
@ -499,19 +501,19 @@ class runbot_build(models.Model):
values.update(build._next_job_values())
build.write(values)
if not build.active_step:
build._log('schedule', 'No job in config, doing nothing')
build._end_test()
build._log('_schedule', 'No job in config, doing nothing')
#build._end_test()
continue
try:
build._log('init', 'Init build environment with config %s ' % build.config_id.name)
build._log('_schedule', 'Init build environment with config %s ' % build.config_id.name)
# notify pending build - avoid confusing users by saying nothing
build._github_status()
build._checkout()
build._log('docker_build', 'Building docker image')
build._log('_schedule', 'Building docker image')
docker_build(build._path('logs', 'docker_build.txt'), build._path())
except Exception:
_logger.exception('Failed initiating build %s', build.dest)
build._log('Failed initiating build')
build._log('_schedule', 'Failed initiating build')
build._kill(result='ko')
continue
else: # testing/running build
@ -524,7 +526,7 @@ class runbot_build(models.Model):
if docker_is_running(build._get_docker_name()):
timeout = min(build.active_step.cpu_limit, int(icp.get_param('runbot.runbot_timeout', default=10000)))
if build.local_state != 'running' and build.job_time > timeout:
build._logger('%s time exceded (%ss)', build.active_step.name if build.active_step else "?", build.job_time)
build._log('_schedule', '%s time exceeded (%ss)', build.active_step.name if build.active_step else "?", build.job_time)
build.write({'job_end': now()})
build._kill(result='killed')
continue
@ -554,7 +556,7 @@ class runbot_build(models.Model):
if ending_build:
build._github_status()
build._end_test() # notify parent of build end
# build._end_test()
if not build.local_result: # Set 'ok' result if no result set (no tests job on build)
build.local_result = 'ok'
build._logger("No result set, setting ok by default")

View File

@ -15,6 +15,7 @@ _logger = logging.getLogger(__name__)
_re_error = r'^(?:\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d{3} \d+ (?:ERROR|CRITICAL) )|(?:Traceback \(most recent call last\):)$'
_re_warning = r'^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d{3} \d+ WARNING '
PYTHON_DEFAULT = "# type python code here\n\n\n\n\n\n"
class Config(models.Model):
_name = "runbot.build.config"
@ -94,7 +95,7 @@ class ConfigStep(models.Model):
# install_odoo
create_db = fields.Boolean('Create Db', default=True, tracking=True) # future
custom_db_name = fields.Char('Custom Db Name', tracking=True) # future
install_modules = fields.Char('Modules to install', help="List of module to install, use * for all modules")
install_modules = fields.Char('Modules to install', help="List of module to install, use * for all modules", default='*')
db_name = fields.Char('Db Name', compute='_compute_db_name', inverse='_inverse_db_name', tracking=True)
cpu_limit = fields.Integer('Cpu limit', default=3600, tracking=True)
coverage = fields.Boolean('Coverage', dafault=False, tracking=True)
@ -102,7 +103,7 @@ class ConfigStep(models.Model):
test_tags = fields.Char('Test tags', help="comma separated list of test tags")
extra_params = fields.Char('Extra cmd args', tracking=True)
# python
python_code = fields.Text('Python code', tracking=True, default="# type python code here\n\n\n\n\n\n")
python_code = fields.Text('Python code', tracking=True, default=PYTHON_DEFAULT)
running_job = fields.Boolean('Job final state is running', default=False, help="Docker won't be killed if checked")
# create_build
create_config_ids = fields.Many2many('runbot.build.config', 'runbot_build_config_step_ids_create_config_ids_rel', string='New Build Configs', tracking=True, index=True)
@ -153,7 +154,7 @@ class ConfigStep(models.Model):
if not re.match(name_reg, values.get('name')):
raise UserError('Name cannot contain special char or spaces exepts "_" and "-"')
if not self.env.user.has_group('runbot.group_build_config_administrator'):
if (values.get('job_type') == 'python' or ('python_code' in values and values['python_code'] and values['python_code'] != "# type python code here\n\n\n\n\n\n")):
if (values.get('job_type') == 'python' or ('python_code' in values and values['python_code'] and values['python_code'] != PYTHON_DEFAULT)):
raise UserError('cannot create or edit config step of type python code')
if (values.get('extra_params')):
reg = r'^[a-zA-Z0-9\-_ "]*$'

View File

@ -281,7 +281,9 @@ class runbot_repo(models.Model):
ref_branches = {}
for repo in self:
try:
refs[repo] = repo._get_refs()
ref = repo._get_refs()
if ref:
refs[repo] = ref
except Exception:
_logger.exception('Fail to get refs for repo %s', repo.name)
if repo in refs:

View File

@ -86,7 +86,7 @@
<field name="name">All config step can be edited by config admin</field>
<field name="groups" eval="[(4, ref('group_build_config_administrator'))]"/>
<field name="model_id" ref="model_runbot_build_config_step"/>
<field name="domain_force">[('1', '=', '1')]</field>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="perm_read" eval="False"/>
</record>

View File

@ -39,7 +39,8 @@ class Test_Repo(common.TransactionCase):
self.assertEqual(local_repo.short_name, 'somewhere/rep')
@patch('odoo.addons.runbot.models.repo.runbot_repo._root')
def test_repo_create_pending_builds(self, mock_root):
@patch('odoo.addons.runbot.models.repo.runbot_repo._get_fetch_head_time')
def test_repo_create_pending_builds(self, mock_fetch_head_time, mock_root):
""" Test that when finding new refs in a repo, the missing branches
are created and new builds are created in pending state
"""
@ -61,6 +62,7 @@ class Test_Repo(common.TransactionCase):
'A nice subject',
'Marc Bidule',
'<marc.bidule@somewhere.com>')]
mock_fetch_head_time.side_effect = [100000.0, 100001.0, 100002.0]
with patch('odoo.addons.runbot.models.repo.runbot_repo._git', new=self.mock_git_helper()):
repo._create_pending_builds()