zoukankan      html  css  js  c++  java
  • Python+gitlab实现分支批量合并打tag

      最近公司代码托管有SVN迁移到Gitlab,每次版本发布都要将代码合并至master分支且打tag,应用较多重复且繁琐,于是使用Python+gitlab实现分支批量合并打tag;

    参考 python-gitlab文档

    环境准备:

    1.Python3

    2.pip install python-gitlab

    token:gitlab用户令牌,生成如下:

    在gitlab用户的setting--access token--填写name+api+read_repository--create personal access token,会生成一个字符串
    import gitlab, time
    
    
    url = 'XXXXXXXXXX'    # gitlab地址
    token = 'XXXXXXXXXX'    # gitlab用户令牌
    
    # 登录
    gl = gitlab.Gitlab(url, token)
    
    dec_message = str(time.localtime().tm_year) + "" + str(time.localtime().tm_mon) + "" + str(
        time.localtime().tm_mday) + "日发布"
    
    
    class gitlab_operation(object):
        
        def __init__(self):
            self.merge_tag = False
    
        def gitlab_merge(self, project_name, merge_tile):
            # 根据id获得project对象
            project = gl.projects.get(app_dic[project_name])
    
            # 创建一个merge request
            try:
                mr = project.mergerequests.create({'source_branch': 'test',
                                                   'target_branch': 'master',
                                                   'title': merge_tile, })
    
                # 更新一个merge request 的描述
                mr.description = merge_tile
                mr.save()
                mr.merge()
            except Exception as e:
                print(project_name + "出现错误,错误如下:
    " + str(e))
                self.merge_tag = False
            else:
                print(project_name + "合并成功,合并标题为:" + merge_tile)
                self.merge_tag = True
            # 1表示合并成功,可以后续打tag,0则表示合并失败,后续不打tag
            return self.merge_tag
    
        def gitlab_tag(self, project_name, tag_description):
            project = gl.projects.get(app_dic[project_name])
            tags = project.tags.list()
    
            # 如果有历史tag
            if tags:
                last_tag_name = tags[0].attributes["name"]
    
                # 最后需要加1
                version_num = int(last_tag_name[18:20]) + 1
                # 拼接,满足 tag_202008010_V1.0.01 格式
                new_tag_name = "tag_" + time.strftime("%Y%m%d") + "_V1.0." + "{0:0>2}".format(version_num)
                tag = project.tags.create({'tag_name': new_tag_name, 'ref': 'master'})
                tag.set_release_description(tag_description)
                print(project_name + "打tag成功" + new_tag_name)
    
            # 如果第一次打tag
            else:
                new_tag_name = "tag_" + time.strftime("%Y%m%d") + "_V1.0.01"
                tag = project.tags.create({'tag_name': new_tag_name, 'ref': 'master'})
                tag.set_release_description(tag_description)
                print(project_name + "打tag成功" + new_tag_name)
    
    
    if __name__ == "__main__":
        # git工程格式为"app_name":app_dic[project_name] ,
        app_dic = {
    
            "app_name":app_id,
            ...
        }
        gitlab_handle = gitlab_operation()
        for i, j in app_dic.items():
            print("开始处理" + i + str(j) + "项目")
            if gitlab_handle.gitlab_merge(i, dec_message):
                gitlab_handle.gitlab_tag(i, dec_message)
            else:
                print(i + "合并失败,请手动打tag")
  • 相关阅读:
    查看Linux主机CPU及内存信息
    linux配置java环境变量(详细)
    Linux安装Redis
    Linux关闭防火墙
    使用Unison同步服务器目录
    Nginx详细配置
    CentOS命令行无线上网
    SQL Server查询所有的表名/空间占用量/行数
    CentOS安装Nginx安装详解
    基于 Django 2.0.4 的 djcelery 配置
  • 原文地址:https://www.cnblogs.com/jiahm/p/13472024.html
Copyright © 2011-2022 走看看