Konektory
Konektor to pojedyncze połączenie z jednym systemem kontroli wersji: jednym serwerem GitLab, jedną organizacją GitHub, jedną instancją Bitbucket. Każdy konektor należy do konkretnej Wtyczki, czyli wdrożenia Enterprise Plugin, które faktycznie skanuje repozytoria.
To od konektorów zaczyna się każde wdrożenie Q247, bo bez nich platforma nie ma skąd wziąć commitów, a więc nie ma z czego wyliczyć Kalorii, Przyrostów ani Linii.
Zasada działania
Wtyczka łączy się z API systemu kontroli wersji, pobiera listę dostępnych repozytoriów i klonuje je lokalnie. Analiza kodu i historii odbywa się w całości po stronie wtyczki. Do Q247 wysyłany jest tylko wynik.
Przebieg od zapisania konektora do danych na dashboardzie ma cztery etapy, a każdy z nich zajmuje czas:
- Odkrycie repozytoriów. Wtyczka odpytuje API i zgłasza znalezione repozytoria do Q247. Zajmuje to od 5 do 10 minut.
- Przypisanie do projektu. Krok ręczny, bez niego skanowanie nie startuje.
- Pierwsze skanowanie. Analiza całej historii repozytorium, od kilkunastu minut w górę, zależnie od rozmiaru.
- Aktywacja osób. Krok ręczny, opisany w Uruchomieniu integracji. Bez niego dashboardy pozostają puste.
Zakres przetwarzanych danych
Kod źródłowy i pełna historia repozytorium są klonowane i analizowane lokalnie, po stronie wtyczki. Nie opuszczają infrastruktury, w której wtyczka działa: w standardowej instalacji jest to infrastruktura Klienta (Private Plugin), a w wariancie Cloud Plugin infrastruktura Q247. Token dostępu również zostaje po stronie wtyczki, z jednym wyjątkiem: w konektorze Generic GIT poświadczenia są częścią adresu repozytorium, więc trafiają do Q247 razem z nim.
Do Q247 trafia wyłącznie wynik analizy: adres repozytorium, dane commitera, wyliczony wektor wysiłku i wynik kaloryczny, wersja modelu oraz metadane repozytorium, czyli nazwa, adres, grupa i status.
Techniczną specyfikację, wraz z listą przechowywanych pól, zawiera Bezpieczeństwo Enterprise Plugin.
Wymagania wstępne
Konto serwisowe i token
Uwierzytelnianie odbywa się osobistym tokenem dostępu wygenerowanym na koncie, które ma dostęp do wszystkich repozytoriów przeznaczonych do analizy. To najczęstsza przyczyna niekompletnych wyników: konektor działa, ale odkrywa tylko część repozytoriów, bo konto serwisowe nie należy do wszystkich grup.
Token potrzebuje wyłącznie uprawnień odczytu. W GitLabie odpowiadają im zakresy read_user, read_api i read_repository; w pozostałych systemach ich odpowiedniki.
Q247 nigdy nie zapisuje niczego do repozytorium. Token z szerszym zakresem niż odczyt nie da żadnej dodatkowej funkcji, a zwiększa skutki jego ewentualnego wycieku.
Poświadczenia ze zmiennych środowiskowych
Poświadczeń nie trzeba wpisywać do formularza wprost. Zamiast wartości można podać nazwę zmiennej środowiskowej z przedrostkiem $$, a wtyczka odczyta ją dopiero w momencie łączenia się z systemem.
Działa to dla obu pól, nazwy użytkownika i tokenu, niezależnie od siebie. Można więc podać login jawnie, a token ze zmiennej, albo oba ze zmiennych.
| Pole | Wartość w formularzu | Zmienna na hoście wtyczki |
|---|---|---|
| Nazwa użytkownika | $$GITLAB_USER | GITLAB_USER=q247-service |
| Osobisty token dostępu (PAT) | $$GITLAB_TOKEN | GITLAB_TOKEN=glpat-xxxxxxxx |
Przedrostek to dokładnie dwa znaki dolara, a dalej sama nazwa zmiennej, bez nawiasów i bez spacji. Zapis $GITLAB_TOKEN albo ${GITLAB_TOKEN} nie zostanie rozpoznany i trafi do systemu jako dosłowny ciąg znaków.
W bazie Q247 zapisuje się wtedy wyłącznie nazwa zmiennej, bez samej wartości. Poświadczenie pozostaje na serwerze Klienta i nie przechodzi przez formularz w przeglądarce ani przez backend Q247. Rotacja tokenu sprowadza się wtedy do podmiany zmiennej na hoście i restartu wtyczki, bez wchodzenia do panelu.
Chodzi o maszynę, na której działa wtyczka. Przy Cloud Plugin jest to środowisko po stronie Q247, więc ustawienie zmiennej wymaga udziału zespołu wdrożeniowego; przy wtyczce działającej u Klienta zmienną ustawia jego zespół infrastruktury.
Nieustawiona zmienna nie daje błędu walidacji przy zapisie. Poświadczenie rozwiązuje się do wartości pustej i objawia się dopiero jako nieudane uwierzytelnienie przy pierwszej próbie połączenia, czyli status Błąd na konektorze.
Mechanizm działa w każdym konektorze, który ma pola nazwy użytkownika i tokenu, a więc we wszystkich poza Generic GIT, gdzie poświadczenia wchodzą w adres URL repozytorium. Obsługują go też integracje Jiry i Confluence, wraz z osobnym tokenem Tempo.
Dostęp sieciowy
Wtyczka musi dosięgnąć API systemu kontroli wersji oraz backendu Q247. Oba połączenia są wychodzące. Przy repozytoriach dodawanych ręcznie w Generic GIT dostęp musi być publiczny albo otwarty dla adresu IP, z którego działa dana wtyczka.
Dodawanie konektora
W Konfiguracji, w sekcji Wtyczki, przy liście "Konektory" wybranego wdrożenia, przycisk "+" pokazuje listę dostępnych typów.

