Konektor
- Typ:
service/github_webhook - Endpoint przyjmujący webhooki:
POST https://<konto>.intum.com/connect/connector/<code>/receive - Autoryzacja: HMAC-SHA256 z
secret_tokenkonektora w nagłówkuX-Hub-Signature-256(formatsha256=<hex>, porównanie w czasie stałym).
Pola konektora
| Pole | Opis |
|---|---|
secret_token |
Wartość identyczna z polem “Secret” przy konfiguracji webhooka w GitHubie. |
fields.url_regexp |
Regexp dopasowywany do pull_request.body. Domyślny: https://[^/]+\.intum\.com/organize/tasks/(\d+). Pierwsza grupa to ID taska. |
fields.title_start |
Opcjonalna tablica prefiksów tytułu PR-a. Jeśli url_regexp nie znajdzie taska, a tytuł zaczyna się od któregoś z tych prefiksów - integracja zapisuje aktywność github_opened / github_closed zamiast komentarza. |
Obsługiwane zdarzenia
Akceptowane jest wyłącznie zdarzenie pull_request (X-GitHub-Event: pull_request) z action:
-
opened- PR utworzony -
closedzmerged: true- PR zmergowany
Wszystkie inne wartości action (m.in. synchronize, closed z merged: false, edited, reopened) są ignorowane i zwracają 200 OK bez efektu.
Mapowanie autora
Login GitHuba (pull_request.user.login przy opened, pull_request.merged_by.login przy zmergowanym closed) jest mapowany na użytkownika Intum po polu external_id w Account::UserSetting. Brak dopasowania = komentarz przypisywany do technicznego użytkownika o ID -1.
Tworzenie konektora przez API
POST /connect/connectors.json
Content-Type: application/json
{
"connector": {
"kind": "service/github_webhook",
"code": "github_webhook",
"name": "GitHub Webhook (PR)",
"active": true,
"secret_token": "<48-znakowy hex>",
"fields": {
"url_regexp": "https://twoja-firma\\.intum\\.com/organize/tasks/(\\d+)"
}
}
}
Przykładowy payload z GitHuba
Minimalna struktura odbierana z GitHuba (skrócona):
{
"action": "opened",
"pull_request": {
"html_url": "https://github.com/firma/repo/pull/42",
"title": "Fix login bug",
"body": "Naprawia logowanie. Task: https://twoja-firma.intum.com/organize/tasks/123",
"merged": false,
"user": { "login": "janKowalski" },
"merged_by": null
}
}
Dla zmergowanego PR-a action: "closed", merged: true, merged_by: { "login": "..." }.