Salve a tutti e bentornati in un nuovo articolo di tooldech, oggi vedremo come configurare una pipeline CI/CD utilizzando GitHub Actions per una semplice web app Python. L’obiettivo di questo tutorial è quello di vedere tutto il ciclo di vita di un software e di come ad ogni push viene ricreata un’immagine che verrà deployata su Docker Hub.
Prerequisites
- Un account GitHub.
- In questo punto utilizzeremo come repository del codice GitHub, ogni volta che faremo una push partirà una pipeline CI/CD, una sequenza automatizzata di passi per costruire, testare e distribuire codice con Github Actions, È una funzionalità di GitHub che permette di creare e gestire pipeline direttamente all’interno del repository.
- Docker installato sulla tua macchina.
- Come abbiamo fatto per tutti i nostri vecchi tutorial, dobbiamo avere Docker installato, un vecchio tutorial di tooldech sull’installazione .
- Familiarità di base con Python e file YAML.
- Avere l’ambiente di sviluppo funzionante come python,
- Una web app Python semplice da agganciare alla pipeline CI/CD. Usiamo Flask per questo esempio.
Step 1: Creare una Web App Python
Creiamo una piccola web app utilizzando Flask:
Struttura del progetto:

Una volta definito la struttura del progetto si può procedere con la creazione del progetto python, dove:
app.py
: Il file principale della web app Flask.Dockerfile
: Per creare l’immagine Docker.requirements.txt
: Elenca le dipendenze dell’app.
In seguito lascio il link al repository GitHub per visionare il codice.
Step 2: Creazione del repositroy GitHub
Nel secondo punto sì andrà a creare il repository dove caricare le modifiche o le aggiunte al codice dell’applicazione.

Quando abbiamo il repository e il codice pronto, dobbiamo unirli per unirli dovremmo, clonare il repository sulla nostra directory dove si trova il nostro codice.

Aprite il terminale e clonate il contenuto con il comando.
git clone https://github.com/<utente>/duck-app.git

Successivamente aver clonato il repository si può procedere con l’integrazione con il codice, basta semplicemente spostarlo dentro la cartella. Infine potete fare il comando ls per vedere se ci sono i file dentro la directory.

Step 3: Containereizzazione dell’applicazione
In questo step andremo a costuire il Dockerfile per containerizzare la nostra web app.

Il ruolo del Dockerfile
è quello di descrivere come costruire l’immagine Docker della tua applicazione. La pipeline utilizza questo file per eseguire il comando docker build
automaticamente, quindi non devi eseguire il comando manualmente, ma se si vuole testare il locale il container puoio farlo eseguendo il classico comando di docker build.
docker build -t username/docker-image:tag .
docker run -p 5000:5000 username/docker-image:tag
Importante è quello di creare il file requirements.txt per indicare le dipendenze che si utilizzeranno, questo punto si guarda solo se si sta usando python.
Step 4: Push sul Repository
Ora che abbiamo le parti del codice e le parti operative come Docker, ci affrettiamo al pushare sul nostro repository di GitHub.

Questa dovrebbe essere la situazione che dovete avere quando starete per pushare il codice.
Per il push effettivo ricordatevi se non lo avete già fatto il comando per inizializzare il repositorty e una serie di comandi che vedremo velocemente.
git init
N.B. se non è stato fatto ricordatevi di abilitare le configurazioni di Git, con i comandi
git config --global user.email "emailGitHub"
git config --global user.user "userGitHub"

Adesso, che si procede con la sequenza di comandi per pushare sulla repo, li elencherò senza spiegazione.
git status
git add .
git status
git commit -m" first commit"

Infine dovreste riuscire a pushare sul repository che avete creato GitHub, come ho fatto io.

Ora siamo pronti per andare al prossimo step che è preparare l’ambiente per deployare il container su Docker Hub.
Step 5: Configurare Docker Hub
In questo punto andremo a configurare il Docker Hub, preparare Docker Hub è una fase fondamentale dello svolgimento dell’esercizio, in quanto Docker Hub serve come registro centralizzato dove la pipeline CI/CD pubblicherà l’immagine Docker della tua applicazione.
Se non sapete cosa è Docker hub ecco il link ufficiale che lo spiega.
Se avete già fatto l’account troverete questa schermata,

