Shell Scripting en Pipelines de CI/CD (GitHub Actions y GitLab CI)
En el entorno DevOps moderno, los pipelines de Integración y Entrega Continua (CI/CD) se definen en archivos YAML, pero el trabajo real de compilación, ejecución de tests, empaquetado de imágenes Docker y despliegue en servidores se ejecuta a través de scripts en Bash.
Aprender a integrar scripts con GitHub Actions y GitLab CI permite automatizar flujos de ingeniería con máxima robustez y visibilidad.
1. Integración de Scripts con GitHub Actions #
GitHub Actions proporciona archivos de entorno especiales a los que los scripts pueden añadir datos dinámicamente:
1┌─────────────────────────────────────────────────────────────────────────────┐ 2│ VARIABLES ESPECIALES EN GITHUB ACTIONS │ 3├───────────────────────┬─────────────────────────────────────────────────────┤ 4│ $GITHUB_ENV │ Exporta variables de entorno a los siguientes pasos │ 5│ $GITHUB_OUTPUT │ Define salidas (outputs) reutilizables en el flujo │ 6│ $GITHUB_STEP_SUMMARY │ Renderiza tablas y reportes Markdown en la UI web │ 7└───────────────────────┴─────────────────────────────────────────────────────┘
Ejemplo: Script ci_pipeline.sh integrado: #
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4 # 1. Definir variables y exportarlas al entorno global del workflow 5APP_VERSION=$(git describe --tags --always) 6echo "APP_VERSION=${APP_VERSION}" >> "$GITHUB_ENV" 7 8 # 2. Generar salida para otros jobs del pipeline 9echo "status=success" >> "$GITHUB_OUTPUT" 10 11 # 3. Publicar un resumen Markdown en la página de GitHub Actions 12cat << EOF >> "$GITHUB_STEP_SUMMARY" 13### 🚀 Resumen del Pipeline de Integración 14* **Versión generada:** \`${APP_VERSION}\` 15* **Entorno:** \`Producción\` 16* **Commit:** \`$(git rev-parse --short HEAD)\` 17* **Fecha:** \`$(date -u +"%Y-%m-%d %H:%M:%SZ")\` 18EOF
2. Ocultar Secretos en los Logs de CI (Masking) #
Cuando un script descarga o procesa contraseñas, claves API o tokens temporales, se debe instruir a GitHub Actions para que los censure automáticamente en los logs públicos:
1#!/usr/bin/env bash 2 3 # Obtener token temporal mediante llamada API 4API_TOKEN=$(curl -s https://auth.empresa.com/token) 5 6 # Enmascarar el valor para que aparezca como *** en los logs 7echo "::add-mask::${API_TOKEN}" 8 9echo "Token obtenido correctamente: ${API_TOKEN}" # Se imprimirá: Token obtenido: ***
3. Patrón de Reintentos (Retries) con Backoff Exponencial #
En pipelines de CI, las peticiones de red hacia APIs o registros de paquetes pueden sufrir caídas transitorias. Este patrón reintenta la operación automáticamente antes de fallar el pipeline:
1#!/usr/bin/env bash 2 3ejecutar_con_reintentos() { 4 local max_intentos=3 5 local espera=2 6 local intento=1 7 8 while [ $intento -le $max_intentos ]; do 9 echo "Ejecutando intento $intento de $max_intentos..." 10 if "$@"; then 11 echo "Comando completado con éxito." 12 return 0 13 fi 14 15 echo "Fallo en el intento $intento. Esperando ${espera}s..." 16 sleep "$espera" 17 espera=$((espera * 2)) # Backoff exponencial 18 intento=$((intento + 1)) 19 done 20 21 echo "Error crítico: El comando falló tras $max_intentos intentos." >&2 22 return 1 23} 24 25 # Uso: ejecutar_con_reintentos curl -fsSL https://api.externa.com/datos
Resumen del tema
Conceptos clave #
- Archivos Mágicos de GitHub Actions: manipulación de
$GITHUB_ENV,$GITHUB_OUTPUTy$GITHUB_STEP_SUMMARYmediante redirecciones append (>>). - Enmascaramiento de Secretos: sintaxis
::add-mask::para evitar fugas de tokens en los registros de ejecución. - Resiliencia y Reintentos: uso estricto de
set -Eeuo pipefailcombinado con algoritmos de reintento con backoff exponencial para mitigar errores transitorios de red.
Qué debes recordar #
El shell scripting es el pegamento fundamental de CI/CD: utiliza las variables de GitHub Actions para transferir estados entre pasos y diseña scripts con reintentos automáticos para evitar falsos positivos en tus pipelines.