最近公司代碼托管有SVN遷移到Gitlab,每次版本發布都要將代碼合並至master分支且打tag,應用較多重復且繁瑣,於是使用Python+gitlab實現分支批量合並打tag;
環境准備:
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")