diff mod_pubsub_forgejo/README.md @ 6175:131b8bfbefb4

mod_pubsub_forgejo: new module for forgejo webhooks
author nicoco <nicoco@nicoco.fr>
date Mon, 17 Feb 2025 23:28:05 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/README.md	Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,150 @@
+---
+labels:
+- "Stage-Beta"
+summary: "Turn forgejo/github/gitlab webhooks into atom-in-pubsub"
+rockspec:
+  build:
+    modules:
+      mod_pubsub_forgejo.templates: templates.lib.lua
+      mod_pubsub_forgejo.format: format.lib.lua
+---
+
+# Introduction
+
+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](https://movim.eu/) or [libervia](https://libervia.org/), 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).
+
+# Configuration
+
+## Basic setup
+
+Load the module on a pubsub component:
+
+```{.lua}
+Component "pubsub.example.com" "pubsub"
+    modules_enabled = { "pubsub_forgejo" }
+    forgejo_secret = "something-very-secret"  -- copy this in the Forgejo web UI
+```
+
+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](https://prosody.im/doc/http#virtual_hosts).
+
+## Advanced setup
+
+### Publishing settings
+
+#### Pubsub actor
+
+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.
+
+#### Pubsub node
+
+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., "full*name". 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_.
+
+### Customizing the atom entry
+
+#### Pushes with no commits
+
+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`.
+
+#### Atom entry templates
+
+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](https://prosody.im/doc/developers/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](https://prosody.im/doc/developers/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:
+
+```{.lua}
+forgejo_templates = {
+	pull_request = nil,  -- suppress handling of `pull_request` events
+	release = {          -- data is the JSON payload of the webhook
+		title = "{data.sender.username} {data.action} a release for {data.repository.name}",
+		content = "{data.release.name}",
+		id = "release-{data.release.tag_name}",
+		link = "{data.release.html_url}"
+	}
+}
+```
+
+Examples payloads are provided in the `webhook-examples`
+
+# Publishing in a MUC
+
+You can use a bot that listen to pubsub events and converts them to MUC messages.
+MattJ's [riddim](https://matthewwild.co.uk/projects/riddim/) is well suited for that.
+
+Example config, single pubsub node:
+
+```{.lua}
+jid = "forgejo-bot@example.com"
+password = "top-secret-stuff"
+room = "room@rooms.example.com"
+autojoin = room
+
+pubsub2room = {
+  "pubsub.example.com#forgejo" = {
+    room = room,
+    template = "${title}\n${content}\n${link@href}"
+  }
+}
+```
+
+Example with several nodes:
+
+```{.lua}
+local nodes = {"forgejo---org/repo1", "forgejo---org/repo2"}
+pubsub2room = {}
+
+for _, node in ipairs(slidge_repos) do
+  pubsub2room = ["pubsub.example.com#" .. node] = {
+    room = room,
+    template = "${title}\n${content}\n${link@href}"
+  }
+end
+```
+
+# TODO
+
+- Default templates for all event types
+- (x)html content
+
+# Compatibility
+
+Works with prosody 0.12