From 54f3b62728893842a2cf29da250b8770f08aa003 Mon Sep 17 00:00:00 2001 From: Damien Degois Date: Thu, 28 Nov 2024 02:56:37 +0100 Subject: [PATCH] update documentation --- assets/css/custom.css | 4 + .../docs/deployment/addons/gitlab-mr-api.md | 41 ----- .../gitlab-mr-api/gitlab-project-id.png | Bin 0 -> 23245 bytes .../deployment/addons/gitlab-mr-api/index.md | 140 ++++++++++++++++++ .../merge-request-card-example.png | Bin 0 -> 35726 bytes content/docs/deployment/core/activity-api.md | 7 +- .../deployment/core/bf-directline-endpoint.md | 7 +- 7 files changed, 156 insertions(+), 43 deletions(-) create mode 100644 assets/css/custom.css delete mode 100644 content/docs/deployment/addons/gitlab-mr-api.md create mode 100644 content/docs/deployment/addons/gitlab-mr-api/gitlab-project-id.png create mode 100644 content/docs/deployment/addons/gitlab-mr-api/index.md create mode 100644 content/docs/deployment/addons/gitlab-mr-api/merge-request-card-example.png diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..88ea22c --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,4 @@ +thead th:empty { + border: thin solid black !important; + display: none; +} diff --git a/content/docs/deployment/addons/gitlab-mr-api.md b/content/docs/deployment/addons/gitlab-mr-api.md deleted file mode 100644 index 76dbe2f..0000000 --- a/content/docs/deployment/addons/gitlab-mr-api.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -linkTitle: gitlab-mr-api -title: gitlab-mr-api -prev: /docs/deployment/addons/ -next: /docs/user-manual/ ---- - -**Teams Notifier's gitlab-mr-api component** - -homepage: https://github.com/teams-notifier/gitlab-mr-api - -Environment variables or `.env`: - -* `PORT`: port to listen to (def: `3980`) -* `ACTIVITY_API`: `activity-api` base URL (ex: `https://activity-api:3981/`) -* `DATABASE_URL`: Database DSN in the form: `postgresql://{USER}:{PASSWORD}@{HOST}/{DATABASE}` -* `VALID_X_GITLAB_TOKEN`: comma separated list of Gitlab's Secret token (sent as `X-Gitlab-Token` header), uuidv4 generated seems a good choice. - -## Usage - -You'll need: -- one or more conversation tokens -- one of the `VALID_X_GITLAB_TOKEN` you generated - -On your Gitlab repo, go to Settings then Webhooks and click "Add new webhook" and fill up the form: - -* **URL**: https://hostname-of-this-api.example.org/api/v1/gitlab-webhook -* **Add custom header**: - * name: `X-Conversation-Token` - * value: comma separated list of conversation tokens you want the MR messages sent to -* **Secret token**: one of the `VALID_X_GITLAB_TOKEN` you generated -* **Trigger**, select: - * Merge request events - * Pipeline events - * Emoji (soon) - -You can then save or test. -Note that for the test to work you need an existing MR in the project. - - -In case of failure, now or afterward, you can Edit the webhook and you'll see all the previous calls, error code and messages, including sent payload and a way to resend the request. diff --git a/content/docs/deployment/addons/gitlab-mr-api/gitlab-project-id.png b/content/docs/deployment/addons/gitlab-mr-api/gitlab-project-id.png new file mode 100644 index 0000000000000000000000000000000000000000..b40c26b34faa428291b3b529583f78d7c3c1ef96 GIT binary patch literal 23245 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

}g3O98psjnt7!PtQYRjd>jt{aAd7AT|Aj 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 YqT5{|{MhIdU~+@B@91lksauEs57La>yZ`_I literal 0 HcmV?d00001 diff --git a/content/docs/deployment/addons/gitlab-mr-api/index.md b/content/docs/deployment/addons/gitlab-mr-api/index.md new file mode 100644 index 0000000..0f9d541 --- /dev/null +++ b/content/docs/deployment/addons/gitlab-mr-api/index.md @@ -0,0 +1,140 @@ +--- +linkTitle: gitlab-mr-api +title: gitlab-mr-api +prev: /docs/deployment/addons/ +next: /docs/user-manual/ +--- + +**Teams Notifier's gitlab-mr-api component** + +| | | +|---|---| +| **homepage** | https://github.com/teams-notifier/gitlab-mr-api | +| **registry** | https://github.com/teams-notifier/gitlab-mr-api/pkgs/container/gitlab-mr-api | +| **image** | `ghcr.io/teams-notifier/gitlab-mr-api:latest` | + +## Intro + +This component enables real-time tracking of project merge requests. When a merge request is created, a message is posted and automatically updated as the MR status changes. The message is automatically deleted when the merge request is either closed or merged. + +Here's an example of a merge request message: +{{< img src="merge-request-card-example.png" style="margin-left: 0rem">}} + +## Config + +Environment variables or `.env`: + +* `PORT`: port to listen to (def: `3980`) +* `ACTIVITY_API`: `activity-api` base URL (ex: `https://activity-api:3981/`) +* `DATABASE_URL`: Database DSN in the form: `postgresql://{USER}:{PASSWORD}@{HOST}/{DATABASE}` +* `VALID_X_GITLAB_TOKEN`: comma separated list of Gitlab's Secret token (sent as `X-Gitlab-Token` header), uuidv4 generated seems a good choice. + +## Webhook config + +You'll need: +- one or more conversation tokens +- one of the `VALID_X_GITLAB_TOKEN` you generated + +On your GitLab repository, follow these steps to add a new webhook: + +1. Go to **Settings**. +2. Select **Webhooks**. +3. Click **Add new webhook**. +4. Fill out the form with the following details: + + * **URL**: https://hostname-of-this-api.example.org/api/v1/gitlab-webhook + * **Add custom header**: + * name: `X-Conversation-Token` + * value: comma separated list of conversation tokens you want the MR messages sent to + * **Secret token**: one of the `VALID_X_GITLAB_TOKEN` you generated + * **Trigger**, select: + * Merge request events + * Pipeline events + * Emoji events (planned) + +You can then save or test. +Note that for the test to work you need an existing MR in the project. + +In case of failure, now or afterward, you can Edit the webhook and you'll see all the previous calls, error code and messages, including sent payload and a way to resend the request. + + +## Webhook declaration helper + +{{% details title="Environment variables" %}} +```bash +# Gitlab token with Admin or Maintainer right +GITLAB_TOKEN= + +# your gitlab url (opt. if gitlab.com) +#GITLAB_URL= + +# coma separated list of conversation tokens +CONVERSATION_TOKEN= + +# Gitlab secret matching one of the VALID_X_GITLAB_TOKEN +GITLAB_SECRET= + +# Full url of the accessible webhook https://gl-webhook.example.org/api/v1/gitlab-webhook +HOOK_URL= +``` +{{% /details %}} + +{{% details title="`setup-webhook.sh`" %}} + +To find the project's id, go to the project's homepage, at the rightmost top, click the vertical ellipsis and click *Copy project ID*. \ +Tested on Gitlab 17.6. + +```bash +#!/bin/bash + +# Takes a project id as first arg +# Optional conversation token override as second +set -euo pipefail + +[ -e .env ] && . .env + +[ -z "${1:-}" ] && echo "please provide a project id as first arg" && exit 1 + +PROJECT_ID=${1} +CONVERSATION_TOKEN=${2:-$CONVERSATION_TOKEN} + +GITLAB_URL=${GITLAB_URL:-gitlab.com} + +HOOK_COUNT=$(curl -s --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ + https://${GITLAB_URL}/api/v4/projects/$PROJECT_ID/hooks/ \ + | jq 'map(select(.url | test("'${HOOK_URL}'")?)) | length') + +[ "$HOOK_COUNT" -gt 0 ] && echo "already a hook declared" && exit 1 + +curl \ + -H "PRIVATE-TOKEN: $GITLAB_TOKEN" \ + -H 'Content-Type: application/json' \ + https://${GITLAB_URL}/api/v4/projects/$PROJECT_ID/hooks \ + -X POST -s -w $'\n' \ + --data-binary @- << EOF | jq . +{ +"name": "gitlab-mr-api", +"url": "$HOOK_URL", +"token": "$GITLAB_SECRET", +"custom_headers": [{"key":"X-Conversation-Token", "value":"$CONVERSATION_TOKEN"}], +"merge_requests_events": true, +"pipeline_events": true, +"emoji_events": true, +"push_events": false, +"tag_push_events": false, +"repository_update_events": false, +"issues_events": false, +"confidential_issues_events": false, +"note_events": false, +"confidential_note_events": false, +"wiki_page_events": false, +"deployment_events": false, +"feature_flag_events": false, +"job_events": false, +"releases_events": false, +"resource_access_token_events": false +} +EOF +``` +{{% /details %}} + diff --git a/content/docs/deployment/addons/gitlab-mr-api/merge-request-card-example.png b/content/docs/deployment/addons/gitlab-mr-api/merge-request-card-example.png new file mode 100644 index 0000000000000000000000000000000000000000..0134e2aed6f47077870c7b5a98f1bc803d834717 GIT binary patch literal 35726 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