Webhook Integrations

Webhook Integrations can be added in the Administration panel under Integrations. Rocket.Chat supports notifications from and to other apps or services through its…

Deploy RocketChat as a fully managed service starting at €9/month. Get automated backups, SSL, updates, monitoring, and human support, all included.

DANIAN runs RocketChat as a fully managed service: installation, updates, backups, monitoring and security are handled for you.

See the rocketchat hosting page for plans, pricing and a free trial.

 

Webhook Integrations can be added in the Administration panel under Integrations. Rocket.Chat supports notifications from and to other apps or services through its webhook integrations. Incoming notifications require a message body parsing code snippet, which transforms the incoming webhook to a readable message, which will be posted into a selected chat channel.

 

GitLab

Create a new Incoming WebHook Integration and configure the destination channel and user, then enable a custom script. GitLab supports multiple types of webhook notifications and thus requires a more sophisticated transform script. The below works for issue, comment, merge request, push and tag events:


/*jshint  esnext:true*/
// see https://gitlab.com/help/web_hooks/web_hooks for full json posted by GitLab
const NOTIF_COLOR = '#6498CC';

class Script {
    process_incoming_request({
        request
    }) {
        try {
            switch (request.headers['x-gitlab-event']) {
                case 'Push Hook':
                    return this.pushEvent(request.content);
                case 'Merge Request Hook':
                    return this.mergeRequestEvents(request.content);
                case 'Note Hook':
                    return this.commentEvent(request.content);
                case 'Issue Hook':
                    return this.issueEvent(request.content);
                case 'Tag Push Hook':
                    return this.tagEvent(request.content);
            }
        } catch (e) {
            console.log('gitlabevent error', e);
            return {
                error: {
                    success: false,
                    message: e.message || e
                }
            };
        }
    }

    issueEvent(data) {
        return {
            content: {
                username: data.user.name,
                text: `${data.user.username} ${data.object_attributes.state} an issue _${data.object_attributes.title}_ on ${data.project.name}. *Description:* ${data.object_attributes.description}. See: ${data.object_attributes.url}`,
                icon_url: data.user.avatar_url
            }
        };
    }

    commentEvent(data) {
        const comment = data.object_attributes;
        const user = data.user;
        let text;
        if (data.merge_request) {
            let mr = data.merge_request;
            text = `${user.name} commented on Merge Request #${mr.id} [${mr.title}](${comment.url})`;

        } else if (data.commit) {
            let commit = data.commit;
            let message = commit.message.replace(/\n[^\s\S]+/, '...').replace(/\n$/, '');
            text = `${user.name} commented on commit [${commit.id.slice(0, 8)} ${message}](${comment.url})`;
        } else if (data.issue) {
            let issue = data.issue;
            text = `${user.name} commented on issue [#${issue.id} ${issue.title}](${comment.url})`;
        } else if (data.snippet) {
            let snippet = data.snippet;
            text = `${user.name} commented on code snippet [#${snippet.id} ${snippet.title}](${comment.url})`;
        }
        return {
            content: {
                username: 'gitlab/' + data.project.name,
                icon_url: data.project.avatar_url || user.avatar_url || '',
                text,
                attachments: [{
                    text: comment.note,
                    color: NOTIF_COLOR
                }]
            }
        };
    }

    mergeRequestEvent(data) {
        const user = data.user;
        const mr = data.object_attributes;
        return {
            content: {
                username: `gitlab/${mr.target.name}`,
                icon_url: mr.target.avatar_url || mr.source.avatar_url || user.avatar_url || '',
                attachments: [{
                    title: `${user.name} ${mr.action} Merge Request #${mr.id} ${mr.title}`,
                    title_link: mr.url,
                    text: `_${mr.source_branch} into ${mr.target_branch}_`,
                    color: NOTIF_COLOR
                }]
            }
        };
    }

    pushEvent(data) {
        const project = data.project;
        return {
            content: {
                username: `gitlab/${project.name}`,
                text: `![${data.user_name}](${data.user_avatar}) ${data.user_name} pushed ${data.total_commits_count} commits to ${project.name}. See: ${project.web_url}`,
                icon_url: project.avatar_url || data.user_avatar || '',
                attachments: [{
                    title: data.total_commits_count + ' Commits',
                    title_link: project.web_url,
                    text: data.commits.map((commit) => `  - ${new Date(commit.timestamp).toUTCString()} [${commit.id.slice(0, 8)}](${commit.url}) by ${commit.author.name}: ${commit.message.replace(/\s*$/, '')}`).join('\n'),
                    color: NOTIF_COLOR
                }]
            }
        };
    }

    tagEvent(data) {
        let tag = data.ref.replace(/^.*?([^\/]+)$/, '$1');
        return {
            content: {
                username: `gitlab/${data.project.name}`,
                icon_url: data.project.avatar_url || data.user_avatar || '',
                text: `${data.user_name} push tag [${tag} ${data.checkout_sha.slice(0, 8)}](${data.project.web_url}/tags/${tag})`
            }
        };
    }

}

 

After the integration is setup, the Webhook URL and Secret Token is generated and can now be setup with the project in GitLab at Settings -> Integrations.

 

Info:
Webhook test
Triggering a test webhook from GitLab will likely result in an error, since the above transform script expects a body, which is not provided from GitLab while running a test call. A test has to be made with a real action on the repo.

 

Explore the platform

Find more information about our company, platform, and services on our website.

Visit danian.co