
GitHub Action automatizar flujos de trabajo
Automatización de Gráficas en un Blog con GitHub Actions
En este post, te explico cómo implementé un sistema automatizado para mi blog que actualiza diariamente una gráfica que muestra el número de posts y proyectos publicados mensualmente. Esta gráfica se genera y se actualiza automáticamente a través de GitHub Actions, aprovechando la infraestructura gratuita de GitHub para tareas automatizadas. La gráfica se enlaza en mi sitio web mediante una etiqueta <img>
, y se basa en datos extraídos y actualizados también de manera automática y que se almacenan en un archivo JSON.
¿Qué estamos logrando?
Este sistema utiliza dos GitHub Actions programadas para ejecutarse todos los días a una hora determinada:
- Primer GitHub Action: Ejecuta un archivo MJS que actualiza un archivo JSON con el conteo de posts y proyectos subidos mensualmente y que se almacena en el reopositorio de mi blog.
- Segundo GitHub Action: Ejecuta un archivo de Python que genera una gráfica de barras basada en los datos del archivo JSON y la guarda como archivo de imágen PNG en un repositorio creado para este propósito.
Primer GitHub Action: Actualizar el Archivo JSON
El objetivo de este primer GitHub Action es procesar los archivos Markdown de mis posts y proyectos, extrayendo la fecha de publicación para almacenar el número de publicaciones por mes en un archivo JSON.
Este archivo JSON es clave para generar la gráfica, y se actualiza todos los días con los cambios detectados. A continuación, te muestro el archivo de configuración de esta acción:
name: Actualizar conteo de publicaciones por mes
# Definir cuándo se ejecutará la acción (cron expression para todos los días a las 11:00 UTC)
on:
schedule:
- cron: '0 11 * * *' # Todos los días a las 11:00 UTC
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'Manually Trigger'
type: choice
options:
- Manually Trigger
- Add new post
- Debug
# Definir los jobs
jobs:
run-python-script:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
# Paso 1: Obtener el código del repositorio
- name: Checkout repository
uses: actions/checkout@v4
# Paso 2: Configurar Node.js
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 'lts/*' # Usar la última versión estable (LTS)
# Paso 3: Instalar dependencias
- name: Install dependencies
run: |
npm install
# Paso 4: Ejecutar el script de conteo
- name: Run countPostsByMonth script
run: |
node ./utils/countPostsByMonth.mjs
# Paso 5: Commit y push si el archivo fue modificado
- name: Commit and Push
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git config --global user.name 'GitHub Actions'
git config --global user.email 'actions@github.com'
git add public/data/postsByMonth.json
if git diff --cached --quiet; then
echo "No changes to commit";
else
git commit -m "Updated postsByMonth.json"
git push
fi
Explicación de los pasos
- Programación diaria: La acción se ejecuta todos los días a las 11:00 UTC.
- Checkout del repositorio: Descarga el código de mi blog y proyectos.
- Configuración de Node.js: Usa la última versión LTS de Node.js.
- Instalación de dependencias: Instala los módulos de Node.js necesarios para procesar los archivos.
- Ejecución del script: El script
countPostsByMonth.mjs
analiza las publicaciones y proyectos, y actualiza el archivopostsByMonth.json
. - Commit y push: Si el archivo JSON fue modificado, se hace un commit con los cambios y se sube al repositorio.
Este archivo JSON se encuentra en el repositorio de mi sitio web y es utilizado posteriormente para generar una gráfica.
Segundo GitHub Action: Generación de la Gráfica
Una vez que los datos están actualizados en el archivo JSON, el segundo GitHub Action se encarga de generar una gráfica diaria basada en esos datos utilizando Streamlit y Matplotlib. La gráfica se guarda como un archivo PNG, que luego se sube al repositorio y se enlaza en mi web a través de una etiqueta <img>
.
Aquí está el archivo de configuración del segundo GitHub Action:
name: Ejecutar código Python diariamente
# Definir cuándo se ejecutará la acción (cron expression para todos los días a las 12:00 UTC)
on:
schedule:
- cron: '0 12 * * *' # Todos los días a las 12:00 UTC
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'Manually Trigger'
type: choice
options:
- Manually Trigger
- Add new post
- Debug
# Definir los jobs
jobs:
run-python-script:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
# Paso 1: Checkout (obtener el código del repositorio)
- name: Checkout repository
uses: actions/checkout@v4
# Paso 2: Configurar Python (versión 3.11)
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: 3.11
# Paso 3: Instalar las dependencias
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests matplotlib streamlit
# Paso 4: Ejecutar el script de Python
- name: Run Python script
run: |
python ./app.py
# Paso 5: Commit y push si la gráfica fue modificada
- name: Commit and Push
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git config --global user.name 'JTL - GitHub Actions'
git config --global user.email 'jaterli@hotmail.com'
git add grap.png
if git diff --cached --quiet; then
echo "No changes to commit";
else
git commit -m "Updated graph"
git push
fi
if: success()
Explicación de los pasos
- Programación diaria: La acción se ejecuta todos los días a las 12:00 UTC.
- Checkout del repositorio: Descarga el código y los datos del repositorio.
- Configuración de Python: Usa Python 3.11 para ejecutar el script.
- Instalación de dependencias: Instala las librerías necesarias como
Streamlit
,Matplotlib
yRequests
. - Ejecución del script de Python: El script
app.py
lee el archivo JSON actualizado y genera una gráfica que se guarda comograp.png
. - Commit y push: Si la gráfica fue modificada, se sube automáticamente al repositorio.
¿Cómo se Incrusta la Gráfica en el Blog?
El archivo grap.png
generado por este proceso se encuentra en el repositorio de GitHub y se enlaza directamente en el HTML de mi web utilizando una etiqueta <img>
:
<img src="https://github.com/usuario/repositorio/path/to/grap.png" alt="Gráfica de publicaciones por mes">
Esto asegura que cada vez que la imagen se actualice, mi blog siempre mostrará la versión más reciente sin necesidad de intervención manual.
Conclusión
Esta configuración me permite automatizar completamente la creación y actualización de una gráfica que muestra el número de posts y proyectos subidos a mi blog mensualmente. Usar GitHub Actions para este propósito me ahorra tiempo y esfuerzo, asegurando que siempre tenga la información más actualizada disponible en mi sitio web.
Esta solución es flexible y escalable, y puede adaptarse a otras tareas repetitivas donde se necesite procesar datos y generar visualizaciones automáticamente.