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

index | OSiUX | archive | charlas | docs | links

dot | git | img | plt | tty | uml

os1ux-alpine-org2blog.png

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:

  • mejorar la conversión a Markdown y Gemini
  • automatizar el deploy de todos los mirrors

Te recomiendo leer

ChangeLog

  • 2023-02-24 09:24 agregar Automate conversion of blog from org-mode to Html, Markdown and Gemini using Docker image alpine-org2blog and GitLab CI

Notas al pie de página: