My boring Blog

Home page di Mauro Frigerio

Aggiornare automaticamente siti creati con Hugo

01-10-2021 Tempo di lettura 3 minuti Article

I CMS come WordPress o Joomla sono comodi, ma necessitano degli aggiornamenti costanti, visto che regolarmente ci sono aggiornamenti di sicurezza abbastanza urgenti. Anche per questo che un da un anno sono ritornato indietro a un sito statico, per la precisione utilizzando Hugo. Così mi preoccupo di creare il contenuto e quando carico le nuove pagine non devo più pensare q quello c’è sul server.

Lo svantaggio di questo sistema è la necessità di avere un computer per generare nuovamente il sito e poi caricare tutto sul server. GIT e Github sono fantastici perché una volta configurati correttamente semplificano tanto la gestione dei nuovi contenuti.

In Github é possibile creare delle automazioni o Actions ogni qualvolta una nuova versione del codice viene caricata. Appena ho iniziato con Hugo ho configurato un automazione che aggiornasse il sito appena un nuovo post é caricato su una branch di Github. L’automatismo crea una macchina virtuale e al suo interno genera completamente il nuovo sito. Poi tutti i file vengono caricati tramite SFTP sul server. La procedura totale richiede parecchio tempo, la generazione richiede pochi secondi, mentre il caricamento di tutti i file (anche quelli invariati) necessita quasi 15 minuti. Decisamente troppo. Il tutto funziona e visto che il tempo a mia disposizione non é molto non ho potuto cercare una soluzione alternativa. Ma mi ha sempre dato molto fastidio.

Finalmente ho trovato una soluzione funzionante e molto piú veloce. Sono certo che in giro ci sia una soluzione migliore, ma sono contento della performance ottenuta.

Il fulcro della nuova soluzione prevede una copia su Github dell’ultima versione generata del sito. Visto che ne ho una di test e quella di produzione, ho creato due cartelle distinte. Hugo deve solo modificare i file modificati e tutti gli altri non sono toccati. Poi grazie a rsync vengono caricati solo i rispettivi file aggiornati. Dopo il caricamento öa nuova versione del sito é salvata nel repository, pronta per un nuovo post. Nelle opzioni di Hugo e rsync non si deve dimenticare l’opzione di eliminare i file non più necessari (opzione --cleanDestinationDir per Hugo e --delete per rsync).

Cosi sono riuscito a passare da 14-15 minuti a meno di 2, molto più accettabile per la mia pazienza.

Questo é il codice della mia Github Action per il sito di test, i campi secret sono configurati nelle impostazioni del repository:

name: INT-BUILD-SITE

on:
  push:
    branches:
      - integration

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:

      - uses: actions/checkout@v2
        with:
          submodules: true  # Fetch Hugo themes
          fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod

      - name: Setup Hugo
        run: |
          sudo snap install hugo
          hugo --config config-integration.toml --minify --cleanDestinationDir --destination "public-integration/"          

      #- name: Setup tmate session
      #  uses: mxschmitt/action-tmate@v2
      - name: rsync deployments
        uses: burnett01/rsync-deployments@5.1
        with:
          switches: -avzr --delete
          path: public-integration/
          remote_path: integration-site/
          remote_host: ${{ secrets.SSH_SERVER }}
          remote_user: ${{ secrets.SSH_USER }}
          remote_key: ${{ secrets.SSH_PRIV_KEY }}

      - name: Archive production artifacts
        uses: actions/upload-artifact@v2
        with:
          name: dist-without-markdown
          path: |
            public-integration