#+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 ↩︎