更改gitlab用户帐户的问题关闭模式

时间:2018-11-18 13:34:48

标签: gitlab

我想关闭一个与问题标题推送的文件名相匹配的问题(我的源文件以唯一的整数命名,例如34521.cpp,并且在Gitlab上存在相应的问题,例如问题#34521

我该怎么办?

默认模式不适合,因为我有2000多个问题,并且我不想每次都引用带有问题ID的问题。我希望它是自动化的。所以我正在检查页面: Change the issue closing pattern

它说我需要访问安装了gitlab的服务器。这是否意味着我无法更改托管在http://gitlab.com上的Gitlab云用户帐户的问题关闭模式?

1 个答案:

答案 0 :(得分:0)

您不能仅在您自己的托管gitlab实例上在gitlab.com上定义自定义关闭模式。但是您可以做的是使用webhooks监听远程服务器上的推送事件。然后,您可以自己解析提交消息,并就结束问题做出决定。您可以使用Gitlab API来关闭服务器实例上的问题(使用硬编码访问令牌)

这可以使用ngrok之类的http隧道在本地进行测试

以下脚本将启动服务于/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:

enter image description here

现在,当您添加任何文件时,它将检查文件名不带扩展名,并搜索标题为#filename_without_extension中的所有问题,并立即将其关闭