Sześć z siedmiu typów ma identyczny formularz. Wyjątkiem jest Generic GIT, który nie łączy się przez API.

| Pole | Co robi | Przykład |
|---|---|---|
| Nazwa konektora | własna nazwa do rozpoznania na liście | GitLab firmowy |
| Wtyczka | wdrożenie, które ma obsługiwać ten konektor | Cloud (Europe) |
| Adres URL API konektora | adres API systemu kontroli wersji | https://gitlab.firma.pl/api/v4 |
| Nazwa użytkownika | login konta, na którym wygenerowano token | q247-service |
| Osobisty token dostępu (PAT) | poświadczenie konta serwisowego | glpat-xxxxxxxx albo $$GITLAB_TOKEN |
| ID organizacji | identyfikator organizacji, tylko dla części typów | firma |
Adres API buduje się inaczej dla każdego systemu, a to najczęstsze miejsce pomyłki:
| System | Adres URL API konektora |
|---|---|
| GitLab | https://{host}:{port}/api/v4, na przykład https://gitlab.firma.pl/api/v4 |
| GitHub | adres API instancji, dla github.com wartość domyślna |
| Azure DevOps | https://dev.azure.com |
| Bitbucket, Gitea, Gerrit | adres API danej instancji |
Pole ID organizacji nie występuje we wszystkich typach: dla Azure DevOps jest wymagane, dla GitHub opcjonalne, a w pozostałych typach nie ma go wcale.
Przycisk zapisu zamyka formularz i uruchamia odkrywanie repozytoriów.
Weryfikacja i diagnostyka
Kolumna Status na liście konektorów przyjmuje jedną z sześciu wartości:
| Status | Znaczenie |
|---|---|
| Nowy | konektor zapisany, wtyczka jeszcze go nie podjęła |
| Oczekujący | trwa pierwsze połączenie z systemem kontroli wersji |
| Gotowy | połączenie nawiązane, repozytoria jeszcze nieprzetworzone |
| Operacyjny | konektor działa i dostarcza dane |
| Błąd | ostatnia próba połączenia zakończyła się niepowodzeniem |
| Zarchiwizowany | konektor wyłączony z użycia, dane historyczne zostają |
Status Oczekujący utrzymujący się dłużej niż kilkanaście minut oznacza problem z połączeniem albo z tokenem.
Gdy repozytoria nie pojawiają się w Źródłach, sprawdź kolejno:
- Czy minęło 5 do 10 minut i czy odświeżyłeś stronę. Lista nie aktualizuje się sama.
- Czy adres API jest poprawny, wraz z sufiksem właściwym dla danego systemu. Adres samej instancji, bez sufiksu API, daje status Błąd.
- Czy token nie wygasł i czy ma zakresy odczytu.
- Czy konto serwisowe należy do wszystkich grup, których repozytoria mają być analizowane. Objawem jest niekompletna, a nie pusta lista.
- Logi wtyczki (
q247-plugin.log), które pokazują odpowiedzi API i błędy wysyłki.
Gdy repozytoria są widoczne, ale dashboardy pozostają puste, przyczyna niemal zawsze leży w dwóch krokach opisanych w Uruchomieniu integracji: braku przypisania do projektu albo braku aktywacji osób.
Siedem typów konektorów
GitLab
Konektor GitLab, obsługiwany od wersji 14, własny serwer albo gitlab.com.
GitHub
Konektor GitHub dla github.com i GitHub Enterprise, z opcjonalnym polem ID organizacji.
Azure DevOps
Konektor Azure DevOps, jedyny typ z obowiązkowym polem ID organizacji.
BitBucket
Konektor BitBucket dla Cloud i Data Center, z wymogiem odczytu projektów i repozytoriów.
Gitea
Konektor Gitea, lekkiej alternatywy dla GitLab i GitHub.
Gerrit
Konektor Gerrit, systemu code review z wbudowaną kontrolą wersji.
Generic GIT
Jedyny konektor bez API, repozytoria dodawane ręcznie, z danymi logowania w adresie URL.
Zobacz też
- Uruchomienie analizy kodu: pełna kolejność czynności od konektora do danych na dashboardzie
- Enterprise Plugin: Cloud Plugin i Private Plugin, wymagania systemowe
- Źródła: lista odkrytych repozytoriów i przypisywanie ich do projektów
- Bezpieczeństwo Enterprise Plugin: pełny zakres wymiany danych i reguły firewalla