6.8 KiB
Raporttivarasto — MinIO
Kuuluu arkkitehtuuriin: architecture.md. Tämä dokumentti määrittelee testiraporttien tallennuksen, URL-rakenteen, autentikoinnin ja retention policyn.
Miksi MinIO
Gitea Actionsin sisäänrakennettu artifact-järjestelmä ei tue HTML-selailtavuutta (vain ZIP-lataus), ja artifactien retentio on aikapohjainen (oletus 90 vrk). Jenkins-versiossa raportit olivat selailtavissa suoraan buildista ja pysyivät build-historian mukana.
MinIO täyttää tämän aukon:
- S3-yhteensopiva — standardi API, laaja työkalutuki (
mc,s3cmd, AWS SDK) - Staattinen web-hosting — HTML-raportit renderöityvät selaimessa suoraan bucketista
- Kubernetes-natiivi — yksi binääri, helppo deployata samaan klusteriin
- Ei per-repo-konfiguraatiota — yksi bucket palvelee kaikkia projekteja
- Ennustettava URL — polku rakentuu deterministisesti reposta ja commitista
URL-rakenne
{MINIO_BASE}/{repo_slug}/{commit_short}/{report_type}/index.html
| Osa | Lähde | Esimerkki |
|---|---|---|
MINIO_BASE |
Gitea org variable MINIO_BASE_URL |
https://reports.smith.keskikuja.site |
repo_slug |
GITHUB_REPOSITORY → slug |
temperature-store |
commit_short |
GITHUB_SHA → 8 merkkiä |
abc12345 |
report_type |
Raportin tyyppi | cucumber, jacoco, junit, site |
URL rakennetaan push-reports.sh-skriptissä ja POSTataan Gitea-commitin statusviestiin url-kenttään.
Staattinen web-hosting
MinIO-bucket konfiguroidaan staattiseksi web-sivustoksi:
mc anonymous set download minio/reports
mc website create minio/reports --region us-east-1
Bucketin rakenne:
reports/
├── temperature-store/
│ ├── abc12345/
│ │ ├── cucumber/
│ │ │ └── overview-features.html
│ │ ├── jacoco/
│ │ │ └── index.html
│ │ └── site/
│ │ └── index.html
│ └── def67890/
│ └── ...
├── user-service/
│ └── ...
Jokaisella buildilla on oma {commit_short}-hakemistonsa — ei race conditionia rinnakkaisten buildien välillä.
Autentikointi: OIDC + Traefik middleware
Raporttien tulee olla katseltavissa ilman erillistä kirjautumista (muuten commitin statusviestin URL-linkki ei toimi suoraan). Samalla julkinen bucket halutaan suojata.
Ratkaisu: MinIO asetetaan Traefik reverse-proxyn taakse. Traefik middleware hoitaa OIDC-autentikoinnin, jossa:
- Käyttäjä klikkaa raportin URL:ää commitin statusviestistä
- Traefik ohjaa OIDC-kirjautumiseen (Gitea OAuth2 provider)
- Onnistuneen kirjautumisen jälkeen käyttäjä ohjataan raporttiin
- Session säilyy — ei tarvitse kirjautua jokaista raporttia varten
Selain ──→ Traefik ──→ OIDC middleware ──→ Gitea OAuth2
│
└──→ MinIO (bucket reports, static web)
CI-pusku ohittaa OIDC:n: Workflow'n push-reports.sh käyttää MinIO:n S3 API:a suoraan access key + secret key -parilla (Gitea org secrets). CI-liikenne ei kulje julkisen ingressin kautta — mc-työkalu puhuu suoraan MinIO-palvelulle klusterin sisällä.
Retention policy
Pelkkä aikaperustainen retentio ("poista yli 90 vrk vanhat") ei riitä. Retention policyn pitää huomioida:
| Kriteeri | Kuvaus |
|---|---|
| Aika | Raportti säilyy X päivää buildin jälkeen |
| Branch | master-branchin raportit säilyvät pidempään kuin feature-branchien |
| Tagi | Version kanssa tagitun commitin raportteja ei poisteta koskaan |
| Viimeisin N | Jokaisesta branchista säilytetään vähintään N uusinta raporttia |
Toteutus: Retention policy konfiguroidaan ConfigMap:lla, jonka siivousskripti lukee. ConfigMap on osa MinIO-deploymentin Kubernetes-manifestia.
apiVersion: v1
kind: ConfigMap
metadata:
name: minio-report-retention
data:
retention.yaml: |
rules:
- branch: "master"
maxAgeDays: 365
keepMin: 20
- branch: "feature/*"
maxAgeDays: 90
keepMin: 5
- tagged: true
maxAgeDays: -1 # ei koskaan poisteta
keepMin: -1
- default:
maxAgeDays: 90
keepMin: 3
Siivoussripti ajetaan CronJobina (esim. kerran päivässä):
- Listaa kaikki bucketin objektit
- Parsii polusta
repo_slugjacommit_short - Hakee Gitea API:sta commitin metadata (branch, onko tagattu)
- Soveltaa ConfigMapin retention-sääntöjä
- Poistaa vanhentuneet objektit
mc rm:llä
Raporttien pushaus workflow'sta
push-reports.sh:
#!/bin/bash
# Käyttö: push-reports.sh <report_type> <source_dir>
# Esim: push-reports.sh cucumber target/cucumber-report/
REPORT_TYPE=$1
SOURCE_DIR=$2
TARGET="minio/reports/${GITHUB_REPOSITORY}/${GITHUB_SHA::8}/${REPORT_TYPE}/"
mc cp --recursive "$SOURCE_DIR" "$TARGET"
echo "${MINIO_BASE_URL}/${GITHUB_REPOSITORY}/${GITHUB_SHA::8}/${REPORT_TYPE}/index.html"
Skripti palauttaa URL:n, joka syötetään report-status.sh:lle commit-statusviestin url-kenttään.
Konfiguraatio Giteassa
| Secret / Variable | Tyyppi | Sisältö |
|---|---|---|
MINIO_ACCESS_KEY |
Org secret | MinIO access key |
MINIO_SECRET_KEY |
Org secret | MinIO secret key |
MINIO_BASE_URL |
Org variable | https://reports.smith.keskikuja.site |
Workflow lukee nämä automaattisesti — projekti ei määrittele niitä ci-flow-values.yaml:ssa.
MinIO-deployment (viitteellinen)
Minimalistinen Kubernetes-deployment samassa klusterissa:
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio-reports
spec:
replicas: 1
template:
spec:
containers:
- name: minio
image: minio/minio:latest
args: ["server", "/data", "--console-address", ":9001"]
env:
- name: MINIO_ROOT_USER
valueFrom:
secretKeyRef:
name: minio-secrets
key: access-key
- name: MINIO_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: minio-secrets
key: secret-key
ports:
- containerPort: 9000 # S3 API
- containerPort: 9001 # Console UI
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: minio-reports-pvc
Huomioitavaa
- Bucketin luonti ja web-hostingin aktivointi tehdään kerran deploymentin yhteydessä. Ei per build.
- URL on deterministinen — raportin URL voidaan generoida jo ennen kuin raportti on pushattu. Jos raporttihakemistoa ei ole (esim. testit skipattiin), linkki johtaa 404:ään.
- Indeksitiedoston nimi riippuu raporttityypistä: Cucumber →
overview-features.html, JaCoCo →index.html, Maven Site →index.html.push-reports.sh:n vastuulla varmistaa, että indeksitiedosto löytyy.