# 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//` dentro `containers//`. - 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_=` Supporto multi-arch: - Se presente `containers//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//values.env` - `properties.env` - file temporaneo con: - `TAG=` - contenuto di `imglist` (generato da `build_container.sh`) - Cerca tutti i manifest `kubernetes/**/*.yaml`. - Esegue sostituzione placeholder nel formato `` 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//values.env`. - Tutte le chiavi presenti in `properties.env`. - `TAG`. - `IMAGE_TAG_` (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=..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: - `` - `https-` - `-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//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 `-secret`