Blog Con Hugo, Gitea, Y Drone Ci
================================
18 de Diciembre, 2020
Este blog comenzó en Gitlab Pages, que usa el mismo sistema que
Github para sus páginas. Un generador de páginas estáticas que es
gestionado por un sistema de CI/CD.
En el tildeverse podemos hacer lo mismo usado su instancia de git
que es Gitea, y Drone CI para la publicación.
Gitea y Drone CI proveen una alternativa liviana (mas liviana que
Gitlab, al menos) para quienes quieren tener una interfaz web para
git con un sistema de CI/CD que funciona tan bien como lo que sea
que usen en Github/lab.
La manera "recomendada" según la documentación[1] (en ingles, hasta
donde vi) de Drone CI es usar plugins que consisten en imágenes de
docker que... Debo confesar no se como funcionan. La verdad es que
no tengo mucha idea de docker y contenedores pero es algo que creo
voy a tener que aprender eventualmente, tanto para mis propios
proyectos como para cuestiones laborales en un futuro tal vez.
Grande fue mi dicha al ver que Drone provee plugins para Hugo[2] y
rsync[3], así que armado de una taza de té me puse a leer las
instrucciones y experimentar un poco.
Grande fue mi frustración al darme cuenta, después de muchas
pruebas y errores, que por alguna razón que desconozco ninguno de
estos 2 plugins funciona. O al menos yo fui incapaz de hacerlos
funcionar.
Llegado a este punto, pateé el tablero y decidí comenzar de nuevo y
esta vez hacerlo de manera completamente "manual" creando un
pipeline de ssh[4] sin plugins ni nada.
Yéndome por el caño
-------------------
Una vez que hayamos creado nuestro blog en Hugo y esté bonito y
funcionando a la perfección localmente, vamos a la carpeta raíz de
nuestro blog y la convertimos en un repo de git. Acto seguido
creamos un archivo `.gitignore` en el cual pondremos las siguientes
dos lineas:
```
public/
resources/
```
`git push` mediante subimos el repo a nuestra cuenta de tildegit
(lo bueno de Gitea es que no hace falta crear el repositorio
remotamente primero, podemos editar `.git/config` y ponerle el
nombre que queramos y listo), y luego vamos al apartado de Drone CI
para activar el repo.
En nuestra maquina local creamos un `system user` y le damos un
`homedir`. Luego cambiamos a este usuario (usando `su`) y generamos
un keypair ssh. Armados con estas llaves, pondremos la privada como
Secret en la configuración de Drone para el repo, y copiaremos la
publica a `~/.ssh/authorized_keys` en nuestro usuario de tilde.
Siguiendo conectados a nuestra cuenta de tilde, este es un buen
momento para clonar el repo en nuestro directorio principal, y
también crear un directorio llamado `temp`, lo necesitaremos mas
adelante.
Volviendo a la pagina de configuración de Drone, agregamos otros 2
secretos. Uno es el nombre de usuario (que debe ser el de nuestro
usuario de tilde), y el otro será el host (el tilde al que
pertenecemos).
Ya estamos listos para crear el archivo `.drone.yml` en la carpeta
raíz de nuestro blog, que debería verse mas o menos de la siguiente
manera. Para los efectos de este ejemplo supongamos que nuestro
nombre de usario en tilde es r00t:
```
---
kind: pipeline
type: ssh
name: deploy
server:
host:
from_secret: host
user:
from_secret: username
ssh_key:
from_secret: ssh_key
trigger:
branch:
- blog
steps:
- name: deploy
commands:
- cd /home/r00t/miBlog
- git pull origin blog
- hugo --cacheDir ~/temp/
- rm -r resources
- cp -Rf public/* /home/r00t/public_html
- rm -r public
```
Esto instruye a Drone para que se conecte por ssh a nuestra cuenta
de tilde, actualize el repo, genere el blog, y lo copie al
directorio relevante.
El comando `trigger` nos asegura que Drone solo se ejecutara cuando
se produzcan cambios en el branch indicado. De esta manera podemos
tener uno o mas branches con cosas de prueba, si así lo
quisiéramos.
Aquí también aparece el directorio `temp` que creamos antes. Hugo
generalmente usa `/tmp` como `cacheDir` pero en un tilde no tenemos
acceso a esa ruta.
Solo falta subir `.drone.yml` a nuestro repo, y si todo sale bien,
la próxima que subamos un articulo, tendremos todo publicado
automáticamente.
[1]
https://readme.drone.io/
[2]
http://plugins.drone.io/cbrgm/drone-hugo/
[3]
http://plugins.drone.io/drillster/drone-rsync/
[4]
https://readme.drone.io/pipeline/ssh/overview/