InsaneCoder
InsaneCoder

Reputation: 8278

Change issue closing pattern for gitlab user account

I want to close an issue matching the file name pushed with Issue title (My source files are named with unique integers, e.g. 34521.cpp and there are corresponding issues on Gitlab e.g. Problem #34521).

How can I do so?

The default pattern is not suitable as I have 2000+ issues and I do not want to refer issues with the issue ID's each time. I want it to be automated. So I was checking the page : Change the issue closing pattern.

It says I need to have access to the server where gitlab is installed. Does that mean I cannot change the issue closing pattern for Gitlab cloud's user account hosted at http://gitlab.com ?

Upvotes: 0

Views: 116

Answers (1)

Bertrand Martel
Bertrand Martel

Reputation: 45432

You can't define a custom closing pattern on gitlab.com, only on your own hosted gitlab instance. But what you can do is to use webhooks to listen on push events on a remote server. You can then parse the commit messages yourself and take decision on closing issues. You can use Gitlab API to close issue on your server instance (with a hard coded access token)

This can be tested locally using an http tunnel like ngrok

The following script starts a server serving a /webhook endpoint. This webhook endpoint is called when any push occurs on your repo.

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}!`))

In the above you need to change the access token value & projectId. Also note that above code will check only added file, you can modify it to include updated or deleted file matching your requirements.

Launch ngrok on port 3000 ngrok http 3000 & copy the given url in integrations sections of your repo :

enter image description here

Now when you add any file it will check for the filename without extension and search all issue with within title #filename_without_extension and close it right away

Upvotes: 0

Related Questions