使用的接口文档见:https://python-gitlab.readthedocs.io/en/stable/gl_objects/merge_requests.html
import gitlab
idMap = {
"A": "111"
}
tokenMap = {
"A": "glpat-aaa"
}
def merge(prj,source,target):
title = f'{prj}——同步{source}分支到{target}'
print(title)
gl = gitlab.Gitlab('https://gitlab.xx.com', private_token=tokenMap[prj])
project = gl.projects.get(idMap[prj])
mr_list = project.mergerequests.list(source_branch=source, target_branch=target, state='opened')
if(len(mr_list)>0):
mr = mr_list[0]
else:
mr = project.mergerequests.create({
'source_branch': source,
'target_branch': target,
'title': title,
'description': 'Automatically generated merge request by script'
})
if(mr.changes()['changes_count'] is None or mr.changes()['changes_count'] == '0'):
mr.title = '无变更,忽略'
mr.save()
elif(mr.has_conflicts):
mr.title = title + '存在冲突!'
mr.save()
print(mr.title)
print("")
if __name__ == "__main__":
merge("A","master","xxx")
print("结束,按回车键退出!")
input()
脚本内容说明:
idMap为gitlab上项目对应的项目id,在项目详情中可以看到。
tokenMap为gitlab中项目接口的授权token,在设置中可以生成。
idMap和tokenMap通过key进行关联。
脚本只是自动发起mergerequests请求,遇到分支有冲突则会自动修改title标记冲突(这里存在问题,有时候识别会不准,考虑可能是gitlab在拿到mr对象之后,分支冲突的检测还未处理完毕导致)。
想要真正合并分支还需要手动到gitlab上点合并,或者可以修改脚本,使用mr.merge()方法进行自动合并。(冲突状态调用会报错还是怎样未尝试,考虑分支合并比较严谨,估未开启,手动审阅把一道关)