Github

En un flujo de CI/CD, eventos clave como un fallo de compilación, la finalización de un despliegue o una alerta de escaneo de seguridad suelen requerir notificar de inmediato a las personas implicadas. Al integrar EngageLab SMS en GitHub Actions, puedes disparar notificaciones por SMS en cualquier punto del Workflow, garantizando que los miembros del equipo perciban el estado del sistema a tiempo, estén o no conectados.

Requisitos previos

Antes de empezar, confirma que se ha completado la siguiente configuración:

En EngageLab

  • Has activado el servicio EngageLab SMS
  • Has creado una plantilla de SMS en la página de gestión de plantillas, ha sido aprobada y has obtenido el ID de la plantilla
  • Has creado una API Key en la página de API Key y has obtenido el dev_key y el dev_secret

En GitHub

  • Tienes permisos de administrador en el repositorio de destino, para poder configurar los Repository Secrets

Paso 1: prepara la plantilla de SMS

Para enviar SMS mediante la API es obligatorio usar plantillas previamente aprobadas; no se admite pasar texto personalizado directamente.

Inicia sesión en la consola de EngageLab, ve a SMS → Gestión de plantillas y crea una nueva plantilla. Tomando como ejemplo una notificación de despliegue, el contenido de la plantilla podría diseñarse así:

[{{sign}}] Hola, el repositorio {{repo}} {{status}} el {{time}}. Commit: {{commit}}.
              
              [{{sign}}] Hola, el repositorio {{repo}} {{status}} el {{time}}. Commit: {{commit}}.

            
Este bloque de código se muestra en una ventana flotante

Tras enviar la plantilla, espera a que sea aprobada y anota el ID de la plantilla (como deploy-notify-template).

Recomendación: crea plantillas independientes para «despliegue exitoso» y «despliegue fallido»; así la semántica es más clara y la tasa de aprobación es mayor.

Paso 2: configura los GitHub Secrets

Para evitar codificar las claves directamente en el archivo del Workflow, debes almacenar la información sensible en los Repository Secrets de GitHub.

Ve a la página del repositorio, haz clic sucesivamente en Settings → Secrets and variables → Actions → New repository secret y añade una a una las siguientes variables:

Nombre del Secret Descripción
ENGAGELAB_DEV_KEY El dev_key de la página de API Key de EngageLab
ENGAGELAB_DEV_SECRET El dev_secret correspondiente
ENGAGELAB_TEMPLATE_SUCCESS El ID de la plantilla de notificación de despliegue exitoso
ENGAGELAB_TEMPLATE_FAILURE El ID de la plantilla de notificación de despliegue fallido
ON_CALL_PHONE El número de móvil que recibe la notificación, con código de país, como +6591234567

Paso 3: añade los pasos de notificación en el Workflow

La API de EngageLab SMS utiliza autenticación HTTP Basic, y la cadena de autenticación se genera mediante base64(dev_key:dev_secret). A continuación se muestra un ejemplo completo de Workflow:

