为 GitLab 编写自动合并 Merge Request 的脚本

Write script for GitLab for automatic merge of Merge Request

我正在尝试编写一个脚本来合并已打开且符合合并请求标准(通过设置实现)的合并请求。

所以我唯一想做的就是,我想写一个 CI yaml 文件,我将安排每 30 分钟左右 运行 检查打开的合并请求并合并如果它们可以合并。

困惑一:

我可以通过编写多个 curl 请求来实现这一点,但我不确定在执行后如何一个接一个地使用它们。

因此,要检查打开的合并请求,我需要一组项目的 ID,以便我有一个 curl 命令,它会为我提供项目 ID,我将它们保存在一个文件中 projectid.txt.

curl -s --location --request GET --header 'PRIVATE-TOKEN:<PRIVATE_TOKEN>' '$CI_API_V4_URL/groups/'$GROUPID'/projects'  | sed 's/,/\n/g' | grep -w "id" | awk -F ':' '{print }' | sed -s 's/{"id"//g' 

现在,一旦我有了所有的项目 ID, 我想将它们流入另一个 curl 命令,即:

curl -s --location --request GET '$CI_API_V4_URL/projects/3/merge_requests?state=opened' --header 'PRIVATE-TOKEN:<PRIVATE_TOKEN>' | sed 's/,/\n/g' | grep -w "iid" | awk -F ':' '{print }' 

但是如果您看到上面的 curl 请求,我将手动给出 3 以获得所需的输出。

但我希望此 curl 命令自动获取 projectid.txt 每一行中存在的每个 projectid 并将其执行到第二个 curl 命令。这样我想要一个文件来显示打开的合并请求明智的项目。

获得所有这些信息后,我想合并有效且准备好合并的开放合并请求(GitLab 负责检查它们是否准备好合并)

所以,我现在唯一需要做的就是在另一个作为 PUT 请求的 curl 命令中输入 projectid & merge request id

curl --location --request PUT '$CI_API_V4_URL/projects/3/merge_requests/26/merge' \
--header 'PRIVATE-TOKEN: <PRIVATE_TOKEN>'

来源:https://docs.gitlab.com/ee/api/merge_requests.html#accept-mr

如果你看到上面的合并请求,我需要提供项目明智的合并请求。我对如何自动化它有点困惑。

此外,您能告诉我这是否是在我的 gitlab-ci.yml 文件中使用这么多 curl 请求来自动执行此操作的正确方法吗?有没有其他方法可以通过 Python 或 shell 脚本来做到这一点?

另外,有什么简单的方法可以借助 REST API 文档编写 python 脚本吗?我能够生成 curl 请求来使用 REST API,但不确定如何使用 Python.

来实现

欢迎任何帮助或建议。

我的 gitlab-ci.yml 文件到目前为止看起来是这样的,因为在这一点之后我无法思考太多:

variables:
  GROUPID: 6
stages:
  - cleanup

cleanup-code-job:
  stage: cleanup
  tags:
    - build
  script:
    - echo "$GROUPID"
    ##Below curl command can be used to identify projects in group
    - curl -s --location --request GET --header 'PRIVATE-TOKEN:<PRIVATE_TOKEN>' '$CI_API_V4_URL/groups/'$GROUPID'/projects'  | sed 's/,/\n/g' | grep -w "id" | awk -F ':' '{print }' | sed -s 's/{"id"//g' > projects.txt
    - cat projects.txt

谢谢

使用 python-gitlab library,python 脚本使此任务的脚本编写变得更加简单,尤其是在分页方面。

此外,您可以使用 Group merge requests API 作为快捷方式,而不是列出组中的所有项目,然后列出每个项目中的所有合并请求。

使用 Python 脚本,它可能看起来像这样:

import gitlab
from gitlab.v4.objects import GroupMergeRequest
TOKEN = "your API key"
GITLAB_HOST = 'https://gitlab.com' # or your instance
gl = gitlab.Gitlab(GITLAB_HOST, private_token=TOKEN)

GROUP_ID = 123

def mr_meets_merge_criteria(mr: GroupMergeRequest) -> bool:
    """
    A function to check if it meets criteria to
    be merged automatically by this script
    """
    print(mr.project_id)
    print(mr.merge_status)  # e.g. 'can_be_merged'
    # check something
    ...
    return True | False

group = gl.groups.get(GROUP_ID)

# loop over all merge requests in the group
for mr in group.mergerequests.list(as_list=False):
    if mr_meets_merge_criteria(mr):
        project = gl.projects.get(mr.project_id, lazy=True)
        project_mr = project.mergerequests.get(mr.iid)
        project_mr.merge()

因此,如果您输入正确的常量并完成 mr_meets_merge_criteria 函数的实现,这应该是所需要的:-)