代码之家  ›  专栏  ›  技术社区  ›  Dark Star1

如何在gitlab中成功的管道结束时创建合并请求?

  •  1
  • Dark Star1  · 技术社区  · 6 年前

    我对gitlab和gitlab-ci很陌生,我已经建立了一个成功完成的管道。 我的主分支和开发分支受到保护,因此需要合并请求,以便组中的另一个开发人员可以在合并之前查看代码和注释。 我想知道是否可以在这个管道的末尾生成这个合并请求。Gitlab存储库中是否有此设置,或者必须创建脚本才能实现此设置?
    旁注:
    就在我发这个之前 this section of the gitlab docs
    我在ubuntu 18.04上使用gitlab runner 11.0.0

    3 回复  |  直到 6 年前
        1
  •  3
  •   Kurt    6 年前

    简短回答: 当然-一切皆有可能。Gitlab有一个很好的API( including creating an MR )中。但我认为走那条路是不好的。你应该像设计的那样利用gitlab。你启动合并请求太晚了。在开始任何工作之前启动它,合并请求将保持打开状态。 整个持续时间 你的分支。

    长答案: 这是理想的Gitlab工作流:

    1. 有人创造了 发行 针对存储库。 也许是一个功能请求,也许是一个实际的问题,不管怎样-有人想要改变一些东西,所以这是一个“问题”
    2. 开发人员打开问题并单击 创建合并请求
      • 这个 产生 合并请求(mr),一个匹配的分支,并将其绑定回问题
    3. 开发人员负责分支机构的工作,同时推动更改
    4. 开发人员得到一条经过的管道并点击“ 解析WIP “当他们准备好让客户预览工作和/或让另一个开发人员进行代码评审时。
    5. 从这里开始,让评审员点击 合并 当你完成复习或者做得更好时,打开 批准 在存储库设置和 设置 你想要评论的人或人组。
    6. 在“合并”按钮旁边,确保删除源分支(以保持正常),合并的代码将 自动 关闭问题-并将所有3个元素链接在一起。

    这与github的工作方式(我是从github来的)基本上是相反的 告诉别人你在做什么。

    • 拉取请求 github 在工作完成时创建 完成 你想和师父合并。
    • 合并请求 吉特实验室 在工作完成时创建 开始 你想告诉全世界你即将开始一个功能的工作。这允许人们在不需要时快速关闭,或者防止多个开发人员重复工作。

    编辑: 听起来你对利用api很感兴趣。实际上有一个名为“python gitlab”的python包可以正常工作 http://python-gitlab.readthedocs.io/en/stable/gl_objects/mrs.html

    import gitlab
    import os
    
    origin = "https://gitlab.example.com"
    # Private token is set as an env var
    gl = gitlab.Gitlab(origin, private_token, api_version='4')
    gl.auth()
    
    def create_merge_request(origin, private_token):
        mr = project.mergerequests.create({'source_branch': 'cool_feature',
                                   'target_branch': 'master',
                                   'title': 'merge cool feature',
                                   'labels': ['label1', 'label2']})
        mr.assignee_id = gl.users.get(2).id # Assign it to coworker
    
    def lookup_last_pipeline(origin, private_token):
        current_pipeline_id = os.environ['CI_PIPELINE_ID']
        pipelines = gl.projects.get(os.environ['CI_PROJECT_ID']).pipelines.list()
        for pipeline in pipelines:
            if pipeline.status == 'success' and pipeline.id == current_pipeline_id:
                create_merge_request()
    

    这当然是一个例子,你必须调整它以满足你的精确需求。

        2
  •  1
  •   VonC    6 年前

    另一种方法是:

    • 不使用Gitlab API
    • 获取由管道签出的代码表示的修补程序
    • 使用电子邮件(!),自Gitlab 11.5(2018年11月)起

    Open a merge request with a patch via email

    GITLAB支持通过电子邮件打开合并请求很长时间,但是在发送电子邮件之前,分支必须已经存在于服务器上。现在,通过附加一个或多个修补程序文件,您可以只通过电子邮件打开合并请求( .patch )中。

    修补程序文件是在系统之间共享和传输更改的标准。在GITLAB的未来版本中,我们将在此基础上建立 distributed merge requests ,这将允许gitlab实例和其他git宿主工具之间的合并请求。

    documentation issue 是的。

        3
  •  1
  •   Dark Star1    5 年前

    为了满足我的简单需求,我只需在我的管道中添加一个最终阶段,它基本上执行一个bash脚本,该脚本改编自 this post 是的。

    编辑: 应@yuva的要求

    # Create a pull request on pipeline success
    create_merge_request:
      stage: createMR
      tags:
        - autoMR
      script:
        - 'echo Merge request opened by $GITLAB_USER_NAME '
        - ~/commit.sh
    
    

    在commit.sh中

    #!/bin/bash
    # This script was adapted from:
    # https://about.gitlab.com/2017/09/05/how-to-automatically-create-a-new-mr-on-gitlab-with-gitlab-ci/
    
    # TODO determine URL from git repository URL
    [[ $HOST =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/"
    
    # The branch which we wish to merge into
    TARGET_BRANCH=develop;
    
    # The user's token name so that we can open the merge request as the user
    TOKEN_NAME=`echo ${GITLAB_USER_LOGIN}_COMMIT_TOKEN | tr "[a-z]" "[A-Z]"`
    
    # See: http://www.tldp.org/LDP/abs/html/parameter-substitution.html search ${!varprefix*}, ${!varprefix@} section
    PRIVATE_TOKEN=`echo ${!TOKEN_NAME}`
    
    # The description of our new MR, we want to remove the branch after the MR has
    # been closed
    BODY="{
    \"project_id\": ${CI_PROJECT_ID},
    \"source_branch\": \"${CI_COMMIT_REF_NAME}\",
    \"target_branch\": \"${TARGET_BRANCH}\",
    \"remove_source_branch\": false,
    \"force_remove_source_branch\": false,
    \"allow_collaboration\": true,
    \"subscribed\" : true,
    \"title\": \"${GITLAB_USER_NAME} merge request for: ${CI_COMMIT_REF_SLUG}\"
    }";
    
    # Require a list of all the merge request and take a look if there is already
    # one with the same source branch
     LISTMR=`curl --silent "${HOST}${CI_PROJECT_ID}/merge_requests?state=opened" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}"`;
     COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${CI_COMMIT_REF_NAME}\"" | wc -l`;
    
    # No MR found, let's create a new one
    if [ ${COUNTBRANCHES} -eq "0" ]; then
        curl -X POST "${HOST}${CI_PROJECT_ID}/merge_requests" \
        --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
        --header "Content-Type: application/json" \
        --data "${BODY}";
    
        echo "Opened a new merge request: WIP: ${CI_COMMIT_REF_SLUG} for user ${GITLAB_USER_LOGIN}";
        exit;
    fi
        echo "No new merge request opened"