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 + "出現錯誤,錯誤如下:\n" + 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")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM