一.簡介
Gitlab作為一個開源、強大的分布式版本控制系統,已經成為互聯網公司、軟件開發公司的主流版本管理工具。使用過Gitlab的都知道,想要提交一段代碼,可以通過git push提交到遠程倉庫,也可以直接在Gitlab平台上修改提交。然而上述兩種提交方式都是人工提交代碼,需要手動登錄Gitlab或者在第一次commit的時候提供Gitlab帳號和密碼。
那么,假設有這么一個需求場景:我們開發了一個效率平台,可以自動拉分支、自動提交代碼到遠程倉庫。這個需求該如何實現?其實很簡單,Gitlab提供了一套完整的API,讓第三方平台可以通過API自動創建帳號、自動提交代碼、自動拉分支,等等。API涉及到的功能非常全面,覆蓋了分支、tag、代碼提交、用戶、群組、項目等,基本上人工可以做的所有操作,都可以通過API自動實現。
Gitlab的Api的文檔入口為http://{gitlab_host}/help/api/README.md
二.技術要點
Gitlab本質上也是一個web服務器,Gitlab官方提供了一個非常完整的restful API,我們可以使用apache開發的一個工具包HttpClient,HttpClient可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。
當我們想要執行某種操作時,我們只需要在Gitlab的api文檔上查找到對應的路徑,然后在自己的后台利用HttpClient將對應的鏈接發送至Gitlab服務器即可,HttpClient功能非常強大,支持get,post,put,delete等七種請求方式。
附錄一個講解HttpClient非常完善的HttpClient 4.3教程
三.案例
獲取每個項目下的用戶信息
#!/usr/bin/env python
#-*-coding:utf-8-*-
import requests
url = 'http://x.x.x.x/api/v3/projects?private_token=oMJwN5ErC8_n1QvTsyDR&per_page=50' #private_token為必須項,這里為獲取所有的項目信息
user_url= 'http://x.x.x.x/api/v3/projects/{}/users?private_token=oMJwN5ErC8_n1QvTsyDR&per_page=100' #獲取每個項目下的用戶信息
#http://10.10.10.217/api/v3/projects/45/users?private_token=oMJwN5ErC8_n1QvTsyDR #獲取項目id為45的信息
#獲取項目id和項目名稱
def GetProject_id(project_url):
r = requests.get(project_url)
data = r.json()
ProjectId_list = []
ProjectName_list = []
for i in data:
ProjectId_list.append(i['id'])
ProjectName_list.append(i['name'])
return ProjectId_list,ProjectName_list
#根據項目id獲取項目下的用戶信息
def GetProject_userlist():
IdList = GetProject_id(url)
project_id = IdList[0]
project_name = IdList[1]
for id in project_id:
l = []
project_user = requests.get(user_url.format(id)) #生成完整的用於顯示項目下所有user的連接
req_data = project_user.json()
for i in req_data:
l.append(i['name'])
print (project_name[project_id.index(id)],l)
GetProject_userlist()
執行結果:項目名稱,用戶列表
示例:獲取某些項目是否提交代碼以及提交時間
#-*-coding:utf-8-*-
import requests
import re
url = 'http://10.10.10.217/api/v3/projects?private_token=oMJwN5ErC8_n1QvTsyDR&per_page=50'
r =requests.get(url)
p_group = ['HJ']
data = r.json()
print ("項目名稱",' '*20,'最近提交時間')
for i in data:
if i['ssh_url_to_repo'].split(':')[1].split('/')[0] in p_group:
r1 = requests.get(
'http://x.x.xx.x/api/v3/projects/%d/repository/commits/master?private_token=xxxxxxxxxxxxxxxxx'
% i['id'])
data2 = r1.json()
if data2['message'].strip() == '404 Commit Not Found':
print (i['ssh_url_to_repo'].split(':')[1],' '*11,'未提交任何代碼')
else:
print(i['ssh_url_to_repo'].split(':')[1], ' ' * 11, data2['committed_date'][:10])