diff --git a/README.md b/README.md index 273a7cd..6fd2f3f 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ scenariuszy na branche. | Branch | Zawartość | |--------|-----------| | `main` | Kod aplikacji (bazowy), ten README, skrypty analizy | -| `dev` | Gałąź rozwojowa aplikacji | +| `dev` | Gałąź rozwojowa aplikacji + narzędzia pomiarowe (`deployment_timer.sh`, `data_analysis.py`) | | `jenkins-pipeline` | CI w Jenkins (`.jenkins/Jenkinsfile`, `podTemplate.yaml`) | | `woodpecker` | CI w Woodpecker (`.woodpecker/build.yaml`) | | `argo-workflows` | CI w Argo Workflows / Argo Events (`argo-workflows/*`) | @@ -179,6 +179,7 @@ JWT (tokeny w ciasteczkach), rolami oraz mechanizmem wylogowania (unieważnianie | `POST` | `/login` | Logowanie, ustawia token JWT w ciasteczku | brak | | `GET` | `/logout` | Wylogowanie (unieważnienie tokena) | zalogowany | | `GET` | `/health` | Sprawdzenie stanu aplikacji i połączenia z bazą | brak *(dostępne na branchach z potokami CI/CD)* | +| `GET` | `/version` | Zwraca wdrożoną wersję (`APP_VERSION` = SHA commita) i czas budowy | brak *(dostępne na branchach z potokami CI/CD)* | Przy pierwszym uruchomieniu, jeśli baza jest pusta, tworzone jest domyślne konto administratora (zob. zmienne `ADMIN_*`). @@ -303,17 +304,35 @@ znajduje kontener `api` i podmienia w nim tag obrazu na SHA nowego commita. ## Pomiar dostarczenia zmiany -Metryką porównawczą jest **czas dostarczenia zmiany** (od commita do działającej aplikacji na -klastrze), rozbity na składowe: +Metryką porównawczą jest **czas dostarczenia zmiany** — od commita do momentu, w którym nowa +wersja aplikacji faktycznie działa na klastrze. Pomiar jest w pełni zautomatyzowany, a +narzędzia znajdują się na branchu **`dev`**: -- **trigger_time** — czas od startu potoku CI do faktycznego rozpoczęcia budowania, -- **build_time** — czas budowania i publikacji obrazu, -- **deploy_time** — czas wdrożenia na klaster, -- **full_time** — całkowity czas dostarczenia. +- **[`deployment_timer.sh`](../../tree/dev/deployment_timer.sh)** — automatyczny pomiar + pojedynczego wdrożenia. Skrypt: + 1. odczytuje aktualną wersję z endpointu `/version`, + 2. zapisuje znacznik czasu do pliku, commituje go (`Automatyczna zmiana: `) + i wykonuje `git push` — co wyzwala cały łańcuch CI/CD, + 3. odpytuje `/version` co sekundę, aż zwrócona wersja się zmieni, + 4. zapisuje wynik (`start,koniec,czas,stara_wersja,nowa_wersja`) do pliku + `deployment_times.csv`. -Pomiar wykonywany jest osobno dla każdego z [9 scenariuszy](#scenariusze-pomiarowe) na -podstawie znaczników czasu z potoków CI/CD, co pozwala porównać narzędzia zarówno pod kątem -całkowitego czasu, jak i wkładu poszczególnych etapów. + Wykrycie zmiany opiera się na tym, że potok CI buduje obraz z `APP_VERSION` równym SHA + commita, a `/version` zwraca tę wartość. Commity `Automatyczna zmiana: ` widoczne + w historii repozytorium pochodzą właśnie z kolejnych przebiegów tego skryptu. + +- **[`data_analysis.py`](../../tree/dev/data_analysis.py)** — agreguje zebrane pomiary + (po 20 wdrożeń na scenariusz) i generuje wykresy słupkowe średnich czasów dostarczenia do + katalogu `plots/`. Tworzy 6 porównań: trzy według narzędzia CI (dla każdego CD) i trzy + według narzędzia CD (dla każdego CI), obejmując wszystkie [9 scenariuszy](#scenariusze-pomiarowe). + + ```bash + pip install matplotlib + python3 data_analysis.py # zapisuje plots/mean_times_0..5.png + ``` + +> Pliki wynikowe pomiarów (`deployment_times.csv`, katalog `plots/`) są generowane przez +> powyższe skrypty i nie są śledzone w repozytorium. ## Struktura repozytorium