Qiuliang's Site

做一个独立思考和具备创新能力的人,打造谦逊和强大的内心

基于GitLab API实现自动化任务

背景

之前在团队里基于git、maven、nexus、jenkins搭建适合中小型技术团队的CI平台,这套系统运行近一年,整体来说还是比较稳定可靠,使用起来也比较方便,基本解决了中小规模团队的CI需求。

但有个功能一直未完善,使用起来略有不便,就是自动打tag,因我们的build和部署是采用了两套jenkins去实现,而在部署环节的jenkins,是不需要和git交互的,因此也不方便使用类似:git tag 这样的命令去完成自动打tag的功能。

因此首先想到的解决方案便是在部署机上通过插件或CURL等方式去调用gitlab的一个api,这样应该能够解决这个问题。

实现

研究了下gitlab的官方文档,发现确实有提供相关API来进行tag的创建,除此之外,还提供了很多其他API,足够你实现很多方便的功能。

授权

调用api都需要使用一个gitlab账号的private token,每个git账号都有不同的private token,查看方法: 登录gitlab,进入Profile Setting — Account,可以看到如下界面:

这个token可以通过header或者query string方式加到调用请求里。

调用API

以创建tag为例,其api形式如下:

POST /projects/:id/repository/tags

其中参数id可以通过另一接口获取:

GET /projects

传入必须的参数后,gitlab会返回类似于如下的消息,则说明创建tag成功:

{
  "name": "test",
  "message": null,
  "commit": {
    "id": "7cdbfcf12de62dae7fef5ad7eac6b41ab6d04ad9",
    "message": "Merge branch 'weixin' into develop\n",
    "parent_ids": [
      "82e05eb5e681f46810b6e113140bc8577ee0ec64",
      "bb2c9646608196eaf4fb5b9b39b5f74bfd9df9b1"
    ],
    "authored_date": "2016-05-30T18:06:53.000+08:00",
    "author_name": "test",
    "author_email": "qiuliang@sohochina.com",
    "committed_date": "2016-05-30T18:06:53.000+08:00",
    "committer_name": "test",
    "committer_email": "qiuliang@sohochina.com"
  },
  "release": null
}

部署成功后调用api

直接基于jenkins提供的后置脚本功能即可,首先增加全局环境变量配置:GIT_API_TOKEN,其余参数可以为每个project进行配置。

shell代码如下:

curl -X POST \
--header "PRIVATE-TOKEN: $GIT_API_TOKEN" \
--data "tag_name=$Version&ref=$Tag_Ref&release_description=$Tag_Desc" \
http://code.gitlab.com/api/v3/projects/1/repository/tags

完成以上配置,在每次部署成功后都会调用gitlab的api自动创建tag。