155 lines
5.2 KiB
Markdown
155 lines
5.2 KiB
Markdown
# 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`
|
|
|
|
|