gitlab 是一个类似于 github 的配置管理服务, 相较于 github,gitlab 更加专业,有更多的 webhook 和 api,以及更强大的持续集成(ci)服务。
我们可以通过 webhook 或者 api 来触发 ci,配合 gulp 等工具,以此来构建更加完整的自动化工作流。
本文将带你初步学会使用 gitlab api,更多深入使用请参考官方文档。
准备
首先,对于我们需要通过 api 触发的项目 IDE
,来到项目页面,顺序点击图中 1.
、2.
、3.
然后就能打开添加 trigger 的页面,描述完 trigger 的用途后点击 add trigger
按钮就能生成我们的 token,我们需要使用此 token 来触发 ci。
然后我们就能通过以下命令来触发 ci。
curl -X POST -F token=TOKEN -F ref=REF_NAME https://gitlab.example.com/api/v4/projects/project_id/trigger/pipeline
如果你打开的页面与图片不同,可能是你没有该项目的权限,那你需要找同事帮你搞一个 token,以及上面这条命令。
上述内容中我们需要将 TOKEN
替换为 我们自己的 token,将 REF_NAME
替换为目标分支名,则将在该目标分支上触发 ci。
其中 https://gitlab.example.com/api/v4/projects/project_id/trigger/pipeline
是打开上述设置页面自动生成的,不需要我们修改,不同项目的连接不同。
如果想给 ci 传入环境变量,可通过以下方式。
curl -X POST -F token=TOKEN -F ref=REF_NAME "variables[v_toolkit]=${version}" https://gitlab.example.com/api/v4/projects/project_id/trigger/pipeline
然后在我们的代码中通过以下方式获取环境变量:
console.log(`process.env.v_toolkit: ${process.env.v_toolkit}`)
通过环境变量,我们还能控制只触发 ci 中特定的 job,而绕过其他的 job。
需要注意的是,通过 api 的方式是不能触发需要手动触发的 job 的,所以我们可以不将 job 设为手动触发,而是通过传入环境变量,来触发 ci 中特定的 job。
举个栗子
我们可以通过 gulp 脚本来触发 ci
// gulpfile.js
const path = require('path')
const cp = require("child_process")
const gulp = require('gulp')
function runci(cb) {const versionIndex = process.argv.indexOf('--ve')
const version = process.argv[versionIndex + 1]
const branchIndex = process.argv.indexOf('--br')
const branch = process.argv[branchIndex + 1]
console.log(`version: ${version}`)
console.log(`branch: ${branch}`)
cp.execSync(`curl -X POST -F token= 你的 TOKEN -F "ref=${branch}" -F "variables[v_transformer]=${version}" https://gitlab.example.cn/api/v4/projects/1234/trigger/pipeline`)
cb()}
module.exports = {runci}
命令行运行:
npx gulp runci --ve 1.0.0 --br master
就可以触发 ci 啦!