还在手动维护项目的更新日志吗?那你就OUT了!

1,273 阅读4分钟
原文链接: mp.weixin.qq.com

点击上方“ 前端小苑”,选择“置顶公众号”

精品技术文章,热门资讯第一时间送达

本文将通过实现前端组件库的更新日志,来介绍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_tokenconst PROJECT_ID = 666666 // project idconst 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就行修改或者移除。

更多的使用场景还需要在工作中挖掘哦~