Github: deploy automatico sul push con accesso FTP

La sincronizzazione automatica dei file su un server FTP ogni volta che viene effettuato un push su un repository GitHub è un modo utile per mantenere il sito web o l'applicazione aggiornati. Questo processo può essere automatizzato utilizzando GitHub Actions, un servizio di integrazione continua e consegna continua (CI/CD) ospitato da GitHub.


Cosa sono le Github Actions ? 

Github Actions è una piattaforma di integrazione continua e consegna continua (CI/CD) basata su cloud, integrata direttamente in GitHub. Permette agli sviluppatori di automatizzare diverse attività del flusso di lavoro del software, come il testing o la creazione di pacchetti alla distribuzione o la pubblicazione.

I vantaggi  sono legati soprattutto all'automazione delle attività ripetitive, velocizzando il processo di sviluppo e riducendo gli errori manuali, utilizzando una vasta gamma di azioni predefinite e la possibilità di crearne di personalizzate per soddisfare esigenze specifiche, attraverso un'interfaccia utente intuitiva e semplice di configurazione basata su file YAML.

Come si creano ? 

Per creare un flusso di lavoro automatico che utilizzi le Github Actions, basta entrare nella repository su cui si vuole lavorare e accedere alla sezione "Actions", quindi "New workflow". A questo punto, abbiamo due possibilità: la prima è quella di scegliere uno dei flussi di lavoro già esistenti e preconfezionati e configurarlo per i nostri usi, la seconda è quella di saltare questo passaggio e lavorare su un file vuoto scegliendo l'opzione "set up a workflow yourself" ed editare a mano il file main.yml per automatizzare le attività desiderate. Completata la scrittura del file, sarà sufficiente committare le modifiche nella propria repository.

Il workflow così definito sarà eseguito automaticamente ogni volta che vengono verificati determinati eventi, come ad esempio un push al repository.

Un workflow per il deploy con FTP

Molto spesso gli hosting condivisi non mettono a disposizione funzionalità avanzate come la sincronizzazione con Github dello spazio web, ma è possibile ottenere lo stesso risultato utilizzando l'accesso FTP allo spazio e le Github Actions. 

Seguendo le istruzioni indicate prima, modifichiamo il file main.yml, inserendo queste righe (facendo attenzione all'indentazione delle righe, particolare importante per i file YAML) :


name: FTP Sync

on:
  push:
    branches:
    - 'master'

con cui attribuiamo un nome all'attività ed identifichiamo il trigger di attivazione. Nel caso specifico stiamo indicando che il workflow si attiverà solo in caso di "push" effettuato sul branch "master"

Definiamo ora l'elenco dei job da lanciare in caso di attivazione:


jobs:
  web-deploy:
    name: Deploy
    runs-on: ubuntu-latest

indicando un nome (che sarà visibile durante l'esecuzione del job) e la piattaforma su cui far girare il job (generalmente ubuntu-latest). L'id del job (web-deploy) può essere scelto a piacere.

Per ogni job, è possibile definire quali sono gli step da eseguire (sempre indicando un nome ed alcuni parametri).

Definiamo il primo step con cui diamo al workflow sostanzialmente accesso ai file della repository. E' uno step predefinito, in genere presente in tutti i workflow.


    steps:
    - name: Get latest code
      uses: actions/checkout@v4

Il secondo step, fa uso di una libreria presente sul marketplace delle Github Actions,  FTP Deploy


    - name: Sync files
      uses: SamKirkland/FTP-Deploy-Action@v4.3.5

che esegue la vera e propria sincronizzazione FTP. Questo step per funzionare, ha bisogno di alcuni parametri obbligatori:


        server: ${{ secrets.ftp_server }}
        username: ${{ secrets.ftp_user }}
        password: ${{ secrets.ftp_password }}

e, volendo, di alcuni facoltativi. 


        dry-run: true

dry-run: per attivare una sessione di test, che elenca i file, senza fare l'upload reale (in produzione va rimosso)


        exclude: |
          **/.git*
          **/.git*/**

exclude: per indicare i file che devono essere esclusi dalla sincronizzazione

Il codice completo è questo:


# .github/actions/master.yml
name: FTP Sync

on:
  push:
    branches:
    - 'master'

jobs:
  web-deploy:
    name: Deploy
    runs-on: ubuntu-latest
    steps:
    - name: Get latest code
      uses: actions/checkout@v4

    - name: Sync files
      uses: SamKirkland/FTP-Deploy-Action@v4.3.5
      with:
        server: ${{ secrets.ftp_server }}
        username: ${{ secrets.ftp_user }}
        password: ${{ secrets.ftp_password }}
        dry-run: true
        exclude: |
          **/.git*
          **/.git*/**

Le variabili secrets

Per evitare di rendere visibili delle informazioni riservate nel file YAML, al posto dei parametri FTP sono stati indicati dei riferimenti segreti:


        server: ${{ secrets.ftp_server }}
        username: ${{ secrets.ftp_user }}
        password: ${{ secrets.ftp_password }}

Per valorizzarli, è sufficiente accedere alla sezione "Settings" della repository, quindi "Secrets and variables", sezione "Actions" e assegnare con "New repository secret" i valori che devono rimanere protetti da occhi indiscreti.

Conclusioni

All'esecuzione del push sul branch indicato, si avvierà il workflow così definito, il cui esito e sviluppo è possibile controllare nella sezione "Actions" della repository


Un consiglio: la prima sincronizzazione potrebbe essere un po' lunga: se il vostro progetto ha molti files/cartelle. solo la prima volta, potete provare a realizzare sincronizzazioni consecutive più corte, escludendo di volta file o cartelle utilizzando il parametro exclude.
Per le sincronizzazioni successive, invece tutto si dovrebbe svolgere in tempi adeguati.

Commenti