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/