使用gitlab API

作者: 每天多一点 | 来源:发表于2015-03-17 11:03 被阅读21741次

    动机

    gitlab是一个类似于github的配置管理服务, 目前已经有丰富的Hook服务和API服务, 能够很好的支持持续集成. 本文介绍了笔者是如何开始使用gitlab提供的API的. 需求比较简单, 取得gitlab上一个repo的某一个文件的内容.

    准备

    gitlab API的使用可以参考你所使用的gitlab服务上的帮助文档.

    gitlab.png

    帮助文档已经比较完善了. gitlab有多种语言版本的client支持, 这里我们使用最直接的http方式. 文档上给除了如下的例子

    GET http://example.com/api/v3/projects?private_token=QVy1PB7sTxfy4pqfZM1U
    

    curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" "http://example.com/api/v3/projects"
    

    这两个例子分别列举了token作为参数, 和作为Header是的使用方法. 在我们的程序中, 我们只需要选择一种自己觉得方便的方式就可以了. 这里我选择用参数的方式加载token.

    token作为用户调用api的唯一标识, 在账户的profile下可以找到

    token.png

    实践

    这里我使用自己比较熟悉的python语言和其requests扩展包来作为示例

    • 通过查阅api的帮助文档, 我们可以推断出, 想访问某个项目的内容, 首先需要知道这个项目的id.
      查阅api文档, 发现列举项目的api如下
    GET /projects
    

    其返回一个Json形式的数据组.

    所以编写如下的脚本取得当前用户能够访问的所有项目信息

    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的返回值大多是分页的, 这里将页面的内容扩展为50个(项目). 如果当前用户可以访问的项目太多, 以至于超过页面容量, 那么在返回值里因为默认返回一页, 可能就找不到想找的项目
    • 这里我们在屏幕上打印了"Snack-Cherry" 这个项目的id
    • 找到了project id, 我们就可以使用这个id来访问指定的项目了.
    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"}'
    

    原来是有两个参数忘记加上了.重新修改url如下

    url = 'http://gitlab.myserver.com//api/v3/projects/24948/repository/files?private_token=XXXXX&file_path=myfolder/myfile.txt&ref=master'
    

    这样我们就得到指定的文件了.

    • 解析文件内容.
    data = r.json['content']
    print data
    

    结果我们得到了一堆如下的文字:

    'KioqIFNldHRpbmdzICoqKgpTdWl0ZSBTZXR1cCAgICAgICDlhbP...
    

    这是为什么呢? 在API说明上我们可以找到答案:
    Note that file content is Base64 encoded.

    所以我们还需要将内容转换成UTF-8或者其他可以输出的形式:

    import base64
    print base64.b64decode(data)
    

    可以看到屏幕上打出了文件的内容.

    总结

    gitlab API的文档已经比较详实, 读者可以自行选择语言进行调用. 细节问题可以仔细阅读文档寻找答案.

    相关文章

      网友评论

      • 带梦飞翔_1c3c:大佬,请问两个问题,我写的跟你一模一样,但是我的总是提示ref missing。第二关键问题,gitlap api中有关于上传文件的接口吗?不是新建文件,是上传一个文件夹。
        每天多一点:git仓库的路径必须要有文件才可以存在, 不会单独保留一个空文件夹的. 所以关于如何实现你的需求, 我猜测是应该上传一个新路径下的文件. 你按照这个做法试一下?
      • 四明羽客:Python-gitlab库,封装了gitlab api
      • 926c06c2d553:请问v3是什么含义?我输入ip:/api/v3提示显示404
        每天多一点:v3在这里代表api的版本号。当网站的api有version3这个版本才可以访问到。你的情况应该是你的服务器没有v3这个版本。你可以去掉v3试试。
      • bb66fcaf5140:为什么我这里r.json['content']打印不出来呢?提示错误:TypeError: 'instancemethod' object has no attribute '__getitem__'。
        而我打印这个r.json的类型是instancemethod。
        每天多一点:你可以看一下 r.text 是什么, 如果有错误的话, 返回的内容可能不是json
      • 0bcce8e4a447:你好博主,请问gitlab有新建文件的api吗,我找了一圈没找到
        每天多一点:帮助下面有的, 路径大概如下:
        help/api/repository_files.md
        你搜一下: Create new file in repository
      • 梦想做小猿:你好,gitlab api默认返回一页,怎么获取到其他分页的数据呢?
        926c06c2d553:@蔡大哥_014e 强无敌,请问是在哪看到这个参数的?我在Help-API-Branches里面没看到这种写法
        蔡大哥_014e:?page=2&per_page=10
        每天多一点:@梦想做小猿 接口有制定大小的
      • 定世丶:请问大师,创建分支的 api怎么写啊,我一直报500的错误
        7秒享爱:服务端错误,检查你的gitlab

        response = requests.post('http://gitlab.xxx/api/v4/projects/4/repository/branches', {'branch':'develop','ref':'master', 'private_token':'xxxxx'})

      本文标题:使用gitlab API

      本文链接:https://www.haomeiwen.com/subject/ulvixttx.html