Automate conversion of blog from org-mode to Html, Markdown and Gemini using Docker image alpine-org2blog
and GitLab CI
index | about | archive | charlas | docs | links
dot
|
git
|
img
|
plt
|
tty
|
uml
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 imagealpine-org2blog
and GitLab CI
Notas al pie de página:
gemini://gmi.osiux.com