Dotyczą wszystkich repozytoriów organizacji: tuttitrip, tuttitrip-frontend, tuttitrip-backend i tuttitrip-worker. Teksty dla ludzi (zgłoszenia, opisy PR) piszemy po polsku. Prefiksy typów w tytułach są po angielsku.
Tytuł zaczyna się od typu: feat:, docs:, chore: albo bug:. Można dopisać zakres w nawiasie, np. feat(frontend): Filtrowanie wyjazdów po dacie. Po dwukropku i spacji musi być opis, co najmniej 4 znaki. Typ i zakres piszemy małymi literami.
Treść składa się z sekcji z nagłówkami ###. Żadna wymagana sekcja nie może być pusta:
| Typ | Wymagane sekcje |
|---|---|
feat, docs, chore |
Opis, Dlaczego, Kryteria akceptacji, Definition of Done, Obszar |
bug |
Opis, Kroki do odtworzenia, Oczekiwane zachowanie, Faktyczne zachowanie, Środowisko, Dlaczego, Kryteria akceptacji, Definition of Done, Obszar |
W feat jest jeszcze sekcja Poza zakresem, ale można ją pominąć. Kryteria akceptacji piszemy jako listę - [ ] albo w formie Given/When/Then, tak żeby dało się je sprawdzić. Obszar to Frontend, Backend, Worker, Infra, Design albo Pitch.
Najprościej założyć zgłoszenie przez formularz: New issue, potem wybór typu. Formularz wpisuje prefiks do tytułu, ustawia etykietę type:* i typ zgłoszenia oraz dodaje je do projektu TuttiTrip.
Z terminala:
gh issue create --title "feat(backend): Eksport planu do PDF" --body-file issue.mdPlik issue.md ma te same nagłówki co formularz (### Opis, ### Dlaczego i tak dalej). Wielkość liter i polskie znaki w nagłówkach nie mają znaczenia, ## też przejdzie.
Workflow Issue format sprawdza każde nowe, edytowane i ponownie otwarte zgłoszenie. Gdy coś się nie zgadza, bot pisze komentarz z listą błędów i przykładem, dodaje etykietę invalid-format i zamyka zgłoszenie jako "not planned". Po poprawieniu tytułu albo treści (Edit) otwiera je z powrotem. Sekcja z samym _No response_, ..., TODO, <placeholderem> albo pustym - [ ] liczy się jako pusta.
Tytuł PR ma te same prefiksy co zgłoszenia, z jedną różnicą: poprawka błędu to bugfix:, nie bug:. Dozwolone są więc feat:, docs:, chore: i bugfix:, opcjonalnie z zakresem, np. bugfix(backend): Plan uwzględnia godziny otwarcia. Tytuł PR trafia do historii develop i do notatek wydania, więc ma mówić, co się zmieniło.
PR wydania z develop do main ma tytuł release: opis, np. release: Logowanie i podglądy gałęzi. Prefiks release: jest dozwolony tylko w takim PR.
Opis PR wypełniamy po polsku według szablonu, który GitHub wstawia przy tworzeniu PR w przeglądarce:
## Co i dlaczego: co zmienia PR i po co,## Powiązane issue:Closes #12alboRefs #12; wdocsichoremoże byćbrak,## Lista zmian,## Jak przetestować: kroki i link do podglądu,## Zrzuty ekranu: dla UI desktop i telefon, w innych przypadkach "nie dotyczy",## Checklista: verify lokalnie, testy, docs / AGENTS.md, brak sekretów.
Workflow PR format sprawdza tytuł i to, czy sekcje Co i dlaczego, Lista zmian i Jak przetestować są wypełnione, a w feat i bugfix także odnośnik #<numer> w Powiązanym issue. Błędy wypisuje w jednym komentarzu i oznacza check na czerwono. Po poprawce check robi się zielony, a komentarz zmienia się na "Format OK". PR wydania nie potrzebuje sekcji, bo jego opis to notatki wydania. Na darmowym planie GitHub nie ma ochrony gałęzi, więc czerwony check nie blokuje przycisku Merge. Nie mergujemy PR z czerwonym checkiem.
- Zaczynamy od świeżego
developna gałęzifeature/<krótka-nazwa>,fix/<krótka-nazwa>albochore/<krótka-nazwa>. - Otwieramy PR do
develop. Wchodzi, gdy CI iPR formatsą zielone. - PR do
developmergujemy przez "Squash and merge". Tytuł PR staje się wtedy jedynym commitem nadevelop. - Wydanie to PR z
developdomain, mergowany przez "Create a merge commit", żeby historiamainzawierała commity zdevelop.mainto produkcja. - Nie pushujemy bezpośrednio do
mainanidevelopi nie robimy force-push. - Po merge'u gałąź roboczą usuwa workflow
Delete merged branch, a razem z nią znika jej podgląd.mainidevelopnie są nigdy usuwane, więc PR wydania idzie prosto zdevelop. Gałąź zostaje, jeśli PR zamknięto bez merge'a albo jeśli jest bazą innego otwartego PR. Ustawienie "Automatically delete head branches" jest wyłączone, bo bez ochrony gałęzi kasowałodeveloppo każdym wydaniu.
Repozytoria mają włączone tylko dwie metody: "Squash and merge" (tytuł commita to zawsze tytuł PR) i "Create a merge commit". GitHub pozwala ustawić metody tylko dla całego repozytorium, nie dla gałęzi, więc wybór metody to zasada zespołu. Repozytorium zbiorcze tuttitrip ma tylko main, więc jego PR idą prosto do main przez "Squash and merge". Każda gałąź dostaje własny podgląd frontendu i API. Szczegóły są w AGENTS.md każdego repozytorium.
Notatki wydania powstają same w GitHub Releases (bez pliku CHANGELOG):
- Każdy PR dostaje etykietę
type:*na podstawie prefiksu tytułu (bugfix:dajetype:bug). - Po każdym merge'u do
developRelease Drafter aktualizuje szkic następnego wydania. Zmiany są pogrupowane: 🚀 Nowe funkcje, 🐛 Poprawki, 📚 Dokumentacja, 🧹 Porządki. - Merge PR wydania z
developdomainpublikuje ten szkic i zakłada tag namain. Sam PR wydania nie trafia do listy zmian. - Numer wersji:
featpodnosi wersję minor, pozostałe typy patch. Pierwsze wydanie tov0.1.0.
Na kanał zespołu trafiają dwa rodzaje wiadomości:
- Wyniki workflow z repozytoriów
tuttitrip,tuttitrip-frontend,tuttitrip-backendituttitrip-worker. Każde ma.github/workflows/discord-notify.yml, który naworkflow_run: completedwoła wspólnydiscord-notify.ymlz tego repozytorium. Wiadomość ma repozytorium, workflow, gałąź, zdarzenie, autora, numer uruchomienia, PR, link do uruchomienia i adres wdrożenia (frontend i backend). Kolor: zielony sukces, czerwony błąd, szary anulowanie. - Zmiany w projekcie #1 "TuttiTrip": dodanie elementu, zmiana Status, Area, Priority i innych pól (stara i nowa wartość), archiwizacja, usunięcie. Do tego nowe, zamknięte i scalone issue oraz PR. Wysyła je Worker
tuttitrip-discord-relay(katalogdiscord-relay/) z webhooka organizacji, bo GitHub Actions nie widzi zmian w projektach.
Zasady szumu:
- Uruchomienia zakończone
skippednie są wysyłane. Issue format,PR format,Delete merged branch,Release notesi workflow sprzątające podglądy piszą tylko wtedy, gdy się nie udały.- Sukces na
mainidevelopto pełna wiadomość z adresem wdrożenia. Sukces na innej gałęzi to jedna krótka linia. Anulowania (np. przez nowszy push do tej samej gałęzi) nie są wysyłane wcale. - Błąd, przekroczony czas i "wymaga akcji" to zawsze pełna wiadomość z listą nieudanych jobów.
- W projekcie pomijane są zmiany kolejności, etykiet i przypisań. Akcje botów na issue i PR (np. automatyczne zamknięcie złego zgłoszenia) też.
Konfiguracja:
- Lista obserwowanych workflow jest w
discord-notify.ymlkażdego repozytorium (workflows:). Nowy workflow trzeba tam dopisać po nazwie (polename:), namainidevelop.workflow_rundziała tylko z kopii namain. - Webhook Discorda to sekret repozytorium
DISCORD_WEBHOOK_URLw każdym z czterech repozytoriów. Sekret organizacji nie wystarczy: na darmowym planie nie widzą go repozytoria prywatne. - Worker:
discord-relay/wrangler.jsonc(projekt, pola, przekazywanie issue i PR), sekretyDISCORD_WEBHOOK_URLiGITHUB_WEBHOOK_SECRET(bez tokenu GitHub, więc wiadomość o elemencie projektu ma link zamiast tytułu). Webhook organizacji wskazuje nahttps://tuttitrip-hooks.gburek.app/github.
Zmiana (rotacja) webhooka Discorda: utwórz nowy webhook w ustawieniach kanału i usuń stary, potem z pliku z nowym URL-em:
for r in tuttitrip tuttitrip-frontend tuttitrip-backend tuttitrip-worker; do
gh secret set DISCORD_WEBHOOK_URL -R HackYeah-TuttiTripTeam/$r < discord-webhook.url
done
cd discord-relay && npx wrangler@4.147.0 secret put DISCORD_WEBHOOK_URL < ../discord-webhook.urlNie wklejaj URL-a webhooka do issue, PR, logów ani na czat. Kto go zna, może pisać na kanale.