虽然首选的方式是通过CI环境变量$CI_MERGE_REQUEST_IID获取,不过由于需要是mr的pipeline才会产生这个变量,所以不是每个场景都能生成。通用的方法是:
使用 python-gitlab
包来与 GitLab API 交互,可以使用以下命令进行安装:
pip install python-gitlab
然后,你可以使用下面的 Python 代码来获取特定分支关联的 Merge Request 的 ID:
import os
from gitlab import Gitlab
def get_mr_id(api_url, project_id, token, branch_name):
gl = Gitlab(api_url, private_token=token)
# 获取项目
project = gl.projects.get(project_id)
# 获取分支关联的 Merge Requests
mrs = project.mergerequests.list(source_branch=branch_name)
# 获取第一个 Merge Request 的 ID
if mrs:
return mrs[0].id
else:
return None
if __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')