diff --git a/accept_merge_request.py b/accept_merge_request.py index b3006c3239e835655b17ef0c60ad42b44b94645d..878c8a075ddd7903a1a196a6ed73b046ca328aa8 100755 --- a/accept_merge_request.py +++ b/accept_merge_request.py @@ -18,7 +18,7 @@ critical_error = ( ) -def accept_merge_request(gitlab, project, mr, rebase=False): +def accept_merge_request(project, mr, rebase=False): """Attempt to merge a merge request, rebase if necessary""" merged = False pipeline_pending = False @@ -72,7 +72,7 @@ def accept_merge_request(gitlab, project, mr, rebase=False): print("Merge not possible, but branch can be automatically rebased") if rebase: print("Trying to rebase...") - mr = common.rebase_merge_request(gitlab, project, mr) + mr = common.rebase_merge_request(project, mr) if mr.merge_error: print("ERROR: rebase not possible\n'%s'" % mr.merge_error) sys.exit(critical_error) @@ -128,16 +128,15 @@ def main(): gitlab = Gitlab(args.gitlab_url, private_token=args.token) project = common.get_project(gitlab, args.project) - with gitlab: - try: - merge_request = project.mergerequests.get(id=args.merge_request) - except GitlabGetError as e: - sys.exit("Could not get merge request: %s" % e) + try: + merge_request = project.mergerequests.get(id=args.merge_request) + except GitlabGetError as e: + sys.exit("Could not get merge request: %s" % e) - if accept_merge_request(gitlab, project, merge_request, rebase=args.rebase): - print("Successfully merged") - else: - sys.exit(1) + if accept_merge_request(project, merge_request, rebase=args.rebase): + print("Successfully merged") + else: + sys.exit(1) if __name__ == "__main__": diff --git a/common.py b/common.py index 8eb60dedb7f492d34411ba97db61c35f8997d852..ddc98da5d572565f2ceade949758049ff0f8407f 100755 --- a/common.py +++ b/common.py @@ -17,63 +17,55 @@ def integration_branch_name(project_name, branch_name): def get_project(gitlab, project_name): """Get a GitLab project by its name""" - with gitlab: - project = None - try: - for p in gitlab.projects.list( - search=project_name, retry_transient_errors=True - ): - if p.name == project_name: - project = p - if not project: - sys.exit("ERROR: project '%s' not found" % project_name) - except requests.ConnectionError: - sys.exit("ERROR: could not connect to GitLab server") - except GitlabAuthenticationError: - sys.exit("ERROR: authentication failed") + project = None + try: + for p in gitlab.projects.list(search=project_name, retry_transient_errors=True): + if p.name == project_name: + project = p + if not project: + sys.exit("ERROR: project '%s' not found" % project_name) + except requests.ConnectionError: + sys.exit("ERROR: could not connect to GitLab server") + except GitlabAuthenticationError: + sys.exit("ERROR: authentication failed") return project -def get_latest_commit(gitlab, project, branch_name): +def get_latest_commit(project, branch_name): """Get latest commit on a given project branch""" - with gitlab: - try: - branch = project.branches.get(branch_name) - except GitlabGetError as e: - sys.exit( - "ERROR: could not get branch '%s' for project '%s': %s" - % (branch_name, project.name, e) - ) - if not branch: - sys.exit( - "ERROR: branch '%s' not found in project %s" - % (branch_name, project.name) - ) + try: + branch = project.branches.get(branch_name) + except GitlabGetError as e: + sys.exit( + "ERROR: could not get branch '%s' for project '%s': %s" + % (branch_name, project.name, e) + ) + if not branch: + sys.exit( + "ERROR: branch '%s' not found in project %s" % (branch_name, project.name) + ) return branch.commit -def rebase_merge_request(gitlab, project, merge_request): +def rebase_merge_request(project, merge_request): """Attempt to rebase a merge request and return the updated merge request object""" # Rebasing takes more than one API call, see: # https://docs.gitlab.com/ce/api/merge_requests.html#rebase-a-merge-request - with gitlab: + try: + merge_request.rebase() + except GitlabMRRebaseError as e: + merge_request.merge_error = "Could not rebase merge request: %s" % e + return merge_request + rebase_in_progress = True + while rebase_in_progress: + time.sleep(1) try: - merge_request.rebase() - except GitlabMRRebaseError as e: - merge_request.merge_error = "Could not rebase merge request: %s" % e + updated_merge_request = project.mergerequests.get( + id=merge_request.iid, + query_parameters={"include_rebase_in_progress": "True"}, + ) + except GitlabGetError as e: + merge_request.merge_error = "Could not get updated merge request: %s" % e return merge_request - rebase_in_progress = True - while rebase_in_progress: - time.sleep(1) - try: - updated_merge_request = project.mergerequests.get( - id=merge_request.iid, - query_parameters={"include_rebase_in_progress": "True"}, - ) - except GitlabGetError as e: - merge_request.merge_error = ( - "Could not get updated merge request: %s" % e - ) - return merge_request - rebase_in_progress = updated_merge_request.rebase_in_progress + rebase_in_progress = updated_merge_request.rebase_in_progress return updated_merge_request diff --git a/get_merge_requests.py b/get_merge_requests.py index 3f2fdb3f8c8035df147b1b76c20558580bcee71a..71aa9d6e980add415a5defaf6826e7d9558846fa 100755 --- a/get_merge_requests.py +++ b/get_merge_requests.py @@ -7,30 +7,29 @@ from gitlab import Gitlab, GitlabGetError def get_merge_requests( - gitlab, project, state, source_branch=None, target_branch=None, commit=None + project, state, source_branch=None, target_branch=None, commit=None ): """Get merge request by source and target branch and optionally commit sha""" merge_requests = [] - with gitlab: - try: - all_merge_requests = project.mergerequests.list( - source_branch=source_branch, - target_branch=target_branch, - state=state, - all=True, - retry_transient_errors=True, - ) - except GitlabGetError as e: - sys.exit( - "ERROR: could not list merge requests for project '%s': %s" - % (project.name, e) - ) - if commit: - for mr in all_merge_requests: - if mr.sha == commit: - merge_requests.append(mr) - elif all_merge_requests: - merge_requests = all_merge_requests + try: + all_merge_requests = project.mergerequests.list( + source_branch=source_branch, + target_branch=target_branch, + state=state, + all=True, + retry_transient_errors=True, + ) + except GitlabGetError as e: + sys.exit( + "ERROR: could not list merge requests for project '%s': %s" + % (project.name, e) + ) + if commit: + for mr in all_merge_requests: + if mr.sha == commit: + merge_requests.append(mr) + elif all_merge_requests: + merge_requests = all_merge_requests return merge_requests @@ -85,7 +84,6 @@ def main(): project = common.get_project(gitlab, args.project) mrs = get_merge_requests( - gitlab, project, state=args.state, source_branch=args.source_branch, diff --git a/integrate_into_manifest.py b/integrate_into_manifest.py old mode 100644 new mode 100755 index 6f62a21f50c758c45192114bc5a09936ca5d2e26..43cc3eb969db08bdee967da370e520272e302c18 --- a/integrate_into_manifest.py +++ b/integrate_into_manifest.py @@ -12,7 +12,6 @@ from lxml import etree def integrate_into_manifest( - gitlab, manifest_project, integration_base, manifest_file, @@ -20,6 +19,8 @@ def integrate_into_manifest( branch, commit=None, ): + gitlab = manifest_project.manager.gitlab + with tempfile.TemporaryDirectory() as manifest_dir: manifest_filepath = Path(manifest_dir) / manifest_file @@ -74,7 +75,7 @@ def integrate_into_manifest( new_revision = project_commit.id commit_message = project_commit.message else: - project_commit = common.get_latest_commit(gitlab, project, branch) + project_commit = common.get_latest_commit(project, branch) # project_commit is a simple dictionary here new_revision = project_commit["id"] commit_message = project_commit["message"] @@ -184,16 +185,14 @@ def main(): manifest_project = common.get_project(gitlab, args.manifest_project) project = common.get_project(gitlab, args.project) - with gitlab: - manifest_revision = integrate_into_manifest( - gitlab=gitlab, - manifest_project=manifest_project, - integration_base=args.integration_base, - manifest_file=args.manifest_file, - project=project, - branch=args.branch, - commit=args.commit, - ) + manifest_revision = integrate_into_manifest( + manifest_project=manifest_project, + integration_base=args.integration_base, + manifest_file=args.manifest_file, + project=project, + branch=args.branch, + commit=args.commit, + ) if args.revision_file: with open(args.revision_file, "w") as file: diff --git a/merge_into_manifest.py b/merge_into_manifest.py index 6073067cbae02fcfb3485b2005490aabe4da88ba..a6482dc59d2fe6804829637634d9a9a34a83c5c2 100755 --- a/merge_into_manifest.py +++ b/merge_into_manifest.py @@ -12,7 +12,7 @@ from get_merge_requests import get_merge_requests from integrate_into_manifest import integrate_into_manifest -def merge_into_manifest(gitlab, manifest_project, master_branch, project, commit): +def merge_into_manifest(manifest_project, master_branch, project, commit): """ Create a merge request on the manifest for a given merged project commit and merge it immediately. Update the integration branch before, if it is not up to date with @@ -21,7 +21,6 @@ def merge_into_manifest(gitlab, manifest_project, master_branch, project, commit # Get source merge request mrs = get_merge_requests( - gitlab, project, target_branch=master_branch, state="merged", @@ -40,7 +39,6 @@ def merge_into_manifest(gitlab, manifest_project, master_branch, project, commit # Check if merge request already exists mrs = get_merge_requests( - gitlab, manifest_project, source_branch=integration_branch, target_branch=target_branch, @@ -82,7 +80,7 @@ def merge_into_manifest(gitlab, manifest_project, master_branch, project, commit manifest_revision = mr.sha merged = False while not merged: - merged = accept_merge_request(gitlab, manifest_project, mr) + merged = accept_merge_request(manifest_project, mr) if not merged: # Note: if reintegration is necessary here, the source merge request was # merged without running the pipeline on the latest manifest, i.e. some @@ -93,7 +91,6 @@ def merge_into_manifest(gitlab, manifest_project, master_branch, project, commit # deliberately put up with this, as it is quite unlikely to happen and # we want a completely automated process in every case. manifest_revision = integrate_into_manifest( - gitlab=gitlab, manifest_project=manifest_project, integration_base=target_branch, manifest_file=common.manifest_file, @@ -183,7 +180,6 @@ def main(): manifest_project = common.get_project(gitlab, args.manifest_project) manifest_revision = merge_into_manifest( - gitlab=gitlab, manifest_project=manifest_project, master_branch=args.master_branch, project=project, diff --git a/retrigger_mr_pipeline.py b/retrigger_mr_pipeline.py index 635cd84fec7886ca7ad125a24c4a7ad2eef59f6f..ebfd67b5c07f38405ab78c3e6af861235d9d948b 100755 --- a/retrigger_mr_pipeline.py +++ b/retrigger_mr_pipeline.py @@ -6,25 +6,25 @@ import sys from gitlab import Gitlab, GitlabGetError, GitlabHttpError -def retrigger_mr_pipeline(gitlab, project, mr): - with gitlab: - # Creating a merge request pipeline is not implemented in python-gitlab, so we - # have to construct the HTTP request manually. - # https://github.com/python-gitlab/python-gitlab/issues/1239 - # https://docs.gitlab.com/ce/api/merge_requests.html#create-mr-pipeline - path = "%s/%s/pipelines" % (mr.manager.path, mr.iid) - try: - pipeline = gitlab.http_post(path) - except GitlabHttpError as e: - sys.exit( - "ERROR: could not create pipeline for merge request %s!%s: %s" - % (project.name, mr.iid, e) - ) +def retrigger_mr_pipeline(project, mr): + # Creating a merge request pipeline is not implemented in python-gitlab, so we + # have to construct the HTTP request manually. + # https://github.com/python-gitlab/python-gitlab/issues/1239 + # https://docs.gitlab.com/ce/api/merge_requests.html#create-mr-pipeline + gitlab = mr.manager.gitlab + path = "%s/%s/pipelines" % (mr.manager.path, mr.iid) + try: + pipeline = gitlab.http_post(path) + except GitlabHttpError as e: + sys.exit( + "ERROR: could not create pipeline for merge request %s!%s: %s" + % (project.name, mr.iid, e) + ) - print("Created new pipeline for %s :" % mr.web_url) - print(pipeline.get("web_url")) + print("Created new pipeline for %s :" % mr.web_url) + print(pipeline.get("web_url")) - return pipeline + return pipeline def main(): @@ -68,7 +68,7 @@ def main(): if not mr: sys.exit("ERROR: could not find merge request %s!%s" % (project.name, args.iid)) - retrigger_mr_pipeline(gitlab, project, mr) + retrigger_mr_pipeline(project, mr) if __name__ == "__main__": diff --git a/retrigger_mr_pipelines.py b/retrigger_mr_pipelines.py index 7944f4d576a8d5d9f9e39bb57a56968ef542370c..4e1ade2ba1623be87f213666952ebec69ab5082b 100755 --- a/retrigger_mr_pipelines.py +++ b/retrigger_mr_pipelines.py @@ -59,7 +59,6 @@ def main(): project = common.get_project(gitlab, args.project) mrs = get_merge_requests( - gitlab, project, state=args.state, source_branch=args.source_branch, @@ -68,7 +67,7 @@ def main(): ) for mr in mrs: - retrigger_mr_pipeline(gitlab, project, mr) + retrigger_mr_pipeline(project, mr) if __name__ == "__main__":