動(dòng)機(jī)
gitlab是一個(gè)類(lèi)似于github的配置管理服務(wù), 目前已經(jīng)有豐富的Hook服務(wù)和API服務(wù), 能夠很好的支持持續(xù)集成. 本文介紹了筆者是如何開(kāi)始使用gitlab提供的API的. 需求比較簡(jiǎn)單, 取得gitlab上一個(gè)repo的某一個(gè)文件的內(nèi)容.
準(zhǔn)備
gitlab API的使用可以參考你所使用的gitlab服務(wù)上的幫助文檔.
幫助文檔已經(jīng)比較完善了. gitlab有多種語(yǔ)言版本的client支持, 這里我們使用最直接的http方式. 文檔上給除了如下的例子
GET http://example.com/api/v3/projects?private_token=QVy1PB7sTxfy4pqfZM1U
和
curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" "http://example.com/api/v3/projects"
這兩個(gè)例子分別列舉了token作為參數(shù), 和作為Header是的使用方法. 在我們的程序中, 我們只需要選擇一種自己覺(jué)得方便的方式就可以了. 這里我選擇用參數(shù)的方式加載token.
token作為用戶(hù)調(diào)用api的唯一標(biāo)識(shí), 在賬戶(hù)的profile下可以找到
實(shí)踐
這里我使用自己比較熟悉的python語(yǔ)言和其requests擴(kuò)展包來(lái)作為示例
- 通過(guò)查閱api的幫助文檔, 我們可以推斷出, 想訪(fǎng)問(wèn)某個(gè)項(xiàng)目的內(nèi)容, 首先需要知道這個(gè)項(xiàng)目的id.
查閱api文檔, 發(fā)現(xiàn)列舉項(xiàng)目的api如下
GET /projects
其返回一個(gè)Json形式的數(shù)據(jù)組.
所以編寫(xiě)如下的腳本取得當(dāng)前用戶(hù)能夠訪(fǎng)問(wèn)的所有項(xiàng)目信息
import requests
url = 'http://gitlab.myserver.com/api/v3/projects?private_token=XXXXXX&per_page=50'
r = requests.get(url)
data = r.json
for i in data:
if i[u'name']=='Snack-Cherry':
print i[u'id']
- gitlab API的返回值大多是分頁(yè)的, 這里將頁(yè)面的內(nèi)容擴(kuò)展為50個(gè)(項(xiàng)目). 如果當(dāng)前用戶(hù)可以訪(fǎng)問(wèn)的項(xiàng)目太多, 以至于超過(guò)頁(yè)面容量, 那么在返回值里因?yàn)槟J(rèn)返回一頁(yè), 可能就找不到想找的項(xiàng)目
- 這里我們?cè)谄聊簧洗蛴×?Snack-Cherry" 這個(gè)項(xiàng)目的id
- 找到了project id, 我們就可以使用這個(gè)id來(lái)訪(fǎng)問(wèn)指定的項(xiàng)目了.
GET /projects/:id/repository/files
使用如下的代碼
url = http://gitlab.myserver.com//api/v3/projects/24948/repository/files?private_token=xxxx
r = requests.get(url)
print r.text
但是我們得到了如下的輸出
u'{"message":"400 (Bad request) \\"file_path\\" not given"}'
原來(lái)是有兩個(gè)參數(shù)忘記加上了.重新修改url如下
url = 'http://gitlab.myserver.com//api/v3/projects/24948/repository/files?private_token=XXXXX&file_path=myfolder/myfile.txt&ref=master'
這樣我們就得到指定的文件了.
- 解析文件內(nèi)容.
data = r.json['content']
print data
結(jié)果我們得到了一堆如下的文字:
'KioqIFNldHRpbmdzICoqKgpTdWl0ZSBTZXR1cCAgICAgICDlhbP...
這是為什么呢? 在A(yíng)PI說(shuō)明上我們可以找到答案:
Note that file content is Base64 encoded.
所以我們還需要將內(nèi)容轉(zhuǎn)換成UTF-8或者其他可以輸出的形式:
import base64
print base64.b64decode(data)
可以看到屏幕上打出了文件的內(nèi)容.
總結(jié)
gitlab API的文檔已經(jīng)比較詳實(shí), 讀者可以自行選擇語(yǔ)言進(jìn)行調(diào)用. 細(xì)節(jié)問(wèn)題可以仔細(xì)閱讀文檔尋找答案.