Aggiornare automaticamente siti creati con Hugo
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