From c83f89fc233dfbdd15343d7f44ae6c263d6e48c0 Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Tue, 20 Dec 2022 15:35:47 +0100 Subject: [PATCH] [IMP] runbot: documentation and views imps Add a small documentation for users, mainly about teams and codeowners. Improves some views and hide some menu_items to keep interface easier to navigate. --- runbot/controllers/frontend.py | 23 ++++++- runbot/documentation/codeowner.md | 51 ++++++++++++++++ .../Screenshot from 2020-09-23 12-20-40.png | Bin 22177 -> 0 bytes runbot/documentation/readme.md | 3 + runbot/models/build_error.py | 2 +- runbot/models/codeowner.py | 2 +- runbot/models/dockerfile.py | 6 +- runbot/models/res_users.py | 5 ++ runbot/models/team.py | 8 ++- runbot/static/src/js/runbot.js | 9 ++- runbot/templates/build_error.xml | 56 ++++++++++-------- runbot/templates/utils.xml | 19 +++++- runbot/views/dashboard_views.xml | 25 ++++++-- runbot/views/dockerfile_views.xml | 5 +- runbot/views/menus.xml | 22 +++---- 15 files changed, 177 insertions(+), 59 deletions(-) create mode 100644 runbot/documentation/codeowner.md delete mode 100644 runbot/documentation/images/Screenshot from 2020-09-23 12-20-40.png create mode 100644 runbot/documentation/readme.md diff --git a/runbot/controllers/frontend.py b/runbot/controllers/frontend.py index 18ca8e70..601f98d8 100644 --- a/runbot/controllers/frontend.py +++ b/runbot/controllers/frontend.py @@ -32,6 +32,7 @@ def route(routes, **kw): refresh = kwargs.get('refresh', False) nb_build_errors = request.env['runbot.build.error'].search_count([('random', '=', True), ('parent_id', '=', False)]) nb_assigned_errors = request.env['runbot.build.error'].search_count([('responsible', '=', request.env.user.id)]) + nb_team_errors = request.env['runbot.build.error'].search_count([('responsible', '=', False), ('team_id', 'in', request.env.user.runbot_team_ids.ids)]) kwargs['more'] = more kwargs['projects'] = projects @@ -60,6 +61,7 @@ def route(routes, **kw): response.qcontext['title'] = 'Runbot %s' % project.name or '' response.qcontext['nb_build_errors'] = nb_build_errors response.qcontext['nb_assigned_errors'] = nb_assigned_errors + response.qcontext['nb_team_errors'] = nb_team_errors return response return response_wrap return decorator @@ -390,6 +392,17 @@ class Runbot(Controller): } return request.render(view_id if view_id else "runbot.monitoring", qctx) + @route(['/runbot/errors/assign/' + ], type='http', auth='user', methods=['POST'], csrf=False, sitemap=False) + def build_errors_assign(self, build_error_id=None, **kwargs): + build_error = request.env['runbot.build.error'].browse(build_error_id) + if build_error.responsible: + return build_error.responsible.name + if request.env.user._is_internal(): + build_error.sudo().responsible = request.env.user + return request.env.user.name + return 'Error' + @route(['/runbot/errors', '/runbot/errors/page/' ], type='http', auth='user', website=True, sitemap=False) @@ -409,9 +422,11 @@ class Runbot(Controller): current_user_errors = request.env['runbot.build.error'].search([ ('responsible', '=', request.env.user.id), - ('parent_id', '=', False), ], order='last_seen_date desc, build_count desc') - + current_team_errors = request.env['runbot.build.error'].search([ + ('responsible', '=', False), + ('team_id', 'in', request.env.user.runbot_team_ids.ids) + ], order='last_seen_date desc, build_count desc') domain = [('parent_id', '=', False), ('responsible', '!=', request.env.user.id), ('build_count', '>', 1)] build_errors_count = request.env['runbot.build.error'].search_count(domain) url_args = {} @@ -422,10 +437,12 @@ class Runbot(Controller): qctx = { 'current_user_errors': current_user_errors, + 'current_team_errors': current_team_errors, 'build_errors': build_errors, 'title': 'Build Errors', 'sort_order_choices': sort_order_choices, - 'pager': pager + 'page': page, + 'pager': pager, } return request.render('runbot.build_error', qctx) diff --git a/runbot/documentation/codeowner.md b/runbot/documentation/codeowner.md new file mode 100644 index 00000000..ee035e97 --- /dev/null +++ b/runbot/documentation/codeowner.md @@ -0,0 +1,51 @@ +# Teams and Codeowner + +## How + +Codeowner is using two way to define which team should be notified when a file is modified: + +- Module ownership to link a module to a team. (Editable by team manager) +- Regexes, to target specific files or more specific rules. (Editable by runbot admin) + +For each file, the codeowner will check all regexes and all module ownership. +If a module ownersip is a `fallback`, the team won't be added as a reviewer if any previous rule matched for a file. +If no reviewer is found for a file, a fallback github team is added as reviewer. + +The codeowner is not applied on draft pull request (and will give a red ci as a reminder) +A pr is considered draft if: + +- marked as draft on github +- contains `[DRAFT]` or `[WIP]` in the title +- is linked to any other draft pr (in the same bundle) + +The codeowner is not applied on forwardport initial push. Any following push (conflict resolution) will trigger the codeowner again. + +## Module ownership + +Module ownership links a module to a team with an additionnal `is_fallback` flag to define if the codeowner should only be triggered if no one else was added for a file. + +Module ownership is also a way to define which team should be contacted for some question on a module. + +Module coverage should idealy reach 100% with module ownership. Having all files covered allows to ensure that at least one reviewer will be added when a pr is open (mainly for external contributors). This can sometimes generate to much github notifications, this is why it is important to configure members, create subteams, and skip pr policy. + +## Team management + +Team managers can be anyone from the team with a basic knowledge of the guidelines to follow and a good understanding of the system. + +Team manager can modify. + +- Teams +- Module ownership +- Github account of users + +Some basic config can be done on Teams + +- `Github team`: the corresponding github team to add as reviewer +- `Github logins`: additional github logins in the github team, mainly for github users no listed in the members of the runbot team. Mainly usefull if `Skip team pr` is checked. This list can be updated automatically using the `Fetch members` action. This field can also be manually modified to avoid being notified by some github login, even if it is adviced to add them as a `Team members` if they have an internal user. +- `Skip team pr`: If checked, don't add the team as reviewer if the pr was oppened by one of the members of the team. +- `Module Ownership`: The list of modules owned by the team. `Fallback` options can be edited from there but it is adviced to use the `Modules` or `Module ownership` menu to add or remove a module, mainly to avoid removing all ownership from a module. +- `Team members`: the members of the team. Those members will see a link to the team dashboard and team errors count will be displayed on main page + +## Disable codeowner on demand + +In some rare cases, if a pr modifies a lot of files in an almost automated way, it can be useful to disable the codeowner. This can be done on a bundle. Note that forwardport won't be impacted, and this should be done per forwardport in case of conflict. diff --git a/runbot/documentation/images/Screenshot from 2020-09-23 12-20-40.png b/runbot/documentation/images/Screenshot from 2020-09-23 12-20-40.png deleted file mode 100644 index ac7ae73543308af51f7448fe7692074c0f30a253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22177 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 diff --git a/runbot/documentation/readme.md b/runbot/documentation/readme.md new file mode 100644 index 00000000..eb0ee8bd --- /dev/null +++ b/runbot/documentation/readme.md @@ -0,0 +1,3 @@ +# User documentation + +- [Teams and codeowner](codeowner.md) \ No newline at end of file diff --git a/runbot/models/build_error.py b/runbot/models/build_error.py index 483f72c6..b15e76e3 100644 --- a/runbot/models/build_error.py +++ b/runbot/models/build_error.py @@ -120,7 +120,7 @@ class BuildError(models.Model): @api.depends('content') def _compute_summary(self): for build_error in self: - build_error.summary = build_error.content[:50] + build_error.summary = build_error.content[:80] @api.depends('build_ids', 'child_ids.build_ids') def _compute_children_build_ids(self): diff --git a/runbot/models/codeowner.py b/runbot/models/codeowner.py index 802cfc53..e0bd8b1f 100644 --- a/runbot/models/codeowner.py +++ b/runbot/models/codeowner.py @@ -7,7 +7,7 @@ from odoo.exceptions import ValidationError class Codeowner(models.Model): _name = 'runbot.codeowner' - _description = "Notify github teams based on filenames regex" + _description = "Codeowner regex" _inherit = "mail.thread" project_id = fields.Many2one('runbot.project', required=True, default=lambda self: self.env.ref('runbot.main_project', raise_if_not_found=False)) diff --git a/runbot/models/dockerfile.py b/runbot/models/dockerfile.py index f08d8475..003c0b10 100644 --- a/runbot/models/dockerfile.py +++ b/runbot/models/dockerfile.py @@ -14,12 +14,12 @@ class Dockerfile(models.Model): name = fields.Char('Dockerfile name', required=True, help="Name of Dockerfile") image_tag = fields.Char(compute='_compute_image_tag', store=True) 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) + arch_base = fields.Text(related='template_id.arch_base', readonly=False, related_sudo=True) dockerfile = fields.Text(compute='_compute_dockerfile', tracking=True) to_build = fields.Boolean('To Build', help='Build Dockerfile. Check this when the Dockerfile is ready.', default=False) version_ids = fields.One2many('runbot.version', 'dockerfile_id', string='Versions') description = fields.Text('Description') - view_ids = fields.Many2many('ir.ui.view', compute='_compute_view_ids') + view_ids = fields.Many2many('ir.ui.view', compute='_compute_view_ids', groups="runbot.group_runbot_admin") project_ids = fields.One2many('runbot.project', 'dockerfile_id', string='Default for Projects') bundle_ids = fields.One2many('runbot.bundle', 'dockerfile_id', string='Used in Bundles') @@ -37,7 +37,7 @@ class Dockerfile(models.Model): def _compute_dockerfile(self): for rec in self: try: - res = rec.template_id._render() if rec.template_id else '' + res = rec.template_id.sudo()._render() if rec.template_id else '' rec.dockerfile = re.sub(r'^\s*$', '', res, flags=re.M).strip() except QWebException: rec.dockerfile = '' diff --git a/runbot/models/res_users.py b/runbot/models/res_users.py index a74e2b62..c04aa380 100644 --- a/runbot/models/res_users.py +++ b/runbot/models/res_users.py @@ -26,3 +26,8 @@ class ResUsers(models.Model): if list(values.keys()) == ['github_login'] and self.env.user.has_group('runbot.group_runbot_team_manager'): return super(ResUsers, self.sudo()).write(values) return super().write(values) + + # backport of 16.0 feature TODO remove after migration + def _is_internal(self): + self.ensure_one() + return not self.sudo().share diff --git a/runbot/models/team.py b/runbot/models/team.py index bebf708c..9a2a5392 100644 --- a/runbot/models/team.py +++ b/runbot/models/team.py @@ -19,6 +19,7 @@ class RunbotTeam(models.Model): _name = 'runbot.team' _description = "Runbot Team" _order = 'name, id' + _inherit = 'mail.thread' name = fields.Char('Team', required=True) project_id = fields.Many2one('runbot.project', 'Project', help='Project to monitor', required=True, @@ -34,10 +35,11 @@ class RunbotTeam(models.Model): 'e.g.: `*website*,-*website_sale*`' ) module_ownership_ids = fields.One2many('runbot.module.ownership', 'team_id') + codeowner_ids = fields.One2many('runbot.codeowner', 'team_id') upgrade_exception_ids = fields.One2many('runbot.upgrade.exception', 'team_id', string='Team Upgrade Exceptions') - github_team = fields.Char('Github team') - github_logins = fields.Char('Github logins', help='Additional github logins, prefer adding the login on the member of the team') - skip_team_pr = fields.Boolean('Skip team pr', help="Don't add codeowner if pr was created by a member of the team") + github_team = fields.Char('Github team', tracking=True) + github_logins = fields.Char('Github logins', help='Additional github logins, prefer adding the login on the member of the team', tracking=True) + skip_team_pr = fields.Boolean('Skip team pr', help="Don't add codeowner if pr was created by a member of the team", tracking=True) @api.model_create_single def create(self, values): diff --git a/runbot/static/src/js/runbot.js b/runbot/static/src/js/runbot.js index fe09e18d..4775c9e7 100644 --- a/runbot/static/src/js/runbot.js +++ b/runbot/static/src/js/runbot.js @@ -9,14 +9,21 @@ return; } var xhr = new XMLHttpRequest(); + var url = e.target.href + if (data.runbotBuild) { + url = '/runbot/build/' + data.runbotBuild + '/' + operation + } + var elem = e.target xhr.addEventListener('load', function () { if (operation == 'rebuild' && window.location.href.split('?')[0].endsWith('/build/' + data.runbotBuild)){ window.location.href = window.location.href.replace('/build/' + data.runbotBuild, '/build/' + xhr.responseText); + } else if (operation == 'action') { + elem.parentElement.innerText = this.responseText } else { window.location.reload(); } }); - xhr.open('POST', '/runbot/build/' + data.runbotBuild + '/' + operation); + xhr.open('POST', url); xhr.send(); }); }); diff --git a/runbot/templates/build_error.xml b/runbot/templates/build_error.xml index a7550261..5d727681 100644 --- a/runbot/templates/build_error.xml +++ b/runbot/templates/build_error.xml @@ -8,9 +8,7 @@
Last seen date
Module
-
Summary
-
Nb Seen
-
Random
+
Summary
Assigned to
&nbsp;
@@ -22,24 +20,23 @@
-
+
- + + Assign to me
- -
-
-
- - - + + + + +
@@ -59,16 +56,25 @@
-

Your assigned bug on Runbot Builds

- - - user_errors + +

Your assigned build errors

+ + + user_errors + + + +

Team unassigned build errors

+ + + user_errors + -

Current Bugs on Runbot Builds

-
-
- - - -
+ + + + + diff --git a/runbot/templates/utils.xml b/runbot/templates/utils.xml index 2c29ae13..9f449450 100644 --- a/runbot/templates/utils.xml +++ b/runbot/templates/utils.xml @@ -137,13 +137,26 @@