首页 > 解决方案 > 更改 gitlab 用户帐户的问题关闭模式

问题描述

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

我该怎么做?

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

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

标签: gitlab

解决方案


您不能在 gitlab.com 上定义自定义关闭模式,只能在您自己托管的 gitlab 实例上定义。但是您可以做的是使用webhook来监听远程服务器上的推送事件。然后,您可以自己解析提交消息并决定关闭问题。您可以使用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 并ngrok http 3000在您的 repo 的集成部分中复制给定的 url:

在此处输入图像描述

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


推荐阅读