This module accepts Forgejo webhooks and publishes them to a local
pubsub component as Atom entries for XMPP clients to subscribe to. Such
entries can be viewed with a pubsub-compatible XMPP client such as movim or libervia, or turned into chat messages
with a bot (cf last section of this document). It is a more customisable
mod_pubsub_github
.
It should also work with other forges such as github and gitlab (to be tested).
Load the module on a pubsub component:
"pubsub.example.com" "pubsub"
Component = { "pubsub_forgejo" }
modules_enabled = "something-very-secret" -- copy this in the Forgejo web UI forgejo_secret
The “Target URL” to configure in the Forgejo web UI should be either:
http://pubsub.example.com:5280/pubsub_forgejo
https://pubsub.example.com:5281/pubsub_forgejo
If your HTTP host doesn’t match the pubsub component’s address, you will need to inform Prosody. For more info see Prosody’s HTTP server documentation.
By default, forgejo_actor
is unset; this results in
nodes being created by the prosody superuser. Change this if you set up
access control and you know what you are doing.
By default, all events are published in the same pubsub node named
“forgejo”. This can be changed by setting forgejo_node
to a
different value.
Another option is to used different nodes based on which repository
emitted the webhook. This is useful if you configured the webhook at the
user (or organisation) level instead of repository-level. To set this
up, define forgejo_node_prefix
and
forgejo_node_mapping
. forgejo_node_mapping
must be a key in the the webhook “repository” payload, e.g.,
“fullname”. Example: with
forge_node_prefix = "forgejo---"
and
forgejo_node_mapping = "full_name"
, webhooks emitted by the
repository _repo-name in the org-name organisation will be
published in the node forgejo—org-name/repo-name.
By default, pushes without commits (i.e., pushing tags) are ignored,
because it leads to weird entries like “romeo pushed 0 commit(s) to
repo”. This behaviour can be changed by setting
forgejo_skip_commitless_push = false
.
By default, 3 webhooks events are handled (push, pull_request and
release), and the payload is turned into a atom entry by using util.interpolation
templates. The default templates can be viewed in the source of this
module, in the templates.lib.lua
file.
You can customise them using by setting
forgejo_templates
, which is merged with the default
templates. In this table, keys are forgejo event names
(x-forgejo-template
request header). Values of this table
are tables too, where keys are atom elements and values are the
templates passed to util.interpolation.
A few filters are provided:
|shorten
strips the last 32 characters: useful to get a
short commit hash|firstline
only keeps the first line: useful to get a
commit “title”|branch
strips the first 12 characters: useful to get a
branch name from data.ref
|tag
strips the first 11 characters: useful to get a
tag name from data.ref
Example:
= {
forgejo_templates = nil, -- suppress handling of `pull_request` events
pull_request = { -- data is the JSON payload of the webhook
release = "{data.sender.username} {data.action} a release for {data.repository.name}",
title = "{data.release.name}",
content = "release-{data.release.tag_name}",
id = "{data.release.html_url}"
link }
}
Examples payloads are provided in the
webhook-examples
You can use a bot that listen to pubsub events and converts them to MUC messages. MattJ’s riddim is well suited for that.
Example config, single pubsub node:
= "forgejo-bot@example.com"
jid = "top-secret-stuff"
password = "room@rooms.example.com"
room = room
autojoin
= {
pubsub2room "pubsub.example.com#forgejo" = {
= room,
room = "${title}\n${content}\n${link@href}"
template }
}
Example with several nodes:
local nodes = {"forgejo---org/repo1", "forgejo---org/repo2"}
= {}
pubsub2room
for _, node in ipairs(slidge_repos) do
= ["pubsub.example.com#" .. node] = {
pubsub2room = room,
room = "${title}\n${content}\n${link@href}"
template }
end
Works with prosody 0.12
With the plugin installer in Prosody 0.12 you can use:
sudo prosodyctl install --server=https://modules.prosody.im/rocks/ mod_pubsub_forgejo
For earlier versions see the documentation for installing 3rd party modules