我想关闭一个与问题标题推送的文件名相匹配的问题(我的源文件以唯一的整数命名,例如34521.cpp,并且在Gitlab上存在相应的问题,例如问题#34521 )
我该怎么办?
默认模式不适合,因为我有2000多个问题,并且我不想每次都引用带有问题ID的问题。我希望它是自动化的。所以我正在检查页面: Change the issue closing pattern。
它说我需要访问安装了gitlab的服务器。这是否意味着我无法更改托管在http://gitlab.com上的Gitlab云用户帐户的问题关闭模式?
答案 0 :(得分:0)
您不能仅在您自己的托管gitlab实例上在gitlab.com上定义自定义关闭模式。但是您可以做的是使用webhooks监听远程服务器上的推送事件。然后,您可以自己解析提交消息,并就结束问题做出决定。您可以使用Gitlab API来关闭服务器实例上的问题(使用硬编码访问令牌)
这可以使用ngrok之类的http隧道在本地进行测试
以下nodejs脚本将启动服务于/webhook
端点的服务器。当回购上发生任何推送时,将调用此webhook端点。
const express = require('express');
const bodyParser = require('body-parser');
const axios = require('axios');
const to = require('await-to-js').to;
const port = 3000;
const projectId = "4316159";
const accessToken = "YOUR_ACCESS_TOKEN";
const app = express();
app.use(bodyParser.json())
app.post('/webhook', async function(req, res) {
console.log("received push event");
let result, err, closeRes;
for (var i = 0; i < req.body.commits.length; i++) {
for (var j = 0; j < req.body.commits[i].added.length; j++) {
filenameWithoutExt = req.body.commits[i].added[j].split('.').slice(0, -1).join('.');
[err, result] = await to(axios({
url: `https://gitlab.com/api/v4/projects/${projectId}/issues?search=#${filenameWithoutExt}`,
method: 'GET',
headers: {
"PRIVATE-TOKEN": accessToken
}
}));
if (err) {
console.log(err);
} else {
if (result.data.length !== 0) {
//close those issues
for (item in result.data) {
console.log(`closing issue #${result.data[item].iid} with title ${result.data[item].title}`);
[err, closeRes] = await to(axios({
url: `https://gitlab.com/api/v4/projects/${projectId}/issues/${result.data[item].iid}?state_event=close`,
method: 'PUT',
headers: {
"PRIVATE-TOKEN": accessToken
}
}));
if (err) {
console.log(err);
} else {
console.log(`closing status : ${closeRes.status}`);
}
}
} else {
console.log("no issue were found");
}
}
}
}
res.sendStatus(200);
});
app.listen(port, () => console.log(`listening on port ${port}!`))
在上面,您需要更改访问令牌值和projectId。另外请注意,上面的代码将仅检查添加的文件,您可以对其进行修改以包括符合要求的更新或删除的文件。
在端口3000 ngrok http 3000
上启动ngrok并在仓库的集成部分复制给定的url:
现在,当您添加任何文件时,它将检查文件名不带扩展名,并搜索标题为#filename_without_extension
中的所有问题,并立即将其关闭