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/