点击上方“前端小苑”,选择“置顶公众号”
精品技术文章,热门资讯第一时间送达
本文将通过实现前端组件库的更新日志,来介绍gitlab API的使用过程。
起因
我们团队组件库的更新日志,一直是人工维护的,每次有更新,merge到master后,创建tag,然后在wiki中手动进行更新。这样很不方便,就想寻求一种创建tag后能自动生成更新日志的方法,于是乎,就发现了今天的主角 gitlab API。
gitlab API介绍
gitlab API是gitlab提供的一套十分完善的restful风格的api,通过调用这些api可以完成几乎所有手动操作的工作,实现自动化。
我们可以在Help中找到完整的API文档。
可以通过下图看一下这些API能做哪些事:(下图只梳理了一部分我认为重要的api)
可以看出,gitlab API十分强大,下面我们就看一下具体要怎么使用它。
gitlab API使用
首先介绍下实现更新日志的思路,目标是做一个像下图(element ui的更新日志截图)这样的更新日志。
更新日志内容中包含版本号(tag),更新日期,更新内容描述,代码的提交者。
gitlab 的 tags API提供了这些数据,我们只需要在每次创建tag时,按照一定规则来添加更新信息。然后通过tags API获取到当前项目的所有tag信息,按照时间降序进行排序,再映射成前端日志页面需要的数据格式,这样更新日志就完成了。
下面介绍下这个过程中gitlab API的具体使用:
一.获取private_token
gitlab的API 需要用private_token来验证身份,不合法的private_token会响应401, private_token可以通过两种方式获得:
1.查看User Settings
2.通过Session API 获取
调用Session API,可以通过用户名/邮箱和密码作为参数来获取private_token。下面使用cURL命令做示例:
curl --request POST "https://gitlab.example.com/api/v4/session?login=yushihu&password=xxxxx"
响应结果截图
二.获取项目id
通过查看tags API可以知道,想要获得一个项目的所有tags信息,还需要项目id作为参数。项目id有两种获取方法。
1.查看project setting
2.通过projects API 获取
curl --header "PRIVATE-TOKEN: 9koXcdsepg98eAheJpvtK" https://gitlab.example.com/api/v4/projects?search=projectname
响应结果截图
三.获取所有tag信息
这里有一点需要注意,获取tag列表的接口,并不会返回全部数据,默认会对数据进行分页,不传任何分页参数的情况下,只会返回第一页默认20条数据。
参数 per_page 是用来控制每页数据条数的,默认值为20,最大值为100。所以如果数据超过100条,想一次性获取所有tag的信息,就需要根据总页数遍历获取每页的tag信息。下面是实现代码(代码为nodejs实现):
let request = require('request')
const PER_PAGE = 60 // 每页条数
const PRIVATE_TOKEN = 'yushihubiubiubiu' // private_token
const PROJECT_ID = 666666 // project id
const BASE_URL = 'http://git.feinn-yushihu.com' // git服务的域名
// 获取分页总页数
async function getTotalPages(){
return new Promise((resolve, reject) => {
const options = {
url: `${BASE_URL}/api/v4/projects/${PROJECT_ID}/repository/tags?per_page=${PER_PAGE}`,
headers: {
'PRIVATE-TOKEN': PRIVATE_TOKEN
}
}
request.head(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
let total_pages = response.caseless.dict['x-total-pages']
resolve(total_pages)
}
})
})
}
// 获取每页下面的tag数据
async function getPerPageTags(currentPage){
return new Promise((resolve, reject) => {
const options = {
url: `${BASE_URL}/api/v4/projects/${PROJECT_ID}/repository/tags?per_page=${PER_PAGE}&page=${currentPage}`,
headers: {
'PRIVATE-TOKEN': PRIVATE_TOKEN
}
}
request.get(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
let res = JSON.parse(body)
resolve(res)
}
})
})
}
// 遍历获取所有的tag数据
async function getTotalTags(){
let re = await getTotalPages()
const promiseArr = []
for(let i=0; i<re; i++){
promiseArr.push(getPerPageTags(i+1))
}
return Promise.all(promiseArr)
}
gitlab API使用场景
除了上面说到的生成更新日志,还可以做以下事情:
1.获取当前部署代码版本
项目中,有时候需要知道当前部署的代码版本(即commit id)。
比如使用sentry进行报错信息搜集时,如果不配置版本信息,很难知道报错的代码是哪个版本的代码,就不能很好找到对应的代码去排查错误。把commit id作为版本信息,就能很容易找到是哪个commit的代码,方便定位到报错源码的位置。
2.自动过滤部分Issue
一个开源项目,可能一天会有很多Issues,有些Issue可能是重复的,有些可能质量很差不友好,如果所有Issues都是人为来处理,会花费很多时间。这时就可以通过Issues API对一些特定的Issues就行修改或者移除。
更多的使用场景还需要在工作中挖掘哦~