Przejdź do głównej zawartości

Redmine

Dzięki integracji z Redmine Speedwave czyta i aktualizuje zgłoszenia, czas pracy, dzienniki zmian oraz użytkowników w twojej instancji Redmine. Obsługuje instancje samodzielnie hostowane i on-premise, w tym te pod adresami prywatnymi i w zakresach CGNAT Tailscale. Kiedy podczas konfiguracji wskażesz projekt, Speedwave zawęża do niego swoje działania, przez co integracja dobrze łączy się z planowaniem i przekładaniem wymagań na user story.

Speedwave uruchamia Redmine jako kontener typu worker i przekazuje mu wywołania narzędzi. Worker podłącza w trybie tylko do odczytu plik /tokens/api_key z kluczem API, a z tego samego folderu wczytuje config.json, w którym znajdzie adres URL Redmine, opcjonalne ID i nazwę projektu oraz numeryczne odwzorowania statusu, priorytetu, trackera i aktywności. Na hoście oba pliki leżą w ~/.speedwave/tokens/<project>/redmine/.

  • Folder~/.speedwave/tokens/<project>/redmine/
    • api_key
    • config.json

Z Redmine łączysz się kluczem API, a nie przez OAuth ani przez login i hasło. Kreator konfiguracji w aplikacji Desktop najpierw sprawdza poprawność klucza, a potem pobiera twoje projekty, statusy, trackery, priorytety i aktywności, żebyś mógł potwierdzić odwzorowania ID. Nazwy stara się dopasować sam: z każdego klucza odcina przedrostek kategorii, a resztę zestawia z nazwami w Redmine bez rozróżniania wielkości liter. Instancja Redmine w innym języku niż angielski nie dopasuje się automatycznie, więc te odwzorowania trzeba wskazać ręcznie.

Odwzorowania wiążą czytelne klucze, takie jak status_new czy priority_high, z numerycznymi ID Redmine właściwymi dla danego projektu, bo ta sama nazwa może w każdej instancji wskazywać inne ID. Możesz też dodać własne klucze; plik konfiguracyjny przyjmuje dowolną parę kategoria_nazwa. Zanim Speedwave utworzy albo zaktualizuje zgłoszenie, wczytuje odwzorowania narzędziem getMappings, a getConfig podaje ID, nazwę i adres URL aktywnego projektu. Czytelna nazwa bez odwzorowania zwraca błąd, który wylicza dostępne wartości danego pola.

Opisy zgłoszeń, notatki, dzienniki zmian i komentarze zapisuje się w składni Textile, a nie w Markdownie, i Speedwave czyści je przed wysłaniem: wycina niebezpieczne znaczniki HTML oraz schematy URI przypominające skrypty, a zostawia bezpieczny zestaw znaczników formatujących.

Ustawienie project_id zawęża nie tylko listę narzędzi. Odczyty zostają przypięte do tego projektu, zmiany są wobec niego wcześniej weryfikowane, a próba przeniesienia zgłoszenia gdzie indziej przez updateIssue kończy się błędem zakresu. Gdy w config.json brakuje host_url, Speedwave sięga po zmienną środowiskową REDMINE_URL.

Błędy API są opisane wprost: 401 to zły klucz, 403 to za małe uprawnienia, 404 to brakujący element, 422 to błędy walidacji pól po stronie Redmine, a jeszcze inny komunikat dostajesz, kiedy żądanie w ogóle nie dochodzi do serwera. Nieudane żądania ponawiają się automatycznie do 3 razy, z odstępem 2, 4, a potem 8 sekund.

KategoriaKlucze
Statusstatus_new, status_in_progress, status_resolved, status_feedback, status_closed, status_rejected
Priorytetpriority_low, priority_normal, priority_high, priority_urgent, priority_immediate
Trackertracker_bug, tracker_feature, tracker_task, tracker_support
Aktywnośćactivity_design, activity_development, activity_testing, activity_documentation, activity_support, activity_management, activity_devops, activity_review

23 narzędzia w siedmiu obszarach. Usunięć nie da się cofnąć.

NarzędzieCo robi
listIssueIdsPodaje ID zgłoszeń, z filtrami po projekcie, statusie, przypisanej osobie, trackerze i priorytecie.
getIssueFullPobiera pełne dane zgłoszenia, wraz z polami niestandardowymi, dziennikiem zmian, załącznikami i relacjami.
searchIssueIdsSzuka zgłoszeń po treści zapytania, opcjonalnie w obrębie projektu.
createIssueZakłada nowe zgłoszenie, z trackerem, statusem, priorytetem, osobą przypisaną i zgłoszeniem nadrzędnym po ID albo nazwie.
updateIssueZmienia pola istniejącego zgłoszenia i w tym samym wywołaniu dopisuje notatkę.
commentIssueDodaje do zgłoszenia komentarz (wpis dziennika).
listJournalsPodaje wpisy dziennika zgłoszenia (komentarze i historię).
updateJournalZmienia treść istniejącego wpisu dziennika.
deleteJournal (destrukcyjne)Trwale kasuje wpis dziennika.
listTimeEntriesPodaje zarejestrowany czas pracy, z filtrami po zgłoszeniu, projekcie, użytkowniku i zakresie dat.
createTimeEntryRejestruje czas pracy przy zgłoszeniu albo projekcie.
updateTimeEntryZmienia liczbę godzin, aktywność albo komentarz przy istniejącym wpisie czasu pracy.
listUsersPodaje użytkowników, opcjonalnie zawężonych do członków projektu.
resolveUserZamienia me, ID użytkownika albo nazwę użytkownika na ID użytkownika.
getCurrentUserZwraca profil zalogowanego użytkownika.
listProjectIdsPodaje ID projektów, z filtrem statusu.
getProjectFullPobiera pełne dane projektu, wraz z trackerami, kategoriami i modułami.
searchProjectIdsSzuka projektów po nazwie, identyfikatorze albo opisie.
listRelationsPodaje relacje zgłoszenia z innymi zgłoszeniami.
createRelationŁączy dwa zgłoszenia relacją danego typu, a przy precedes albo follows dodaje jeszcze opóźnienie w dniach.
deleteRelation (destrukcyjne)Trwale kasuje relację.
getMappingsZwraca odwzorowania ID projektu dla statusu, priorytetu, trackera i aktywności.
getConfigZwraca ID, nazwę i adres URL aktywnego projektu.

Typy relacji: relates, duplicates, duplicated, blocks, blocked, precedes, follows, copied_to, copied_from.

  1. W Redmine otwórz My account i skopiuj API access key.
  2. W aplikacji Desktop otwórz kartę integracji Redmine i uruchom kreatora. Wpisz swój Redmine URL oraz API Key, a następnie kliknij Validate.
  3. Po walidacji wybierz projekt (albo All projects) i potwierdź odwzorowania ID dla statusu, priorytetu, trackera i aktywności.
  4. Zapisz. Jeśli zobaczysz taką prośbę, zrestartuj kontenery projektu, żeby worker wczytał nową konfigurację.

Worker Redmine podłącza wyłącznie własny klucz API, w trybie tylko do odczytu, i nie sięga po tokeny ani dane logowania innych usług. Zajrzyj do opisu tego, jak obsługiwane są dane uwierzytelniające, żeby zobaczyć, jak Speedwave odgradza sekrety każdego workera od reszty systemu. Kiedy project_id pozostaje pusty, Speedwave może podać go osobno przy każdym wywołaniu, zamiast być przypięty na stałe do jednego projektu.