每週五上午十二點前需要將專案上各組開發分支合併軟集倉庫分支, 需要在十個專案上進行 merge
程式設計師一般都是 很討厭麻煩, 所以編寫此指令碼進行 批次 merge, 統一進行合併
另外, 如果專案經歷上線或者修復 bug 等情況, 需要合併分支至 uat、release、master 等分支, 也是能夠滿足此指令碼使用情況
類似於這種功能性指令碼, 一般習慣使用 Python 來編寫, 通過 GitLab 提供的 REST API 進行呼叫
GitLab 提供了非常豐富的 REST API 操作, 大家可以搜尋官方網址檢視
參考了網上大家提供的一部分指令碼, 結合專案本身提供了此思路
在網上找到的大部分執行不成功, 可能在之前是可以成功的, 但是隨著 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 下的原始碼並行包, 會以專題的形式做一個比較詳細的總結
由於作者水平有限, 希望大家能夠反饋指正文章中錯誤不正確的地方, 感謝 🙏
小夥伴的喜歡就是對我最大的支援 😄 , 希望大家能夠 點贊、評論、關注三連!