name: Deploy to Production on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build and test run: | npm install npm test - name: Deploy run: ./deploy.sh - name: Notify success via EngageLab SMS if: success() run: | AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64) curl -s -X POST https://smsapi.engagelab.com/v1/messages \ -H "Content-Type: application/json" \ -H "Authorization: Basic ${AUTH}" \ -d '{ "to": ["${{ secrets.ON_CALL_PHONE }}"], "template": { "id": "${{ secrets.ENGAGELAB_TEMPLATE_SUCCESS }}", "params": { "repo": "${{ github.repository }}", "commit": "${{ github.sha }}", "status": "se desplegó correctamente", "time": "'"$(date '+%Y-%m-%d %H:%M')"'" } } }' - name: Notify failure via EngageLab SMS if: failure() run: | AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64) curl -s -X POST https://smsapi.engagelab.com/v1/messages \ -H "Content-Type: application/json" \ -H "Authorization: Basic ${AUTH}" \ -d '{ "to": ["${{ secrets.ON_CALL_PHONE }}"], "template": { "id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}", "params": { "repo": "${{ github.repository }}", "commit": "${{ github.sha }}", "status": "falló el despliegue", "time": "'"$(date '+%Y-%m-%d %H:%M')"'" } } }'
              
              name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Build and test
        run: |
          npm install
          npm test

      - name: Deploy
        run: ./deploy.sh

      - name: Notify success via EngageLab SMS
        if: success()
        run: |
          AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
          curl -s -X POST https://smsapi.engagelab.com/v1/messages \
            -H "Content-Type: application/json" \
            -H "Authorization: Basic ${AUTH}" \
            -d '{
              "to": ["${{ secrets.ON_CALL_PHONE }}"],
              "template": {
                "id": "${{ secrets.ENGAGELAB_TEMPLATE_SUCCESS }}",
                "params": {
                  "repo": "${{ github.repository }}",
                  "commit": "${{ github.sha }}",
                  "status": "se desplegó correctamente",
                  "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

      - name: Notify failure via EngageLab SMS
        if: failure()
        run: |
          AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
          curl -s -X POST https://smsapi.engagelab.com/v1/messages \
            -H "Content-Type: application/json" \
            -H "Authorization: Basic ${AUTH}" \
            -d '{
              "to": ["${{ secrets.ON_CALL_PHONE }}"],
              "template": {
                "id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}",
                "params": {
                  "repo": "${{ github.repository }}",
                  "commit": "${{ github.sha }}",
                  "status": "falló el despliegue",
                  "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

            
Este bloque de código se muestra en una ventana flotante

Descripción de los parámetros clave

Parámetro Descripción
if: success() Se ejecuta solo si todos los pasos previos del Job actual fueron exitosos
if: failure() Se ejecuta solo si algún paso del Job actual falló
github.repository Variable integrada de GitHub, con el formato owner/repo
github.sha El Commit SHA que disparó este Workflow
date '+%Y-%m-%d %H:%M' Obtiene la hora actual del Runner; por defecto, en la zona horaria UTC

Nota: el comando date obtiene la hora del sistema del Runner de GitHub Actions (UTC). Si necesitas mostrar la hora en la zona horaria local, define la variable de entorno TZ antes del comando, por ejemplo: TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M'.

Escenarios ampliados

Notificar a varios destinatarios

Cambia el campo to por un array para enviar simultáneamente a varios números de móvil:

-d '{ "to": [ "${{ secrets.ON_CALL_PHONE }}", "${{ secrets.TEAM_LEAD_PHONE }}" ], "template": { "id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}", "params": { "repo": "${{ github.repository }}", "commit": "${{ github.sha }}", "status": "falló el despliegue", "time": "'"$(date '+%Y-%m-%d %H:%M')"'" } } }'
              
              -d '{
  "to": [
    "${{ secrets.ON_CALL_PHONE }}",
    "${{ secrets.TEAM_LEAD_PHONE }}"
  ],
  "template": {
    "id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}",
    "params": {
      "repo": "${{ github.repository }}",
      "commit": "${{ github.sha }}",
      "status": "falló el despliegue",
      "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
    }
  }
}'

            
Este bloque de código se muestra en una ventana flotante

Alerta de escaneo de seguridad

En un Workflow que incluya pasos de escaneo de seguridad, notifica de inmediato cuando se detecte una vulnerabilidad de alto riesgo:

- name: Security scan id: security run: ./run-security-scan.sh - name: Notify security alert via SMS if: steps.security.outputs.high_severity == 'true' run: | AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64) curl -s -X POST https://smsapi.engagelab.com/v1/messages \ -H "Content-Type: application/json" \ -H "Authorization: Basic ${AUTH}" \ -d '{ "to": ["${{ secrets.SECURITY_TEAM_PHONE }}"], "template": { "id": "${{ secrets.ENGAGELAB_TEMPLATE_SECURITY }}", "params": { "repo": "${{ github.repository }}", "time": "'"$(date '+%Y-%m-%d %H:%M')"'" } } }'
              
              - name: Security scan
  id: security
  run: ./run-security-scan.sh

- name: Notify security alert via SMS
  if: steps.security.outputs.high_severity == 'true'
  run: |
    AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
    curl -s -X POST https://smsapi.engagelab.com/v1/messages \
      -H "Content-Type: application/json" \
      -H "Authorization: Basic ${AUTH}" \
      -d '{
        "to": ["${{ secrets.SECURITY_TEAM_PHONE }}"],
        "template": {
          "id": "${{ secrets.ENGAGELAB_TEMPLATE_SECURITY }}",
          "params": {
            "repo": "${{ github.repository }}",
            "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
          }
        }
      }'

            
Este bloque de código se muestra en una ventana flotante

Difusión del resultado de las tareas programadas

Para los Workflows programados que se disparan mediante schedule (como la sincronización diaria de datos o las copias de seguridad periódicas), envía un SMS de resumen al finalizar la ejecución:

on: schedule: - cron: '0 2 * * *' # Se ejecuta cada día a las 02:00 UTC jobs: daily-sync: runs-on: ubuntu-latest steps: - name: Run daily sync run: ./daily-sync.sh - name: Notify result via SMS if: always() run: | STATUS=${{ job.status }} AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64) curl -s -X POST https://smsapi.engagelab.com/v1/messages \ -H "Content-Type: application/json" \ -H "Authorization: Basic ${AUTH}" \ -d '{ "to": ["${{ secrets.ON_CALL_PHONE }}"], "template": { "id": "${{ secrets.ENGAGELAB_TEMPLATE_DAILY }}", "params": { "repo": "${{ github.repository }}", "status": "'"${STATUS}"'", "time": "'"$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M')"'" } } }'
              
              on:
  schedule:
    - cron: '0 2 * * *'   # Se ejecuta cada día a las 02:00 UTC

jobs:
  daily-sync:
    runs-on: ubuntu-latest
    steps:
      - name: Run daily sync
        run: ./daily-sync.sh

      - name: Notify result via SMS
        if: always()
        run: |
          STATUS=${{ job.status }}
          AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
          curl -s -X POST https://smsapi.engagelab.com/v1/messages \
            -H "Content-Type: application/json" \
            -H "Authorization: Basic ${AUTH}" \
            -d '{
              "to": ["${{ secrets.ON_CALL_PHONE }}"],
              "template": {
                "id": "${{ secrets.ENGAGELAB_TEMPLATE_DAILY }}",
                "params": {
                  "repo": "${{ github.repository }}",
                  "status": "'"${STATUS}"'",
                  "time": "'"$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

            
Este bloque de código se muestra en una ventana flotante

if: always() indica que se ejecuta tanto si los pasos tienen éxito como si fallan; es adecuado para escenarios en los que hay que garantizar que la notificación llegue siempre.

Consideraciones

  1. La plantilla solo puede usarse después de ser aprobada. Si al llamar la plantilla está pendiente de revisión o ha sido rechazada, la API devolverá el error 4001.
  2. El formato del número de móvil debe incluir el código de país; por ejemplo, un número de Singapur debe escribirse como +6591234567. Si falta el + o el código de país, el envío fallará.
  3. La cadena de autenticación se genera dinámicamente en cada solicitud: no es necesario almacenar de antemano el resultado codificado en Base64; basta con calcularlo en tiempo real mediante echo -n "key:secret" | base64.
  4. Que la API devuelva HTTP 200 no significa que el SMS se haya enviado con éxito; comprueba el campo code en el cuerpo de la respuesta. Si code es 0 o no existe, indica que todo es correcto; si no es cero, consulta la descripción de los códigos de error para investigar la causa.
  5. Evita exponer las claves en los logs: no hagas echo directamente del contenido de la variable AUTH en los pasos run.
Icon Solid Transparent White Qiyu
Contacto