CI/CD
El CI/CD de GitHub se basa en la definición de workflows mediante archivos YAML ubicados en la carpeta .github/workflows
del repositorio. Estos workflows permiten automatizar tareas como la construcción, prueba y despliegue de aplicaciones cada vez que se produce un evento relevante en el repositorio (por ejemplo, un push, pull request o publicación de una release).
Estructura básica de un workflow
Un workflow de GitHub Actions está compuesto por uno o varios jobs, que a su vez contienen pasos (steps) que definen las acciones a ejecutar. Los elementos principales son:
- name: Define el nombre del workflow o del job, facilitando su identificación en la interfaz de GitHub.
- on: Especifica los eventos que activarán la ejecución del workflow, como
push
,pull_request
,schedule
, entre otros. - jobs: Agrupa los diferentes jobs que se ejecutarán dentro del workflow. Cada job puede ejecutarse en paralelo o depender de la finalización de otros jobs.
- runs-on: Indica el sistema operativo o runner donde se ejecutará el job (por ejemplo,
ubuntu-latest
,windows-latest
,macos-latest
). - steps: Lista los pasos a ejecutar dentro de un job. Cada step puede ejecutar comandos de shell o utilizar acciones predefinidas de la comunidad o propias.
- uses: Permite reutilizar acciones de terceros o propias, facilitando la integración de herramientas y la automatización de tareas comunes.
- env: Define variables de entorno que estarán disponibles durante la ejecución del job o de pasos específicos.
- needs: Permite establecer dependencias entre jobs, asegurando que un job no se ejecute hasta que otro haya finalizado correctamente.
- with: Proporciona parámetros de configuración para las acciones utilizadas en los steps.
Ejemplo básico de workflow en GitHub Actions
nname: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
container:
image: node:14
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Instalar dependencias
run: npm install
- name: Construir aplicación
run: npm run build
- name: Guardar artifacts de build
uses: actions/upload-artifact@v4
with:
name: build
path: build/
test:
name: Test
runs-on: ubuntu-latest
container:
image: node:14
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Descargar artifacts de build
uses: actions/download-artifact@v4
with:
name: build
path: build/
- name: Ejecutar pruebas
run: npm test
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Descargar artifacts de build
uses: actions/download-artifact@v4
with:
name: build
path: build/
- name: Ejecutar despliegue
run: ./deploy.sh
En este ejemplo:
- El workflow se activa en cada push o pull request a la rama
main
. - El pipeline está compuesto por tres jobs:
build
,test
ydeploy
. - Cada job puede especificar el entorno de ejecución, en este caso usando la imagen de Docker
node:14
para las etapas de build y test, asegurando un entorno consistente para la compilación y pruebas. - En el job build, se clona el repositorio, se instalan las dependencias y se construye la aplicación. Los archivos generados en la carpeta
build/
se guardan como artifacts mediante la acciónactions/upload-artifact
, permitiendo que estén disponibles para jobs posteriores. - El job test depende del job
build
(usandoneeds: build
), descarga los artifacts generados y ejecuta los tests de la aplicación. - El job deploy depende del job
test
(usandoneeds: test
), descarga los artifacts de build y ejecuta el script de despliegue (./deploy.sh
). - La estructura declarativa del workflow facilita la organización, reutilización y mantenimiento del pipeline, permitiendo además la integración con otras herramientas y la extensión de funcionalidades según las necesidades del proyecto.
Se recomienda revisar la documentación oficial de GitHub Actions para ampliar las capacidades y personalizar los workflows según los requisitos de tu entorno.
Para mantener el workflow limpio y reutilizable, puedes crear una carpeta llamada .github/scripts
o similar donde almacenar scripts auxiliares y funciones comunes, evitando la repetición de código y simplificando la definición de los jobs.