{"id":504,"date":"2024-12-25T03:51:45","date_gmt":"2024-12-25T02:51:45","guid":{"rendered":"https:\/\/www.tooldech.com\/?p=504"},"modified":"2025-07-10T07:06:30","modified_gmt":"2025-07-10T07:06:30","slug":"pipeline-con-github-actions-devops-tutorial","status":"publish","type":"post","link":"https:\/\/tooldech.com\/en\/pipeline-con-github-actions-devops-tutorial\/","title":{"rendered":"How to Create a CI\/CD Pipeline with GitHub Actions"},"content":{"rendered":"<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Salve a tutti e bentornati in un nuovo articolo di tooldech, oggi vedremo come configurare una pipeline CI\/CD utilizzando <strong>GitHub Actions<\/strong> per una semplice web app Python. L&#8217;obiettivo di questo tutorial \u00e8 quello di vedere tutto il ciclo di vita di un software e di come ad ogni push viene ricreata un&#8217;immagine che verr\u00e0 deployata su Docker Hub.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Prerequisites<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un account GitHub.\n<ul class=\"wp-block-list\">\n<li>In questo punto utilizzeremo come repository del codice GitHub, ogni volta che faremo una push partir\u00e0 una pipeline CI\/CD, una sequenza automatizzata di passi per costruire, testare e distribuire codice con <a href=\"https:\/\/docs.github.com\/en\/actions\">Github Actions<\/a>, \u00c8 una funzionalit\u00e0 di GitHub che permette di creare e gestire pipeline direttamente all&#8217;interno del repository.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Docker installato sulla tua macchina.\n<ul class=\"wp-block-list\">\n<li>Come abbiamo fatto per tutti i nostri vecchi tutorial, dobbiamo avere Docker installato, un vecchio tutorial di tooldech sull&#8217;<a href=\"https:\/\/www.tooldech.com\/docker-installation\/\">installazione <\/a>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Familiarit\u00e0 di base con Python e file YAML.\n<ul class=\"wp-block-list\">\n<li>Avere l&#8217;ambiente di sviluppo funzionante come <a href=\"https:\/\/www.python.org\/downloads\/\">python<\/a>, <\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Una web app Python semplice da agganciare alla pipeline CI\/CD. Usiamo Flask per questo esempio.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 1: Creare una Web App Python<\/strong><\/h3>\n\n\n\n<p>Creiamo una piccola web app utilizzando Flask:<\/p>\n\n\n\n<p><strong>Struttura del progetto:<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"604\" height=\"634\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/code2.png\" alt=\"\" class=\"wp-image-935\" style=\"width:378px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/code2.png 604w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/code2-286x300.png 286w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/figure>\n<\/div>\n\n\n<p>Una volta definito la struttura del progetto si pu\u00f2 procedere con la creazione del progetto python, dove:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>app.py<\/code><\/strong>: Il file principale della web app Flask.<\/li>\n\n\n\n<li><strong><code>Dockerfile<\/code><\/strong>: Per creare l\u2019immagine Docker.<\/li>\n\n\n\n<li><strong><code>requirements.txt<\/code><\/strong>: Elenca le dipendenze dell\u2019app.<\/li>\n<\/ul>\n\n\n\n<p>In seguito lascio il link al repository GitHub per visionare il codice.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-text-align-center wp-element-button\" href=\"https:\/\/github.com\/Matteo29-mar\/duck-app\">GitHub<\/a><\/div>\n<\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 2: Creazione del repositroy GitHub<\/strong><\/h3>\n\n\n\n<p>Nel secondo punto s\u00ec andr\u00e0 a creare il repository dove caricare le modifiche o le aggiunte al codice dell&#8217;applicazione. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"229\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo-1024x229.png\" alt=\"\" class=\"wp-image-927\" style=\"width:760px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo-1024x229.png 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo-300x67.png 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo-768x172.png 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo.png 1431w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>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.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"635\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/clone-1024x635.png\" alt=\"\" class=\"wp-image-921\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/clone-1024x635.png 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/clone-300x186.png 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/clone-768x476.png 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/clone.png 1050w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Aprite il terminale e clonate il contenuto con il comando.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git clone https:\/\/github.com\/&lt;utente&gt;\/duck-app.git<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"178\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cloneT-1024x178.png\" alt=\"\" class=\"wp-image-922\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cloneT-1024x178.png 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cloneT-300x52.png 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cloneT-768x133.png 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cloneT.png 1246w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Successivamente aver clonato il repository si pu\u00f2 procedere con l&#8217;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.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"360\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/ls.jpg\" alt=\"\" class=\"wp-image-923\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/ls.jpg 750w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/ls-300x144.jpg 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 3: Containereizzazione dell&#8217;applicazione<\/strong><\/h3>\n\n\n\n<p>In questo step andremo a costuire il Dockerfile per containerizzare la nostra web app.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"500\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerfile-1024x500.png\" alt=\"\" class=\"wp-image-924\" style=\"width:512px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerfile-1024x500.png 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerfile-300x146.png 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerfile-768x375.png 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerfile.png 1066w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Il ruolo del <code>Dockerfile <\/code>\u00e8 quello di descrivere  come costruire l&#8217;immagine Docker della tua applicazione. La pipeline utilizza questo file per eseguire il comando <code>docker build<\/code> automaticamente, quindi <strong>non devi eseguire il comando manualmente<\/strong>, ma se si vuole testare il locale il container puoio farlo eseguendo il classico comando di docker build.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>docker build -t username\/docker-image:tag .\ndocker run -p 5000:5000 username\/docker-image:tag<\/code><\/pre>\n\n\n\n<p>Importante \u00e8 quello di creare il file requirements.txt per indicare le dipendenze che si utilizzeranno, questo punto si guarda solo se si sta usando python.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 4: Push sul Repository <\/strong><\/h3>\n\n\n\n<p>Ora che abbiamo le parti del codice e le parti operative come Docker, ci affrettiamo al pushare sul nostro repository di GitHub.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.tooldech.com\/wp-content\/uploads\/2024\/12\/pushG-jpg.webp\" alt=\"push code first commit\" class=\"wp-image-521\"\/><\/figure>\n<\/div>\n\n\n<p>Questa dovrebbe essere la situazione che dovete avere quando starete per pushare il codice.<\/p>\n\n\n\n<p>Per il push effettivo ricordatevi se non lo avete gi\u00e0 fatto il comando per inizializzare il repositorty e una serie di comandi che vedremo velocemente.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git init <\/code><\/pre>\n\n\n\n<p><strong>N.B.<\/strong> se non \u00e8 stato fatto ricordatevi di abilitare le configurazioni di Git, con i comandi<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git config --global user.email \"emailGitHub\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git config --global user.user \"userGitHub\"<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"42\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitconfig-1024x42.jpg\" alt=\"\" class=\"wp-image-926\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitconfig-1024x42.jpg 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitconfig-300x12.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitconfig-768x31.jpg 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitconfig.jpg 1171w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Adesso, che si procede con la sequenza di comandi per pushare sulla repo,  li elencher\u00f2 senza spiegazione.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git status<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git add .<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git status<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>git commit -m\" first commit\"<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"702\" height=\"634\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitP.jpg\" alt=\"\" class=\"wp-image-928\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitP.jpg 702w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/gitP-300x271.jpg 300w\" sizes=\"auto, (max-width: 702px) 100vw, 702px\" \/><\/figure>\n<\/div>\n\n\n<p>Infine dovreste riuscire a pushare sul repository che avete creato GitHub, come ho fatto io.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"797\" height=\"459\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo.jpg\" alt=\"\" class=\"wp-image-929\" style=\"width:703px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo.jpg 797w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo-300x173.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/repo-768x442.jpg 768w\" sizes=\"auto, (max-width: 797px) 100vw, 797px\" \/><\/figure>\n<\/div>\n\n\n<p>Ora siamo pronti per andare al prossimo step che \u00e8 preparare l&#8217;ambiente per deployare il container su Docker Hub.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 5: Configurare Docker Hub<\/strong><\/h3>\n\n\n\n<p>In questo punto andremo a configurare il Docker Hub, preparare Docker Hub \u00e8 una fase fondamentale dello svolgimento dell\u2019esercizio, in quanto Docker Hub serve come <strong>registro centralizzato<\/strong> dove la pipeline CI\/CD pubblicher\u00e0 l\u2019immagine Docker della tua applicazione.<\/p>\n\n\n\n<p>Se non sapete cosa \u00e8 <a href=\"https:\/\/docs.docker.com\/docker-hub\/repos\/\">Docker hub<\/a> ecco il link ufficiale che lo spiega.<\/p>\n\n\n\n<p>Se avete gi\u00e0 fatto  l&#8217;account troverete questa schermata,<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"767\" height=\"816\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dh.jpg\" alt=\"\" class=\"wp-image-930\" style=\"width:504px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dh.jpg 767w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dh-282x300.jpg 282w\" sizes=\"auto, (max-width: 767px) 100vw, 767px\" \/><\/figure>\n<\/div>\n\n\n<p>Entrati dentro a Docker Hub, si andr\u00e0 a creare il repository per ospitare l&#8217;immagine.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"357\" height=\"182\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/create.jpg\" alt=\"\" class=\"wp-image-931\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/create.jpg 357w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/create-300x153.jpg 300w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><\/figure>\n<\/div>\n\n\n<p>In alto a destra ci sar\u00e0 il bottone &#8221; Create a repository &#8220;, una volta cliccato dovrete:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dare un nome<\/li>\n\n\n\n<li>Opzionale dare una descrizione<\/li>\n\n\n\n<li>Dire la visibilit\u00e0 dell repository<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"283\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/created-1024x283.jpg\" alt=\"\" class=\"wp-image-932\" style=\"width:690px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/created-1024x283.jpg 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/created-300x83.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/created-768x212.jpg 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/created-1536x424.jpg 1536w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/created.jpg 1659w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Cliccate su &#8221; Create &#8221; e avrete il repository su Docker Hub, nel prossimo passo di andr\u00e0 a creare la pipeline<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 6: Preparazione Pipeline<\/strong><\/h3>\n\n\n\n<p>Questo punto \u00e8 il punto chiave di tutto l&#8217;articolo, qua andremo a :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li> Preparare i secrets delle utenze di Docker Hub su Git Hub Actions<\/li>\n\n\n\n<li>Scrivere lo yaml della pipeline <\/li>\n\n\n\n<li>Pushare la pipeline<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong>Configurare i Segreti GitHub<\/strong><\/h4>\n\n\n\n<p>Vai al repository GitHub.<\/p>\n\n\n\n<p>Clicca su <strong>Settings &gt; Secrets and variables &gt; Actions<\/strong> <strong>&gt; New repository secret.<\/strong><\/p>\n\n\n\n<p>Aggiungi i seguenti segreti:<\/p>\n\n\n\n<p><strong>DOCKER_USERNAME<\/strong>: Il tuo username Docker Hub.<\/p>\n\n\n\n<p><strong>DOCKER_PASSWORD<\/strong>: La tua password Docker Hub.<\/p>\n\n\n\n<p>Vi dovrete trovare in questa situazione <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"855\" height=\"692\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/secret.jpg\" alt=\"\" class=\"wp-image-933\" style=\"width:581px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/secret.jpg 855w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/secret-300x243.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/secret-768x622.jpg 768w\" sizes=\"auto, (max-width: 855px) 100vw, 855px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">2. <strong>Creare il Workflow di GitHub Actions<\/strong><\/h4>\n\n\n\n<p>Qua andremo a creare la pipeline che servir\u00e0 per il ciclo di vita del software.<\/p>\n\n\n\n<p>come prima cosa si va a creare la directory <code>\/.github\/workflows\/<\/code> nel repository e scrivere  un file chiamato <code>docker-publish.yml<\/code>.<\/p>\n\n\n\n<p>La directory <code>.github\/workflows\/<\/code> deve essere posizionata <strong>alla radice del progetto<\/strong>, ovvero <strong>nello stesso livello di <code>app.py<\/code>, <code>Dockerfile<\/code>, e <code>requirements.txt<\/code><\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Perch\u00e9 <code>.github\/workflows\/<\/code> \u00e8 nella radice?<\/strong><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Integrazione con GitHub Actions:<\/strong>\n<ul class=\"wp-block-list\">\n<li>GitHub Actions cerca automaticamente i file YAML di configurazione nella directory <code>.github\/workflows\/<\/code> della radice del repository. Se il file non si trova in quella posizione, GitHub non sar\u00e0 in grado di riconoscere e avviare il workflow.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Separazione dei file di configurazione:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Mantenere i file di configurazione CI\/CD separati dal codice sorgente (<code>app\/<\/code>) aiuta a organizzare il progetto e a evitare confusione.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Best Practice:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Posizionare <code>.github\/workflows\/<\/code> nella radice del progetto segue le linee guida ufficiali di GitHub Actions, garantendo che ogni pipeline del progetto sia facilmente individuabile.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"710\" height=\"786\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codep.png\" alt=\"\" class=\"wp-image-934\" style=\"width:342px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codep.png 710w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codep-271x300.png 271w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><\/figure>\n<\/div>\n\n\n<p>Una volta create le directory e il file dovete creare il file della pipeline.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"940\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codey-1024x940.png\" alt=\"\" class=\"wp-image-936\" style=\"aspect-ratio:1;width:466px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codey-1024x940.png 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codey-300x275.png 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codey-768x705.png 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codey-1536x1409.png 1536w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/codey.png 1602w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Completato lo yaml, ci prepariamo a pushare il tutto.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">3. <strong>Commit e push:<\/strong> Dopo aver creato il file della pipeline, esegui il commit e il push del file:<\/h4>\n\n\n\n<p>I comandi da fare sono i soliti per pushare.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"782\" height=\"536\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pushpipe.jpg\" alt=\"\" class=\"wp-image-937\" style=\"width:563px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pushpipe.jpg 782w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pushpipe-300x206.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pushpipe-768x526.jpg 768w\" sizes=\"auto, (max-width: 782px) 100vw, 782px\" \/><\/figure>\n<\/div>\n\n\n<p>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 \u00e8 partita.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"301\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe1-1024x301.jpg\" alt=\"\" class=\"wp-image-938\" style=\"width:565px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe1-1024x301.jpg 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe1-300x88.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe1-768x225.jpg 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe1.jpg 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"336\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe2-1024x336.jpg\" alt=\"\" class=\"wp-image-939\" style=\"width:564px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe2-1024x336.jpg 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe2-300x98.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe2-768x252.jpg 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe2.jpg 1430w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1263\" height=\"430\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe3.jpg\" alt=\"\" class=\"wp-image-940\" style=\"width:562px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe3.jpg 1263w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe3-300x102.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe3-1024x349.jpg 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe3-768x261.jpg 768w\" sizes=\"auto, (max-width: 1263px) 100vw, 1263px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"719\" height=\"631\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe4.jpg\" alt=\"\" class=\"wp-image-941\" style=\"width:570px;height:auto\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe4.jpg 719w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/pipe4-300x263.jpg 300w\" sizes=\"auto, (max-width: 719px) 100vw, 719px\" \/><\/figure>\n<\/div>\n\n\n<p>Arrivato a questo punto la pipeline ha finito e dovrebbe aver deployato l&#8217;immagine su Docker Hub.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Step 7: Verificare su Docker Hub<\/strong><\/h3>\n\n\n\n<p>Come ultimi passi non ci resta che guardare su Docker Hub e vedere se tutto \u00e8 andato bene.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerhub-1024x640.jpg\" alt=\"\" class=\"wp-image-942\" srcset=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerhub-1024x640.jpg 1024w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerhub-300x188.jpg 300w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerhub-768x480.jpg 768w, https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/dockerhub.jpg 1097w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Come si pu\u00f2 vedere l&#8217;immagine \u00e8 stata caricata correttamente nelle repository.<\/p>\n\n\n\n<p>Adesso potrete scaricarvi in ogni macchina a vostro piacimento con Docker sopra la vostra web-app con i comandi.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-background-color has-background\"><code>docker run -p 5000:5000 DOCKER_USERNAME\/web-app-flask:latest<\/code><\/pre>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Riassunto<\/h2>\n\n\n\n<p>In questo tutorial i passi che abbiamo visto per la creazione di un ciclo di vita intero del software \u00e8 stato:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creazione dell&#8217;applicazione<\/li>\n\n\n\n<li>Repository GitHub<\/li>\n\n\n\n<li>Dockerfile<\/li>\n\n\n\n<li>push sul repository del codice<\/li>\n\n\n\n<li>log in su Docker Hub<\/li>\n\n\n\n<li>creazione pipeline<\/li>\n\n\n\n<li>push pipeline<\/li>\n\n\n\n<li>creazione immagine e push su Docker Hub <\/li>\n\n\n\n<li>scaricare da Docker Hub<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Conclusion<\/h2>\n\n\n\n<p>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 <code>main<\/code>, l\u2019immagine Docker sar\u00e0 aggiornata automaticamente. \ud83c\udf89<\/p>\n\n\n\n<p>Anche questo tutorial \u00e8 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&#8217;abbraccio.<\/p>\n\n\n\n<p>Seguici sui social!<\/p>\n\n\n\n<ul class=\"wp-block-social-links has-huge-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-a89b3969 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-pinterest  wp-block-social-link\"><a href=\"https:\/\/pin.it\/2Bk2aTtDW\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewbox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12.289,2C6.617,2,3.606,5.648,3.606,9.622c0,1.846,1.025,4.146,2.666,4.878c0.25,0.111,0.381,0.063,0.439-0.169 c0.044-0.175,0.267-1.029,0.365-1.428c0.032-0.128,0.017-0.237-0.091-0.362C6.445,11.911,6.01,10.75,6.01,9.668 c0-2.777,2.194-5.464,5.933-5.464c3.23,0,5.49,2.108,5.49,5.122c0,3.407-1.794,5.768-4.13,5.768c-1.291,0-2.257-1.021-1.948-2.277 c0.372-1.495,1.089-3.112,1.089-4.191c0-0.967-0.542-1.775-1.663-1.775c-1.319,0-2.379,1.309-2.379,3.059 c0,1.115,0.394,1.869,0.394,1.869s-1.302,5.279-1.54,6.261c-0.405,1.666,0.053,4.368,0.094,4.604 c0.021,0.126,0.167,0.169,0.25,0.063c0.129-0.165,1.699-2.419,2.142-4.051c0.158-0.59,0.817-2.995,0.817-2.995 c0.43,0.784,1.681,1.446,3.013,1.446c3.963,0,6.822-3.494,6.822-7.833C20.394,5.112,16.849,2,12.289,2\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Pinterest<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-instagram  wp-block-social-link\"><a href=\"https:\/\/www.instagram.com\/tooldech\/\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewbox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Instagram<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/Matteo29-mar\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewbox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-etsy  wp-block-social-link\"><a href=\"https:\/\/www.etsy.com\/shop\/tooldech\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewbox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M9.16033,4.038c0-.27174.02717-.43478.48913-.43478h6.22283c1.087,0,1.68478.92391,2.11957,2.663l.35326,1.38587h1.05978C19.59511,3.712,19.75815,2,19.75815,2s-2.663.29891-4.23913.29891h-7.962L3.29076,2.163v1.1413L4.731,3.57609c1.00543.19022,1.25.40761,1.33152,1.33152,0,0,.08152,2.71739.08152,7.20109s-.08152,7.17391-.08152,7.17391c0,.81522-.32609,1.11413-1.33152,1.30435l-1.44022.27174V22l4.2663-.13587h7.11957c1.60326,0,5.32609.13587,5.32609.13587.08152-.97826.625-5.40761.70652-5.89674H19.7038L18.644,18.52174c-.84239,1.90217-2.06522,2.038-3.42391,2.038H11.1712c-1.3587,0-2.01087-.54348-2.01087-1.712V12.65217s3.0163,0,3.99457.08152c.76087.05435,1.22283.27174,1.46739,1.33152l.32609,1.413h1.16848l-.08152-3.55978.163-3.587H15.02989l-.38043,1.57609c-.24457,1.03261-.40761,1.22283-1.46739,1.33152-1.38587.13587-4.02174.1087-4.02174.1087Z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Etsy<\/span><\/a><\/li><\/ul>","protected":false},"excerpt":{"rendered":"<p>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&#8217;obiettivo di questo tutorial \u00e8 quello di vedere tutto il ciclo di vita di un software e di come ad ogni push viene ricreata un&#8217;immagine che verr\u00e0 deployata [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":943,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-504","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Come Creare una Pipeline CI\/CD con GitHub Actions - tooldech<\/title>\n<meta name=\"description\" content=\"Scopri come creare una pipeline CI\/CD per automatizzare il deploy di una web app Python su Docker Hub usando GitHub Actions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tooldech.com\/en\/pipeline-con-github-actions-devops-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come Creare una Pipeline CI\/CD con GitHub Actions - tooldech\" \/>\n<meta property=\"og:description\" content=\"Scopri come creare una pipeline CI\/CD per automatizzare il deploy di una web app Python su Docker Hub usando GitHub Actions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tooldech.com\/en\/pipeline-con-github-actions-devops-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"tooldech\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-25T02:51:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-10T07:06:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"788\" \/>\n\t<meta property=\"og:image:height\" content=\"791\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"tooldech\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tooldech\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/\"},\"author\":{\"name\":\"tooldech\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/#\\\/schema\\\/person\\\/4a554644f96951080896bbb327febe3b\"},\"headline\":\"Come Creare una Pipeline CI\\\/CD con GitHub Actions\",\"datePublished\":\"2024-12-25T02:51:45+00:00\",\"dateModified\":\"2025-07-10T07:06:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/\"},\"wordCount\":1192,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/#\\\/schema\\\/person\\\/4a554644f96951080896bbb327febe3b\"},\"image\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/cop.jpg\",\"articleSection\":[\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/\",\"url\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/\",\"name\":\"Come Creare una Pipeline CI\\\/CD con GitHub Actions - tooldech\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/cop.jpg\",\"datePublished\":\"2024-12-25T02:51:45+00:00\",\"dateModified\":\"2025-07-10T07:06:30+00:00\",\"description\":\"Scopri come creare una pipeline CI\\\/CD per automatizzare il deploy di una web app Python su Docker Hub usando GitHub Actions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#primaryimage\",\"url\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/cop.jpg\",\"contentUrl\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/cop.jpg\",\"width\":788,\"height\":791},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/pipeline-con-github-actions-devops-tutorial\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/tooldech.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Come Creare una Pipeline CI\\\/CD con GitHub Actions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/#website\",\"url\":\"https:\\\/\\\/tooldech.com\\\/\",\"name\":\"tooldech\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/#\\\/schema\\\/person\\\/4a554644f96951080896bbb327febe3b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tooldech.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/tooldech.com\\\/#\\\/schema\\\/person\\\/4a554644f96951080896bbb327febe3b\",\"name\":\"tooldech\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/logo.png\",\"url\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/logo.png\",\"width\":1024,\"height\":1024,\"caption\":\"tooldech\"},\"logo\":{\"@id\":\"https:\\\/\\\/tooldech.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/logo.png\"},\"sameAs\":[\"https:\\\/\\\/tooldech.com\"],\"url\":\"https:\\\/\\\/tooldech.com\\\/en\\\/author\\\/tooldech\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Come Creare una Pipeline CI\/CD con GitHub Actions - tooldech","description":"Scopri come creare una pipeline CI\/CD per automatizzare il deploy di una web app Python su Docker Hub usando GitHub Actions.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tooldech.com\/en\/pipeline-con-github-actions-devops-tutorial\/","og_locale":"en_US","og_type":"article","og_title":"Come Creare una Pipeline CI\/CD con GitHub Actions - tooldech","og_description":"Scopri come creare una pipeline CI\/CD per automatizzare il deploy di una web app Python su Docker Hub usando GitHub Actions.","og_url":"https:\/\/tooldech.com\/en\/pipeline-con-github-actions-devops-tutorial\/","og_site_name":"tooldech","article_published_time":"2024-12-25T02:51:45+00:00","article_modified_time":"2025-07-10T07:06:30+00:00","og_image":[{"width":788,"height":791,"url":"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg","type":"image\/jpeg"}],"author":"tooldech","twitter_card":"summary_large_image","twitter_misc":{"Written by":"tooldech","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#article","isPartOf":{"@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/"},"author":{"name":"tooldech","@id":"https:\/\/tooldech.com\/#\/schema\/person\/4a554644f96951080896bbb327febe3b"},"headline":"Come Creare una Pipeline CI\/CD con GitHub Actions","datePublished":"2024-12-25T02:51:45+00:00","dateModified":"2025-07-10T07:06:30+00:00","mainEntityOfPage":{"@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/"},"wordCount":1192,"commentCount":1,"publisher":{"@id":"https:\/\/tooldech.com\/#\/schema\/person\/4a554644f96951080896bbb327febe3b"},"image":{"@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg","articleSection":["DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/","url":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/","name":"Come Creare una Pipeline CI\/CD con GitHub Actions - tooldech","isPartOf":{"@id":"https:\/\/tooldech.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#primaryimage"},"image":{"@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg","datePublished":"2024-12-25T02:51:45+00:00","dateModified":"2025-07-10T07:06:30+00:00","description":"Scopri come creare una pipeline CI\/CD per automatizzare il deploy di una web app Python su Docker Hub usando GitHub Actions.","breadcrumb":{"@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#primaryimage","url":"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg","contentUrl":"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg","width":788,"height":791},{"@type":"BreadcrumbList","@id":"https:\/\/tooldech.com\/pipeline-con-github-actions-devops-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/tooldech.com\/"},{"@type":"ListItem","position":2,"name":"Come Creare una Pipeline CI\/CD con GitHub Actions"}]},{"@type":"WebSite","@id":"https:\/\/tooldech.com\/#website","url":"https:\/\/tooldech.com\/","name":"tooldech","description":"","publisher":{"@id":"https:\/\/tooldech.com\/#\/schema\/person\/4a554644f96951080896bbb327febe3b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tooldech.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/tooldech.com\/#\/schema\/person\/4a554644f96951080896bbb327febe3b","name":"tooldech","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo.png","url":"https:\/\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo.png","contentUrl":"https:\/\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo.png","width":1024,"height":1024,"caption":"tooldech"},"logo":{"@id":"https:\/\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo.png"},"sameAs":["https:\/\/tooldech.com"],"url":"https:\/\/tooldech.com\/en\/author\/tooldech\/"}]}},"jetpack_featured_media_url":"https:\/\/tooldech.com\/wp-content\/uploads\/2024\/12\/cop.jpg","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1314,"url":"https:\/\/tooldech.com\/en\/project-web-app-from-local-docker-to-production-enviroment-on-cloud\/","url_meta":{"origin":504,"position":0},"title":"Project web app from local docker to production enviroment on cloud.","author":"tooldech","date":"March 12, 2026","format":false,"excerpt":"Buongiorno a tutti e benvenuti in nuovo articolo di tooldech! Oggi vedremo come realizzare una migrazione di un progetto di una web app in locale e portarlo in produzione sul cloud di AWS. In questo tutorial verranno spiegati i passaggi e i procedimenti necessari per spostare una web app locale\u2026","rel":"","context":"In &quot;Applicativi Vari&quot;","block_context":{"text":"Applicativi Vari","link":"https:\/\/tooldech.com\/en\/category\/applicativi-vari\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2026\/03\/webappCloud.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2026\/03\/webappCloud.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2026\/03\/webappCloud.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2026\/03\/webappCloud.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2026\/03\/webappCloud.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2026\/03\/webappCloud.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1009,"url":"https:\/\/tooldech.com\/en\/deployare-su-aws-ecs-con-load-balancer-guida-passo-passo\/","url_meta":{"origin":504,"position":1},"title":"Deploying on AWS ECS with Load Balancer: Step-by-Step Guide","author":"tooldech","date":"June 29, 2025","format":false,"excerpt":"Buongiorno a tutti e benvenuti in un nuovo articolo di tooldech oggi parleremo di AWS ECS! Sei pronto a portare la tua applicazione Python online in modo scalabile e sicuro? In questo articolo ti guider\u00f2 passo dopo passo nel deployment di una web app Python su AWS ECS (Elastic Container\u2026","rel":"","context":"In &quot;Cloud&quot;","block_context":{"text":"Cloud","link":"https:\/\/tooldech.com\/en\/category\/cloud\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/06\/logo-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":244,"url":"https:\/\/tooldech.com\/en\/nextcloud\/","url_meta":{"origin":504,"position":2},"title":"NextCloud","author":"tooldech","date":"July 31, 2024","format":false,"excerpt":"Benvenuti in un nuovo tutorial di tooldech! Oggi esploreremo un argomento collegato a un nostro precedente articolo su CasaOS: come creare un cloud personale privato con Nextcloud. Cos'\u00e8 Nextcloud? Nextcloud \u00e8 una piattaforma open source di file hosting e collaborazione che consente agli utenti di creare il proprio server cloud\u2026","rel":"","context":"In &quot;Applicativi Vari&quot;","block_context":{"text":"Applicativi Vari","link":"https:\/\/tooldech.com\/en\/category\/applicativi-vari\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2024\/07\/nextcloud.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1278,"url":"https:\/\/tooldech.com\/en\/docker-hub-first-pass\/","url_meta":{"origin":504,"position":3},"title":"Docker Hub first pass","author":"tooldech","date":"December 3, 2025","format":false,"excerpt":"Buongiorno a tutti oggi parleremo di uno strumento molto usato per chi usa Docker. Docker Hub \u00e8 uno degli strumenti pi\u00f9 usati dagli sviluppatori e dai DevOps di tutto il mondo. Se usi Docker, prima o poi ti servir\u00e0 un luogo dove condividere, salvare e scaricare immagini in modo semplice\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/tooldech.com\/en\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/12\/ChatGPT-Image-3-dic-2025-08_17_01.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/12\/ChatGPT-Image-3-dic-2025-08_17_01.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/12\/ChatGPT-Image-3-dic-2025-08_17_01.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/12\/ChatGPT-Image-3-dic-2025-08_17_01.webp?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1201,"url":"https:\/\/tooldech.com\/en\/prometheus-grafana-monitoring-in-ambiente-docker\/","url_meta":{"origin":504,"position":4},"title":"Prometheus + Grafana: Monitoring in a Docker Environment","author":"tooldech","date":"September 12, 2025","format":false,"excerpt":"Buongiorno a tutti e bentornati in nuovo articolo di tooldech oggi parleremo di due strumenti combinati insieme Prometheus + Grafana ! Vuoi monitorare host e container in pochi minuti usando strumenti open\u2011source standard? In questa guida configuriamo Prometheus (raccolta metriche) e Grafana (visualizzazione) con Docker Compose, includendo cAdvisor (metriche dei\u2026","rel":"","context":"In &quot;Applicativi Vari&quot;","block_context":{"text":"Applicativi Vari","link":"https:\/\/tooldech.com\/en\/category\/applicativi-vari\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/09\/title.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/09\/title.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/09\/title.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/09\/title.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/09\/title.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/09\/title.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":549,"url":"https:\/\/tooldech.com\/en\/creare-uninfrastruttura-aws-con-terraform-per-una-web-app\/","url_meta":{"origin":504,"position":5},"title":"Creating an AWS Infrastructure with Terraform for a Web App","author":"tooldech","date":"January 16, 2025","format":false,"excerpt":"Buongiorno a tutti cari lettori, iniziamo l'anno a bomba con nuovi articoli e una nuova categoria Cloud, questa categoria sar\u00e0 incentrata sul mondo del cloud computing, nell'articolo di oggi configureremo un'infrastruttura AWS utilizzando Terraform per ospitare una web app su un'istanza EC2. Questa guida include la configurazione della rete, il\u2026","rel":"","context":"In &quot;Cloud&quot;","block_context":{"text":"Cloud","link":"https:\/\/tooldech.com\/en\/category\/cloud\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/01\/copertina.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/01\/copertina.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/01\/copertina.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/tooldech.com\/wp-content\/uploads\/2025\/01\/copertina.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/posts\/504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/comments?post=504"}],"version-history":[{"count":2,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/posts\/504\/revisions"}],"predecessor-version":[{"id":1060,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/posts\/504\/revisions\/1060"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/media\/943"}],"wp:attachment":[{"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/media?parent=504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/categories?post=504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tooldech.com\/en\/wp-json\/wp\/v2\/tags?post=504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}