Automate conversion of blog from /org-mode/ to /Html/, /Markdown/ and /Gemini/ using /Docker image/ =alpine-org2blog= and /GitLab CI/

· osiux's blog


#+LINK_HOME:   index.html
#+INCLUDE:     header.org

deuda técnica #

Hace unos días automaticé la generación de links.org utilizando un repositorio por separado e interconectando la CI (Integración Continua) del repo osiux-links 1 con el repo osiux.gitlab.io 2 y de esta manera el links.txt se convierte a los formatos .org y .html

Tenía pendiente convertir links.txt a Gemini 3 y Markdown 4 para gmi.osiux.com 5 y para osiux.lists.sh 6.

Si bien partiendo desde org-mode 7 ya tenía scripts que generaban los diferentes formatos para cada versión del blog, no estaba del todo automatizado el proceso de conversión y dependía de varios pasos manuales y era una deuda técnica resolverlo.

a refactorizar... #

Inicialmente comencé /"refactorizando" / el Makefile y el .gitlab-ci.yml para contar con mayor claridad y simplificar la generación de todo el blog, eliminando todo archivo versionado que ahora es generado de manera dinámica y corrigiendo varias utilidades del repo org-bash-utils 8.

la imagen esta desactualizada! #

Ni bien pude avanzar, el obstáculo con el que me topé, fue en la imagen alpine-emacs 9 de docker 10 que estaba usando, no lograba instalar pandoc 11, que es vital para la conversión a Markdown y a Gemini.

Luego de probar varias alternativas fallidas de instalación manual, vi que esta imagen partía de alpine v3.14 y el paquete de pandoc estaba disponible en alpine v3.17.

alpine-org2blog #

Entonces lo mas simple sería construir mi propia imagen docker alpine-org2blog 12 agregando los paquetes faltantes.

La verdad, es que al final sacando cuentas, tardé menos en crear mi propio Dockerfile 13, generar y publicar la nueva imagen que intentando instalar pandoc en la imagen anterior, y fueron pasos muy simples:

# docker build -t alpine-org2blog .

[+] Building 23.5s (11/11) FINISHED
 => [internal] load build definition from Dockerfile
 => => transferring dockerfile: 337B
 => [internal] load .dockerignore
 => => transferring context: 2B
 => [internal] load metadata for docker.io/library/alpine:3.17
 => [auth] library/alpine:pull token for registry-1.docker.io
 => CACHED [1/5] FROM docker.io/library/alpine:3.17@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a
 => [internal] load build context
 => => transferring context: 62B
 => [2/5] RUN apk update && apk add ca-certificates emacs bash gawk imagemagick curl make pandoc py3-pip && pip3 install md2gemini
 => [3/5] WORKDIR /root
 => [4/5] COPY init.el /root/.emacs.d/
 => [5/5] COPY entrypoint.sh /
 => exporting to image
 => => exporting layers
 => => writing image sha256:4e1af5c51323658be3210377b10fc470cdaaefa5b2af2371eeb651c1b633d549
 => => naming to docker.io/library/alpine-org2blog

# docker image tag alpine-org2blog os1ux/alpine-org2blog:latest

# docker image push os1ux/alpine-org2blog:latest
The push refers to repository [docker.io/os1ux/alpine-org2blog]
bb529fc1eb88: Layer already exists
e51f39d1beac: Pushed
5f70bf18a086: Layer already exists
0ae7bccd25cc: Pushed
7cd52847ad77: Layer already exists
latest: digest: sha256:748b6c86f01b01d42fb5156154400b62efd706f4063e4d6179ec0546ff6ff843 size: 1361

deploy-tgz2dir #

Ahora que Gitlab CI 14 se ocupa de generar mi blog en todos los formatos necesarios, cada vez que hay un cambio, solo necesitaba actualizar el deploy en cada host y para esto creé el script deploy-tgz2dir que se ocupa de descargar el blog comprimido en .tar.gz solo si es diferente del descargado la última vez comparando el md5 y registrando lo realizado en el log deploy-tgz2dir.log cada vez que el crontab se ocupa de ejecutarlo:


# cat deploy-tgz2dir.log

2023-02-22 16:00:01 blasberry.osiux.com file=osiux.tar.gz size=372 remote=51499fe8a65b5956794b5bb32462949f local=31415926535897932384626433832795 deploy=1 seconds=137
2023-02-22 16:10:02 blasberry.osiux.com file=osiux.tar.gz size=372 remote=51499fe8a65b5956794b5bb32462949f local=51499fe8a65b5956794b5bb32462949f deploy=0 seconds=17
2023-02-22 16:20:01 blasberry.osiux.com file=osiux.tar.gz size=372 remote=51499fe8a65b5956794b5bb32462949f local=51499fe8a65b5956794b5bb32462949f deploy=0 seconds=5

automate all the things #

Ahora puedo publicar directamente desde el teléfono espía, basta con ejecutar git push y GitLab hace su magia! Y cada sitio se actualiza en el formato que le corresponde! :)

El resumen de scripts usados para cada formato es el siguiente:

file format script requirements
links.org Org-mode links2org curl, url2title
*.html HTML =publish.sh emacs
*.md Markdown org2md pandoc
*.gmi Gemini =org2gmi pandoc, md2gemini

próximos pasos #

Si bien, el circuito esta automatizado, hay algunas tareas a realizar:

Te recomiendo leer #

ChangeLog #