首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Gitlab中成功管道的末尾创建合并请求?

如何在Gitlab中成功管道的末尾创建合并请求?
EN

Stack Overflow用户
提问于 2018-06-29 15:03:14
回答 3查看 13.3K关注 0票数 16

我对gitlab和gitlab CI非常陌生,我已经建立了一条正在成功完成的管道。我的主分支和开发分支受到保护,因此需要合并请求,以便组中的另一个开发人员可以在合并之前检查代码和注释。我想知道是否有可能在这个管道的末尾生成这个合并请求。gitlab存储库中是否有此设置,还是必须创建脚本才能实现?

旁注:

在发布这篇文章之前,我偶然发现了gitlab的这一部分文档

我正在使用gitlab-runner 11.0.0在ubuntu 18.04上

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-29 15:41:51

简短的回答:肯定--任何事情都是可能的。GitLab有一个很好的API (包括创建一个MR)。但我觉得走那条路是不对的。您应该根据GitLab的设计使用它。你开始合并请求太晚了。在开始任何工作之前启动它,合并请求将在整个分支期间保持打开。

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

  1. 有人针对存储库创建了一个问题。也许是一个特性请求,也许是一个实际的问题,不管是什么--有人想要改变一些东西,所以这是一个“问题”
  2. 开发人员打开该问题并单击创建合并请求
    • 这将生成一个合并请求(MR),这是一个匹配的分支,并将其与问题联系起来。

  1. Developer在分支中工作,并在更改过程中推送更改。
  2. 开发人员获得一个经过的管道,当他们准备好让客户预览工作和/或其他开发人员进行代码评审时,在合并请求页面上点击“解析WIP”。
  3. 在这里,让审阅者在检查完成后单击MERGE,或者更好地在存储库设置中打开审批,并设置您希望查看的人员或组。
  4. 在合并按钮的旁边,一定要删除源分支(为了保持正常),合并的代码将自动关闭问题,并将所有三个元素链接在一起。

从根本上讲,这与GitHub的工作方式(我来自这里)是从根本上说的,因为您不必告诉人们您在做什么。

  • 拉出请求 on GitHub是在工作完成后创建的,您希望合并到主服务器中。
  • Merge Request on GitLab是在工作开始时创建的,您希望告诉世界您即将着手开发一个特性。这允许人们在不需要的情况下快速关闭,或者防止多个开发人员重复工作。

编辑:,听起来您对利用API很感兴趣。实际上,有一个名为‘python’的python包可以很好地运行对象/mrs.html

代码语言:javascript
复制
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()

当然,这是一个例子,您将不得不调整它以满足您的精确需求。

票数 7
EN

Stack Overflow用户

发布于 2018-07-03 20:36:32

为了满足我的简单需求,我只是在管道中添加了最后一个阶段,它本质上执行了一个从这个职位改编的bash脚本。

编辑:应@Yuva的要求

代码语言:javascript
复制
# 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中

代码语言:javascript
复制
#!/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"
票数 10
EN

Stack Overflow用户

发布于 2018-11-26 17:24:03

另一种办法是:

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

通过电子邮件使用修补程序打开合并请求 GitLab长期以来一直支持通过电子邮件打开合并请求,但是在发送电子邮件之前,分支必须已经存在于服务器上。现在,您可以通过附加一个或多个修补程序文件(.patch)来打开仅使用电子邮件的合并请求。 补丁文件是系统之间共享和传输更改的标准。在GitLab的未来版本中,我们将在此基础上构建分布式合并请求,这将允许GitLab实例和其他Git宿主工具之间的合并请求。

文档问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51104622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档