Script de instalación de Hugo en linux

Cierto es que la instalación de Hugo no lleva más allá de unos pocos minutos, pero es gratificante no tener que gastar este tiempo cada vez que se actualiza a una nueva versión. Este script es la forma con la que consigo ahorrar este valioso tiempo en mis terminales con linux a partir de la fuente.
Arquitectura del equipo
El primer problema con el que nos encontramos es determinar el tipo de arquitectura que tiene el equipo sobre el que vamos a instalar Hugo. En mi caso tengo que diferenciar entre la Raspberry con arquitectura arm de 32bit (Raspbian) y los equipos de sobremesa y portátil, ambos con arquitectura x86 de 64bit (Linux Mint). Para determinar la longitud de bit con la que trabaja el equipo uso el comando getconf LONG_BIT
con este sencillo script:
bits=$(getconf LONG_BIT)
if [ $bits == '64' ]
then
bits='64bit'
else
bits='arm'
fi
En caso de tratar con mayor variedad de equipos seguramente fuera más adecuado usar el comando
uname -m
para determinar la arquitectura de los mismos.
Ruta de descarga
Conociendo la arquitectura del equipo, descargar el instalador adecuado desde la página en Github de Hugo no tiene ninguna complicación si lo realizamos manualmente. Para automatizar la tarea creo la variable “hugo_latest_path” que contendrá la ruta completa al ultimo instalador disponible gracias al acceso a la api de Github.
hugo_latest_path=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest \
| grep "browser_download_url" \
| grep "[Ll]inux" \
| grep "${bits}" \
| grep -v "hugo_extended" \
| grep -v "arm64" \
| grep "\.tar\.gz" \
| cut -d ":" -f 2,3 \
| tr -d \")
Este comando realiza los siguientes pasos:
- Descarga de la página con las ultimas versiones de Hugo
- Filtra por las líneas que contienen “Browser_download_url”
- Filtra por la líneas que contienen “Linux” o “linux”
- Filtra por el tiempo de architectura (64bit o arm)
- Desprecia las líneas con la versión extendida de Hugo
- Desprecia las líneas para “arm64”
- Se queda sólo con los instaladores “.tar.gz”
- Se queda con el contenido del campo y no el encabezado
- Elimina las comillas
El resultado del comando completo será una ruta de descarga para la última versión de Hugo “https://github.com/gohugoio/hugo/releases/download/v0.104.3/hugo_0.104.3_linux-arm.tar.gz"
Determinar la ultima versión disponible
A partir de la variable “hugo_latest_path” generaremos la variable “hugo_latest_ver”
hugo_download_path="https://github.com/gohugoio/hugo/releases/download/"
if [[ $hugo_latest_path =~ ^$hugo_download_path[v](.*)[/].*\.tar\.gz$ ]]; then
hugo_latest_ver=${BASH_REMATCH[1]}
echo "La última versión disponible es $hugo_latest_ver"
fi
Hacemos uso de la expresiones regulares en bash y el comando BASH_REMATCH
para extraer el nº de versión como el conjunto de números y puntos detrás de “https://github.com/gohugoio/hugo/releases/download/v" y antes de la siguiente “/” en el path de la ultima versión para descargar.
“https://github.com/gohugoio/hugo/releases/download/v0.104.3/hugo_0.104.3_linux-arm.tar.gz”
¿Está Hugo ya instalado?
En caso de que Hugo esté instalado en el sistema comprobaremos si la versión coincide con la ultima versión disponible en la web, si son iguales no hacemos nada, en caso contrario borraremos la instalación de Hugo y realizaremos una nueva instalación. En caso de que Hugo no esté instalado directamente realizaremos la instalación de la última versión disponible.
if which hugo >/dev/null; then
hugo_local_ver=$(hugo version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/')
echo "Versión instalada $hugo_local_ver, última versión $hugo_latest_ver"
if [ $hugo_local_ver == $hugo_web_ver ]
then
echo "hugo instalado y actualizado..."
else
echo 'actualizando a hugo '$hugo_latest_ver
if [[ -f ~/.local/bin/hugo ]]
then
rm ~/.local/bin/hugo
else
sudo dpkg -P hugo
fi
hugo_install
fi
else
echo 'Hugo no está instalado...'
hugo_install
fi
Para desinstalar Hugo borraremos el archivo “~/.local/bin/hugo” en caso de que este exista, en caso contrario eliminaremos el paquete mediante el comando dpkg
.
Instalación de Hugo
En la web viene claramente descrita la instalación de hugo para entornos linux a partir de una archivo “*.tar.gz”, simplemente he adaptado estos pasos a mi script creando la función de instalación.
hugo_install(){
cd ~
echo 'Comprobando el directorio ~/.local/bin...'
mkdir -p ~/.local/bin
echo 'Descargando la última versión de Hugo...'
wget -q $hugo_latest_path
# Busca el archivo *.tar.gz descargado
instalador="$(find . -maxdepth 1 -name "hugo_*.tar.gz")"
if [[ -n $instalador ]]
then
echo 'Descomprimiendo el instalador...'
# Extrae el archivo "Hugo" a "~/.local/bin"
tar -xzf $instalador -C ~/.local/bin hugo
# Borra el archivo descargado
rm $instalador
fi
# Comprueba si la ruta esta en el PATH
if [[ -n $(echo $PATH | grep "$HOME/.local/bin") ]]
then
echo "La ruta $HOME/.local/bin está en el PATH"
else
echo "La ruta no está en el Path, se añade"
PATH=$PATH:~/.local/bin
fi
}
Los pasos que realiza esta función son los siguientes:
- Crea el directorio “~/.local/bin/” en caso de que no exista
- Descarga la última versión disponible
- Descomprime el archivo “hugo” del instalador en “~/.local/bin”
- Borra el instalador
- Comprueba si la ruta esta en el PATH y si no lo está la añade
Y con esto ya está todo listo, puedes ver a continuación el script completo y encontrarlo otros que he escrito en mi repositorio de GitHub.
#!/bin/bash ################################################################### # Script Name: hugo.sh # Description: Instala y actualiza Hugo # Args: N/A # Creation/Update: 20191114/20240115 # Author: www.sherblog.pro # Email: sherlockes@gmail.com ################################################################### # Arquitectura del procesador arch=$(uname -m) if [ $arch == 'aarch64' ]; then bits='arm64' elif [ $arch == 'x86_64' ]; then bits='amd64' else bits='arm-v7' fi echo "${bits}" hugo_check(){ hugo_download_path="https://github.com/gohugoio/hugo/releases/download/" hugo_latest_path=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest \ | grep "browser_download_url" \ | grep "[Ll]inux" \ | grep "${bits}" \ | grep -v "hugo_extended" \ | grep -v "arm64" \ | grep "\.tar\.gz" \ | cut -d ":" -f 2,3 \ | tr -d \") echo $hugo_latest_path # Extrae el número de la última version disponible nombre_carpeta=$(basename $(dirname $hugo_latest_path)) hugo_latest_ver="${nombre_carpeta:1}" echo "La última versión disponible es $hugo_latest_ver" if which hugo >/dev/null; then # Extrae el número de la versión de Hugo isntalada hugo_local_ver=$(hugo version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/') echo "Versión instalada $hugo_local_ver, última versión $hugo_latest_ver" if [ $hugo_local_ver == $hugo_latest_ver ] then echo "hugo instalado y actualizado..." else echo 'actualizando a hugo '$hugo_latest_ver if [[ -f ~/.local/bin/hugo ]] then rm ~/.local/bin/hugo else sudo dpkg -P hugo fi hugo_install fi else echo 'Hugo no está instalado...' hugo_install fi } hugo_install(){ cd ~ echo 'Comprobando el directorio ~/.local/bin...' mkdir -p ~/.local/bin echo 'Descargando la última versión de Hugo...' wget -q $hugo_latest_path # Busca el archivo *.tar.gz descargado instalador="$(find . -maxdepth 1 -name "hugo_*.tar.gz")" if [[ -n $instalador ]] then echo 'Descomprimiendo el instalador...' # Extrae el archivo "Hugo" a "~/.local/bin" tar -xzf $instalador -C ~/.local/bin hugo # Borra el archivo descargado rm $instalador fi # Comprueba si la ruta esta en el PATH if [[ -n $(echo $PATH | grep "$HOME/.local/bin") ]] then echo "La ruta $HOME/.local/bin está en el PATH" else echo "La ruta no está en el Path, se añade" PATH=$PATH:~/.local/bin fi } hugo_check