通过gitlab api实现merge requests的自动合并,在使用api前我们需要先安装依赖及需要在gitlab配置帐户的token, 因为接下来需要用到token
go get -u github.com/xanzy/go-gitlab
package main import ( "fmt" "github.com/xanzy/go-gitlab" "log" "time" ) var ( // Your gitlab token token = "" // Your gitlab url url = "http://" // Name of your GITLAB project team groupName = "ops" ) func main() { for { git, err := gitlab.NewClient(token, gitlab.WithBaseURL(url)) if err != nil { log.Fatalf("Failed to create client: %v", err) } log.Println("开始获取所有组信息") u := &gitlab.ListGroupsOptions{ Search: gitlab.String(groupName), } group, _, err := git.Groups.ListGroups(u) if err != nil { fmt.Printf("获取组信息异常:%v", err) panic(err) } for _, group := range group { log.Println("组名:",group.Name, "创建时间:", group.CreatedAt.Format("2006-01-02")) if group.Name == groupName { // Get Merge Requests List log.Printf("获取:%v项目Merge Requests开始...", groupName) ListMergeOps := &gitlab.ListGroupMergeRequestsOptions{ OrderBy: gitlab.String("updated_at"), State: gitlab.String("opened"), Scope: gitlab.String("all"), } // List Group Merge mr, _, err := git.MergeRequests.ListGroupMergeRequests(group.ID, ListMergeOps) // List All Merge Requests //mr, _, err := git.MergeRequests.ListMergeRequests(ListMergeOps) if err != nil { panic(err) } for _, mr := range mr { log.Printf("用户:%v发起了一个MR请求,描述信息:%v, MR_ID: %v, 项目ID: %v", mr.Author.Name, mr.Title, mr.IID, mr.ProjectID) // Auto merge request MergeSave := &gitlab.AcceptMergeRequestOptions{} merge, code, err := git.MergeRequests.AcceptMergeRequest(mr.ProjectID, mr.IID, MergeSave) if err != nil { fmt.Println(err) } switch code.StatusCode{ case 405: log.Println("当前Merge Requests存在草稿,暂时不能合并") case 406: log.Println("Merge Requests合并失败,当前代码存在冲突请解决后再试!") case 200: log.Println("恭喜你,Merge Requests合并成功.") default: log.Println("等待下一次检查中.") } log.Println(merge) } } } time.Sleep(time.Duration(30)*time.Second) } }
接下来我们向gitlab发起一个merge requests,等待30s秒将会自动合并。
2021/03/26 16:34:12 开始获取所有组信息 2021/03/26 16:34:12 组名: ops 创建时间: 2021-03-08 2021/03/26 16:34:12 获取:ops项目Merge Requests开始... 2021/03/26 16:34:12 用户:张三发起了一个MR请求,描述信息:新增ibe配置, MR_ID: 6, 项目ID: 77 2021/03/26 16:34:14 恭喜你,Merge Requests合并成功.
基于Python 版本的gitlab requests 自动合并脚本
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @File : GitLab-API.py # @Author: 风哥 # @Email: gujiwork@outlook.com # @Date : 2021/3/25 # @Desc : gitlab自动合并请求 import gitlab from gitlab.exceptions import GitlabMRClosedError import time url = 'http://' # gitlab安装地址 private_token = '' # gitlab 登录密钥 需自己设置 while True: # 登录 获取gitlab操作对象gl gl = gitlab.Gitlab(url, private_token) group = gl.groups.get('ops') mrs = group.mergerequests.list(state='opened', order_by='updated_at') for i in mrs: msg = "用户:{0}发起了一个MR请求, 描述信息:{1}, MR_ID: {2}, 项目ID:{3}".format(i.author['name'], i.title, str(i.iid), str(i.project_id)) project = gl.projects.get(i.project_id, lazy=True) mr = project.mergerequests.get(i.iid, lazy=True) try: print("开始自动合并代码") mr.merge() print("自动合并MR成功!") except GitlabMRClosedError as e: if e.response_code == 405: print("MR存在Draft草稿, Closed关闭, Pipline状态, 返回状态码405不允许操作") elif e.response_code == 406: print("自动合并失败, 当前存在冲突,请手动解决后再试!") else: print("出现异常,暂时无法自动合并!") # print(mr) time.sleep(30)