This commit is contained in:
alessandro
2026-07-17 09:42:52 +02:00
commit 20d506407a
93 changed files with 14526 additions and 0 deletions

View File

@@ -0,0 +1,154 @@
# Pipeline Gitea: `DEV_build_deploy.yaml`
## Scopo
Questa pipeline esegue build, publish immagini Docker e deploy Kubernetes dell'ambiente `dev`.
Flusso alto livello:
1. Checkout del repository.
2. Login al registry Harbor.
3. Build e push delle immagini per ogni servizio in `containers/*`.
4. Creazione del file `kubeconfig` da secret.
5. Sostituzione variabili nei manifest Kubernetes.
6. Deploy dei manifest e configurazione listener HTTPS sul Gateway.
## Trigger e runner
- Trigger: `push` su branch `main`.
- Job: `docker`.
- Runner richiesto: `POC-Master0`.
## Definizione pipeline
File: `pipeline/DEV_build_deploy.yaml`
Step principali:
- `actions/checkout@v4`
- `docker/login-action@v3`
- `/root/work/pipeline/build_container.sh ${{ github.event.repository.name }} ${{ vars.REGISTRY }}`
- creazione `./kubeconfig` da `${{ secrets.KUBECONFIG_DEV }}`
- `/root/work/pipeline/customize.sh dev`
- `/root/work/pipeline/deploy.sh`
## Script eseguiti dalla pipeline
### 1) `build_container.sh`
Responsabilità:
- Itera tutte le directory `containers/*/`.
- Copia i sorgenti da `src/<container>/` dentro `containers/<container>/`.
- Rileva il Dockerfile (`dockerfile` oppure `Dockerfile`).
- Costruisce due tag immagine:
- `${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:${COMMIT_SHA}`
- `${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:latest`
- Esegue push su registry.
- Scrive su file `./imglist` una riga per container:
- `IMAGE_TAG_<container>=<image-tag-con-sha>`
Supporto multi-arch:
- Se presente `containers/<container>/platform.conf` con chiave `platform=...`, usa `docker buildx build --platform ... --push`.
- In assenza di `platform.conf` usa `docker build` + `docker push` classico.
Input (argomenti):
- `$1`: `REPO_NAME` (passato dalla pipeline con `${{ github.event.repository.name }}`).
- `$2`: `REGISTRY_URL` (passato da `${{ vars.REGISTRY }}`).
Prerequisiti runtime:
- Docker daemon disponibile nel runner.
- Permessi push su registry.
- Struttura cartelle coerente tra `containers/` e `src/`.
### 2) `customize.sh`
Responsabilità funzionale attesa:
- Carica variabili da:
- `env/<ENV>/values.env`
- `properties.env`
- file temporaneo con:
- `TAG=<commit_sha>`
- contenuto di `imglist` (generato da `build_container.sh`)
- Cerca tutti i manifest `kubernetes/**/*.yaml`.
- Esegue sostituzione placeholder nel formato `<CHIAVE>` con i valori trovati.
Input (argomenti):
- `$1`: ambiente (`dev|qa|prod`).
- In pipeline attuale viene usato `dev`.
Placeholder parametrizzabili nei manifest:
- Tutte le chiavi presenti in `env/<ENV>/values.env`.
- Tutte le chiavi presenti in `properties.env`.
- `TAG`.
- `IMAGE_TAG_<container>` (una per ciascun container buildato).
Output:
- Manifest Kubernetes in-place con valori sostituiti.
### 3) `deploy.sh`
Responsabilità:
- Cerca manifest CNPG (`apiVersion: postgresql.cnpg.io/v1`).
- Se trovato:
- Estrae `metadata.name` del cluster PostgreSQL.
- Ricava namespace dal role `namespace-deployer` nel cluster.
- Crea/aggiorna ConfigMap `service-config` con:
- `tipodb=postgres`
- `urldb=<pg_name>.<namespace>.svc.cluster.local`
- Applica tutti i manifest YAML trovati in `kubernetes/` (directory per directory).
- Invoca `/root/work/pipeline/addlistener.sh` per configurare listener HTTPS sul Gateway.
Prerequisiti runtime:
- `kubectl` disponibile nel runner.
- `./kubeconfig` presente e valido.
- Opzionale `yq` (se assente, usa fallback con `awk` per estrazione nome CNPG).
### 4) `addlistener.sh`
Responsabilità:
- Legge la chiave `endpoint` da `properties.env`.
- Calcola token host-based dal dominio.
- Invoca `/root/work/pipeline/add-listener.sh` passando:
- `<endpoint>`
- `https-<token>`
- `<token>-secret`
Input (argomenti):
- `$1` opzionale: path file properties (default `properties.env`).
Comportamento:
- Se file non esiste o `endpoint` non valorizzato: termina senza errore bloccante (`exit 0`).
### 5) `add-listener.sh`
Responsabilità:
- Effettua patch JSON sulla risorsa Gateway Kubernetes:
- Gateway: `main-gateway`
- Namespace: `nginx-gateway`
- Aggiunge un listener HTTPS con certificato TLS da Secret.
- Verifica idempotenza per `name` e `hostname` già presenti.
Input (argomenti):
- `$1`: `hostname`
- `$2`: `name`
- `$3`: `secret-name`
## Parametrizzazione complessiva
### Variabili Gitea Actions
- `vars.REGISTRY`: URL registry target.
### Secret Gitea Actions
- `secrets.HARBOR_USERNAME`
- `secrets.HARBOR_PASSWORD`
- `secrets.KUBECONFIG_DEV`
### File di configurazione repository
- `env/dev/values.env` (o `qa`, `prod` se si cambia argomento di `customize.sh`)
- `properties.env`
- `containers/<service>/platform.conf` (opzionale)
### Parametri indiretti derivati
- Nome repository da `${{ github.event.repository.name }}`.
- SHA commit da `git rev-parse HEAD`.
- Tag immagine per servizio in `imglist`.
## Note operative importanti
1. Il file `imglist` viene creato/appeso da `build_container.sh` e poi letto da `customize.sh`; il job deve mantenere lo stesso workspace tra step.
2. I manifest Kubernetes vengono modificati in-place da `sed -i`.
3. La parte Gateway dipende da:
- presenza di `endpoint` in `properties.env`
- esistenza della risorsa `Gateway/nginx-gateway/main-gateway`
- esistenza del Secret TLS con nome `<token>-secret`