Entrati dentro a Docker Hub, si andrà a creare il repository per ospitare l’immagine.

In alto a destra ci sarà il bottone ” Create a repository “, una volta cliccato dovrete:
- Dare un nome
- Opzionale dare una descrizione
- Dire la visibilità dell repository

Cliccate su ” Create ” e avrete il repository su Docker Hub, nel prossimo passo di andrà a creare la pipeline
Step 6: Preparazione Pipeline
Questo punto è il punto chiave di tutto l’articolo, qua andremo a :
- Preparare i secrets delle utenze di Docker Hub su Git Hub Actions
- Scrivere lo yaml della pipeline
- Pushare la pipeline
1. Configurare i Segreti GitHub
Vai al repository GitHub.
Clicca su Settings > Secrets and variables > Actions > New repository secret.
Aggiungi i seguenti segreti:
DOCKER_USERNAME: Il tuo username Docker Hub.
DOCKER_PASSWORD: La tua password Docker Hub.
Vi dovrete trovare in questa situazione

2. Creare il Workflow di GitHub Actions
Qua andremo a creare la pipeline che servirà per il ciclo di vita del software.
come prima cosa si va a creare la directory /.github/workflows/
nel repository e scrivere un file chiamato docker-publish.yml
.
La directory .github/workflows/
deve essere posizionata alla radice del progetto, ovvero nello stesso livello di app.py
, Dockerfile
, e requirements.txt
.
Perché .github/workflows/
è nella radice?
- Integrazione con GitHub Actions:
- GitHub Actions cerca automaticamente i file YAML di configurazione nella directory
.github/workflows/
della radice del repository. Se il file non si trova in quella posizione, GitHub non sarà in grado di riconoscere e avviare il workflow.
- GitHub Actions cerca automaticamente i file YAML di configurazione nella directory
- Separazione dei file di configurazione:
- Mantenere i file di configurazione CI/CD separati dal codice sorgente (
app/
) aiuta a organizzare il progetto e a evitare confusione.
- Mantenere i file di configurazione CI/CD separati dal codice sorgente (
- Best Practice:
- Posizionare
.github/workflows/
nella radice del progetto segue le linee guida ufficiali di GitHub Actions, garantendo che ogni pipeline del progetto sia facilmente individuabile.
- Posizionare

Una volta create le directory e il file dovete creare il file della pipeline.

Completato lo yaml, ci prepariamo a pushare il tutto.
3. Commit e push: Dopo aver creato il file della pipeline, esegui il commit e il push del file:
I comandi da fare sono i soliti per pushare.

Appena la push va a buon fine ci dirigiamo subito sul nostro GitHub nella sezione Action e dovreste vedere una serie di passaggi, ovvero la pipeline che è partita.




Arrivato a questo punto la pipeline ha finito e dovrebbe aver deployato l’immagine su Docker Hub.
Step 7: Verificare su Docker Hub
Come ultimi passi non ci resta che guardare su Docker Hub e vedere se tutto è andato bene.

Come si può vedere l’immagine è stata caricata correttamente nelle repository.
Adesso potrete scaricarvi in ogni macchina a vostro piacimento con Docker sopra la vostra web-app con i comandi.
docker run -p 5000:5000 DOCKER_USERNAME/web-app-flask:latest
Riassunto
In questo tutorial i passi che abbiamo visto per la creazione di un ciclo di vita intero del software è stato:
- Creazione dell’applicazione
- Repository GitHub
- Dockerfile
- push sul repository del codice
- log in su Docker Hub
- creazione pipeline
- push pipeline
- creazione immagine e push su Docker Hub
- scaricare da Docker Hub
Conclusioni
Con questa pipeline CI/CD, hai automatizzato il processo di build e deploy della tua web app su Docker Hub. Ogni volta che fai un push al branch main
, l’immagine Docker sarà aggiornata automaticamente. 🎉
Anche questo tutorial è giunto alla fine, grazie di aver trovat interessante la lettura fino a questo punto. Vi auguro delle buone feste natalizie e auguri per il nuovo anno pieno di tutoria super interessanti per tooldech per voi cari lettori, alla prossima un’abbraccio.
Seguici sui social!