diff --git a/deploy_gitlab_ci.py b/deploy_gitlab_ci.py index 68e5e798598fdfe08b3fcced163a520117269be5..4952e63b914f0652b1aae01556b9ec8651cdf88b 100755 --- a/deploy_gitlab_ci.py +++ b/deploy_gitlab_ci.py @@ -7,10 +7,13 @@ import sys import os from gitlab import Gitlab -# from accept_merge_request import accept_merge_request +from accept_merge_request import accept_merge_request from create_merge_request import create_merge_request from get_merge_requests import get_merge_requests -from update_submodule import update_submodule_and_include_ref +from update_submodule import ( + update_submodule_and_include_ref, + get_submodule_project_path_and_revision, +) from integrate_into_manifest import update_manifest, update_srcrev from ruamel.yaml import YAML @@ -36,33 +39,19 @@ def read_keys_from_gitlab_ci_yml(gitlab_ci_yml): return {"recipe": recipe, "masterbranch": masterbranch} -def old(): - # TODO create_merge_request(): - - # Get source merge request - mrs = get_merge_requests( - submodule_project, - # TODO should this be submodule_project's default branch? - target_branch="master", - commit=revision, - ) - if not mrs: - sys.exit( - "ERROR: could not determine source merge request for commit %s" % revision - ) - source_mr = mrs[0] - +def create_integration_merge_request(project, integration_branch_name, source_mr=None): # Create merge request # This should be optional mr, created = create_merge_request( - project, integration_branch, project.default_branch + project, integration_branch_name, project.default_branch ) if created: - common.crosslink_merge_requests(source_mr, mr) + if source_mr is not None: + common.crosslink_merge_requests(source_mr, mr) print("Created new merge request:\n%s" % mr.web_url) else: print("Existing integration merge request:\n%s" % mr.web_url) - return integration_branch, integration_commit, mr + return mr def main(): @@ -166,9 +155,10 @@ def main(): commit_and_push=(p != args.project), ) if integration_branch_name is not None: - # TODO - # if create_merge_request: - # create_merge_request + # ====================================== + # Store the references for creating the integration + # commit in the manifest later + # ====================================== project_integration[p] = { "project": gitlab_project, "repo": project_repo, @@ -187,8 +177,10 @@ def main(): print("No integration done, changes are already included in all projects.") sys.exit(0) + # ======================================================= # Now create the integration commit in the manifest # for all subprojects at once + # ======================================================= manifest_project = project_integration[args.project] manifest_file_abs = os.path.join( manifest_project["repo"].working_tree_dir, args.manifest_file @@ -258,7 +250,9 @@ def main(): manifest_project["repo"].git.add(args.srcrev_file) logging.debug(srcrev) - # TODO commit + # ======================================================== + # Now commit and push the changes to the manifest repo + # ======================================================== # Make an API request to create the gitlab.user object gitlab = manifest_project["project"].manager.gitlab gitlab.auth() @@ -277,36 +271,62 @@ def main(): ) ) - sys.exit(0) - if not args.merge: - print( - "Skipping automatic merge in MR context. If you like to extend the " - "integration MR by hand, please do it now. Afterwards you can either merge " - "it by hand or re-run this job on the master branch after the source MR " - "has been merged." - ) sys.exit(0) + # ============================================ + # Create merge requests if needed + # ============================================ + # Get source merge request ( the one in the gitlab-ci repo) + submodule_project_path, _ = get_submodule_project_path_and_revision( + manifest_project["project"], args.submodule, args.branch + ) + submodule_project = common.get_project(gitlab, submodule_project_path) + mrs = get_merge_requests( + submodule_project, + # TODO should this be submodule_project's default branch? + target_branch="master", + commit=args.revision, + ) + if not mrs: + sys.exit( + "ERROR: could not determine source merge request for commit %s" + % args.revision + ) + source_mr = mrs[0] + + for p in args.projects + [args.project]: + integration = project_integration[p] + logging.debug("Create MR in %s", integration["project"].name) + integration["mr"] = create_integration_merge_request( + integration["project"], integration["branch"], source_mr + ) + + # ================================================= + # Now merge them all + # ================================================= # The manifest needs to be merged at last - # TODO this is currently not used - # merge_requests.append(merge_request_manifest) - # for mr in merge_requests: - # logging.debug("Merge %s", mr) - # # Wait until GitLab has checked merge status - # common.wait_until_merge_status_is_set(project, mr) - - # # Attempt to merge - # merged = accept_merge_request(project, mr, rebase=True) - - # if not merged: - # sys.exit( - # "Integration MR could not be merged. You have two possibilities to fix " - # "this:\n" - # " 1. Checkout the MR and rebase it on the current master manually, or\n" - # " 2. Delete the MR (Edit -> Delete in the MR UI)\n" - # "In either case restart this job afterwards in order to get it merged." - # ) + for p in args.projects + [args.project]: + integration = project_integration[p] + mr = integration["mr"] + logging.debug("Merge %s!%s", p, mr.iid) + + # Wait until GitLab has checked merge status + common.wait_until_merge_status_is_set(integration["project"], mr) + + # Attempt to merge + # TODO if this has rebased the integration commit needs to be adapted + # change the sequence + merged = accept_merge_request(integration["project"], mr, rebase=True) + + if not merged: + sys.exit( + "Integration MR could not be merged. You have two possibilities to fix " + "this:\n" + " 1. Checkout the MR and rebase it on the current master manually, or\n" + " 2. Delete the MR (Edit -> Delete in the MR UI)\n" + "In either case restart this job afterwards in order to get it merged." + ) print("Successfully merged")