虽然首选的方式是通过CI环境变量$CI_MERGE_REQUEST_IID获取,不过由于需要是mr的pipeline才会产生这个变量,所以不是每个场景都能生成。通用的方法是:
使用 python-gitlab
包来与 GitLab API 交互,可以使用以下命令进行安装:
pip install python-gitlab
然后,你可以使用下面的 Python 代码来获取特定分支关联的 Merge Request 的 ID:
import os
from gitlab import Gitlabdef get_mr_id(api_url, project_id, token, branch_name):gl = Gitlab(api_url, private_token=token)# 获取项目project = gl.projects.get(project_id)# 获取分支关联的 Merge Requestsmrs = project.mergerequests.list(source_branch=branch_name)# 获取第一个 Merge Request 的 IDif mrs:return mrs[0].idelse:return Noneif __name__ == "__main__":gitlab_api_url = "https://gitlab.example.com"project_id = "your_project_id"private_token = "your_private_token"branch_name = os.getenv("CI_COMMIT_REF_NAME") # 使用 CI 环境变量获取当前分支的名称mr_id = get_mr_id(gitlab_api_url, project_id, private_token, branch_name)if mr_id:print(f"Merge Request ID: {mr_id}")else:print(f"No Merge Request found for branch {branch_name}")
请替换示例中的 "https://gitlab.example.com"
, "your_project_id"
, "your_private_token"
和相应的环境变量使用方式,确保其适应你的实际情况。
上述代码使用了 python-gitlab
包,创建了一个 Gitlab 实例,然后获取了指定分支关联的 Merge Requests,最后输出第一个 Merge Request 的 ID。如果没有找到关联的 Merge Request,则输出相应的消息。
由于一个分支可能存在多个MR,project.mergerequests.list(source_branch=branch_name)
会将所有分支列出来,可以通过状态来指定:例如只要open的分支:project.mergerequests.list(source_branch=branch_name, state='opened')