Files
italiadatacenter/pipeline/DEV_build_deploy.md
alessandro 20d506407a primo
2026-07-17 09:42:52 +02:00

5.2 KiB

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