
文章前言
每周五上午十二點前需要將專案上各組開發分支合并軟集倉庫分支, 需要在十個專案上進行 merge
程式員一般都是 很討厭麻煩, 所以撰寫此腳本進行 批量 merge, 統一進行合并
另外, 如果專案經歷上線或者修復 bug 等情況, 需要合并分支至 uat、release、master 等分支, 也是能夠滿足此腳本使用情況
類似于這種功能性腳本, 一般習慣使用 Python 來撰寫, 通過 GitLab 提供的 REST API 進行呼叫
GitLab 提供了非常豐富的 REST API 操作, 大家可以搜索官方網址查看
腳本思路
參考了網上大家提供的一部分腳本, 結合專案本身提供了此思路
- 在 GitLab 中獲取個人令牌 Token
- 獲取需要合并的專案 ID
- 獲取需要合并專案的來源分支以及目標分支
- 驗證 GitLab 對應的 Token 是否正確
- 進行合并請求, 失敗會洗掉對應的合并請求
在網上找到的大部分執行不成功, 可能在之前是可以成功的, 但是隨著 GitLab 的 API 3->4 升級, 網上大部分腳本都執行失敗了
運行前準備
首先, 電腦上需要 安裝 python3 運行環境, 將對應的 import 包依賴進行下載, 最重要的就是 獲取令牌 Token
登陸進 GitLab 設定頁面, 點擊訪問令牌
我設定了中文, 不過差別不大, Token 還是很好認的

依次輸入 Token名稱、Token有效期、以及對應的權限范圍, 將對應的 Token 復制到對應的腳本就好了

具體實作代碼
import urllib.request
import gitlab
# ========================================配置開始=================================================
# ?? 專案名, 無實際意義
project_name = "xxxx"
# ?? 代表多個專案 ID, 平常一個專案即可, 多個專案需要保證 source_branch、target_branches 保持一致
project_id_list = ['xxxx']
# ?? 生成 gitlab 物件
gitlab_url = 'xxxx'
# ?? 需要生成自己的令牌 token
token = 'xxxx'
# ?? 將 source_branch 分支 merge target_branches 分支集上
source_branch = 'test'
target_branches = ['master']
# =========================================配置結束================================================
# 驗證登錄
gl = gitlab.Gitlab(gitlab_url, token)
def main():
for project_id in project_id_list:
project = gl.projects.get(project_id)
print(' >>> 專案ID :: [%s], 專案名稱 :: [%s] ' % (str(project.id), project_name))
for target in target_branches:
print(" >>> 正在合并專案 :: [%s] 的 [%s] 分支到 [%s] 分支" % (project_name, source_branch, target))
# mr合并請求的物件
mr = None
try:
# 創建 merge request
mr = project.mergerequests.create({'source_branch': source_branch,
'target_branch': target,
'title': "Merge branch '%s' into '%s'" % (
source_branch, target)
})
# 接受合并請求
url = '%s/api/v4/projects/%s/merge_requests/%s/merge' % (gitlab_url, project.id, mr.iid)
print(' >>> Merge url :: [%s], title :: [%s] ' % (url, mr.title))
# 個人/專案訪問令牌, 添加至請求頭
headers = {"PRIVATE-TOKEN": token}
req = urllib.request.Request(url=url, headers=headers, method="PUT")
resp = urllib.request.urlopen(req)
if resp.code == 200:
print(" >>> 合并到目標分支 [%s] 成功, 結束... \r\n" % target)
else:
mr.delete()
except Exception as e:
print(" >>> 合并出錯, 可能有沖突未解決或者 [%s] 分支并沒有更新, 例外資訊:: \r\n" % source_branch, str(e))
# 把創建的 merge 請求洗掉
mr.delete()
if __name__ == "__main__":
main()
拓展點
這個腳本是有局限性的, 如果遇到 多專案, 對來源以及目標分支進行合并就無能為力了
如果熟悉 python 的小伙伴可以自行改造, 如果存在這樣的需求又不想寫的, 可以公眾號聯系
作者是個比較懶的人, 如果能一勞永逸, 是不會重復勞動的
所以類似于這種需求, 后面會寫個定時任務, 如果合并失敗用釘釘機器人進行通知, 希望最近有時間寫
文末的話
最近也是在研究 JUC 下的原始碼并發包, 會以專題的形式做一個比較詳細的總結
由于作者水平有限, 希望大家能夠反饋指正文章中錯誤不正確的地方, 感謝 🙏
小伙伴的喜歡就是對我最大的支持 😄 , 希望大家能夠 點贊、評論、關注三連!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172405.html
標籤:其他
上一篇:記專業課程設計
下一篇:資料結構
