Déploiement Hugo

Je génère mon blog avec le logiciel Hugo directement sur mon ordi. Un site ouaib c'est au final qu'un ensemble de fichiers textes et des images en plus.

Ça fait maintenant deux ans que j'utilise Hugo. J'ai désormais dépassé la phase de découverte et je suis passé à une utilisation un peu plus avancée. J'ai un peu changé ma façon de l'utiliser.

Du coup à chaque fois que je rédige un nouvel article voilà ce qu'il y a à faire :

  1. Création de l'article : hugo new posts/super-article/index.md
  2. Édition du fichier : kak content/posts/super-article/index.md
  3. Ajout des éventuelles illustrations : cp /une/image.jpg ~/www/content/posts/super-article/
  4. Ajout des fichiers dans git : git add content/posts/super-article
  5. Commit dans git : git commit -m "[POST] publication : super-article"
  6. Pousser les modifs sur le dépot git : git push
  7. Générer les miniatures : thumbnailer.sh ~/www/content
  8. Générer le blogroll : openring/openring.sh
  9. Génération du site en lui-même : hugo
  10. Compression des fichiers textes en gzip : static-compress -c zopfli -e gz …
  11. Compression des fichiers textes en brotli : static-compress -c zopfli -e br …
  12. Transfert du site fr vers le serveur web : rsync -av ~/www/public/fr/ user@serveur:/destination/fr
  13. Transfert du site en vers le serveur web : rsync -av ~/www/public/en/ user@serveur:/destination/en

Bon c'est des ptits trucs simples mais en gros les étapes 6 à 13 sont toujours les mêmes avec aucune intervention nécessaire. Du coup j'ai automatisé tout ça.

Dans git, on peut lancer des scripts automatiquement lors de certaines actions, on appelle ça un hook. Du coup, dans le hook qui s'exécute lors d'un push j'ai mis toutes les actions de 7 à 13. Comme ça, lors du git push elles sont toutes lancées, je n'ai plus rien à faire.

Ça évite d'en oublier une, de se planter sur la syntaxe ou autre connerie du genre.

Pour faire ça, il suffit d'éditer le fichier .git/hooks/pre-push (qui se trouve à la racine de votre repo) et d'y mettre tout ce que vous souhaitez et c'est tout bon.

Les scripts en question

Tout d'abord le hook qui lance un peu tout.

.git/hooks/pre-push
/usr/local/bin/thumbnailer.sh /home/lord/www/content
/home/lord/www/openring/openring.sh
/usr/bin/hugo
static-compress -c zopfli -e gz -j 16 "/home/lord/www/public/**/*.svg" "/home/lord/www/public/**/*.html" "/home/lord/www/public/**/*.csv" "/home/lord/www/public/**/*.css" "/home/lord/www/public/**/*.txt" "/home/lord/www/public/**/*.xml"
static-compress -c brotli -e br -j 16 "/home/lord/www/public/**/*.svg" "/home/lord/www/public/**/*.html" "/home/lord/www/public/**/*.csv" "/home/lord/www/public/**/*.css" "/home/lord/www/public/**/*.txt" "/home/lord/www/public/**/*.xml"
rsync -av /home/lord/www/public/fr/ www@n2:/var/www/lord.re/.
rsync -av /home/lord/www/public/en/ www@n2:/var/www/lord.re/en/

Ensuite le script de génération des miniatures qui me sert aussi globalement et pas uniquement pour le blog.

/usr/local/bin/thumbnailer.sh
#!/bin/sh

check_replace(){
# Si le thumbnail généré est plus gros que l'original (ça arrive régulièrement surtout avec les png) on garde l'original et on le copie comme si c'était le thumbnail.
  size_orig=$(stat -c %s $1)
  size_thumb=$(stat -c %s $2)
  if [ "$size_orig" -lt "$size_thumb" ]; then
    rm "$2"
    cp "$1" "$2"
  fi
}

thumbnail(){
  echo -en "Processing image \e[0;34m$1\e[0m :"
  extension="$(echo $1 | awk -F\. '{print $NF}')"
  thumbname="$(dirname $1)/$(basename -s .$extension $1).thumb.$extension"

# Si une image est un thumbnail on la considère comme déjà bien traitée.
  if [[ $1 == *".thumb."* ]]; then
    echo -e " \e[0;31m est un thumb !\e[0m"
    return 0
  fi

# Si une image a déjà un thumbnail, on la considère comme déjà traitée et donc on y retouche pas.
  if [ -f "$(dirname $1)/$(basename -s .$extension $1).thumb.$extension" ]; then
    echo -e " \e[0;31ma déjà un thumb !\e[0m"
    return 0
  fi

  case "$extension" in
  jpg | jpeg | JPG | JPEG )
    /usr/bin/convert -resize 1224\> -quality 55 "$1" "$thumbname"
    jpegoptim -s "$1"
    check_replace "$1" "$thumbname"
  ;;
  png | PNG)
# Ce con de pngcrush a tendance à faire n'importe quoi si on lui dit de réécrire par-dessus les images, du coup on passe par un fichier temporaire qu'on renomme par la suite.
    pngcrush -warn "$1" "$1.tmp"
    mv -f "$1.tmp" "$1"
    /usr/bin/convert -resize 1224\> "$1" "$thumbname"
    pngcrush -warn "$thumbname" "$thumbname.tmp"
    mv -f "$thumbname.tmp" "$thumbname"
    check_replace "$1" "$thumbname"
  ;;
  esac
  echo -e "\e[0;32mOK\e[0;m"

}

export -f thumbnail
export -f check_replace
find $1 -name '*.jpg' -or -name '*.jpeg' -or -name '*.JPG' -or -name '*.JPEG' -or -name '*.png' -or -name '*.PNG' | parallel --jobs 16 thumbnail

Et enfin le script de génération du blogroll.

openring/openring.sh
#! /bin/bash
# Je ne vous partage pas la liste parceque bon il y en a trop et ça pète l'affichage…
feeds=( 'https:// … feed.xml' 'https:// … index.xml' )

rand_feeds=( $(shuf -e "${feeds[@]}") )

choose_feeds(){
for index in 0 1 2 3 4 5
do
  selected_feeds="-s ${rand_feeds[$index]} $selected_feeds"
done
}

choose_feeds
echo $selected_feeds

/home/lord/www/openring/openring -n 6 \
$selected_feeds \
< /home/lord/www/openring/in.html \
> /home/lord/www/layouts/partials/openring.html

Utilisation

Donc maintenant, je me farcis les 5 premières étapes manuellement. Quand je lance la sixième manuellement, les dernières se déroulent toutes seules.

Me reste plus qu'à ouvrir https://lord.re pour vérifier que ça a bien été poussé comme il faut et de constater les typos que j'ai ratées lors des relectures (toujours pareil).