使用gitlab API

動(dòng)機(jī)

gitlab是一個(gè)類似于github的配置管理服務(wù), 目前已經(jīng)有豐富的Hook服務(wù)和API服務(wù), 能夠很好的支持持續(xù)集成. 本文介紹了筆者是如何開始使用gitlab提供的API的. 需求比較簡(jiǎn)單, 取得gitlab上一個(gè)repo的某一個(gè)文件的內(nèi)容.

準(zhǔn)備

gitlab API的使用可以參考你所使用的gitlab服務(wù)上的幫助文檔.

gitlab.png

幫助文檔已經(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是的使用方法. 在我們的程序中, 我們只需要選擇一種自己覺得方便的方式就可以了. 這里我選擇用參數(shù)的方式加載token.

token作為用戶調(diào)用api的唯一標(biāo)識(shí), 在賬戶的profile下可以找到

token.png

實(shí)踐

這里我使用自己比較熟悉的python語(yǔ)言和其requests擴(kuò)展包來(lái)作為示例

  • 通過查閱api的幫助文檔, 我們可以推斷出, 想訪問某個(gè)項(xiàng)目的內(nèi)容, 首先需要知道這個(gè)項(xiàng)目的id.
    查閱api文檔, 發(fā)現(xiàn)列舉項(xiàng)目的api如下
GET /projects

其返回一個(gè)Json形式的數(shù)據(jù)組.

所以編寫如下的腳本取得當(dāng)前用戶能夠訪問的所有項(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)前用戶可以訪問的項(xiàng)目太多, 以至于超過頁(yè)面容量, 那么在返回值里因?yàn)槟J(rèn)返回一頁(yè), 可能就找不到想找的項(xiàng)目
  • 這里我們?cè)谄聊簧洗蛴×?Snack-Cherry" 這個(gè)項(xiàng)目的id
  • 找到了project id, 我們就可以使用這個(gè)id來(lái)訪問指定的項(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...

這是為什么呢? 在API說(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é)問題可以仔細(xì)閱讀文檔尋找答案.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評(píng)論 25 709
  • 1. Gitlab api 格式 2. Python 使用庫(kù) urllib2 3. 獲取項(xiàng)目列表
    Leebor閱讀 2,042評(píng)論 0 0
  • 前言 Gitlab作為一個(gè)開源、強(qiáng)大的分布式版本控制系統(tǒng),已經(jīng)成為互聯(lián)網(wǎng)公司、軟件開發(fā)公司的主流版本管理工具。使用...
    月強(qiáng)閱讀 63,785評(píng)論 12 28
  • 你知道嗎?其實(shí)我并不是不愛你了,而是不能愛了。 你知道嗎?我綁你回來(lái),只是想將我打下的江山送給你,護(hù)你百歲...
    司吾墨閱讀 235評(píng)論 0 0

友情鏈接更多精彩內(nèi)容