#+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:
- mejorar la conversión a Markdown y Gemini
- automatizar el deploy de todos los mirrors
# Te recomiendo leer
- howto launch gitlab ci from other gitlab ci repo using trigger
lists.sh
es para amantes de las listasgemini://
es para amantes del texto planotodo.txt
es una lista de tareas- bookmarks vs links.txt
# 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
-
gemini://gmi.osiux.com ↩︎
-
https://gitlab.com/osiux/docker-alpine-org2blog/-/raw/develop/Dockerfile ↩︎