Logo Site EngageLab Mark Colored TransparentDocumentation
Rechercher

Github

Dans un pipeline CI/CD, des événements clés comme un échec de build, la fin d'un déploiement ou une alerte d'analyse de sécurité doivent souvent être notifiés immédiatement aux personnes concernées. En intégrant EngageLab SMS à GitHub Actions, vous pouvez déclencher des notifications SMS à n'importe quelle étape du Workflow, garantissant que les membres de l'équipe soient informés à temps de l'état du système, qu'ils soient connectés ou non.

Prérequis

Avant de commencer, assurez-vous que les configurations suivantes sont terminées :

Côté EngageLab

  • Le service EngageLab SMS est activé
  • Des modèles SMS ont été créés et validés sur la page de gestion des modèles, et les ID de modèle ont été obtenus
  • Une clé API a été créée sur la page des clés API, et les dev_key et dev_secret ont été obtenus

Côté GitHub

  • Vous disposez des droits d'administrateur sur le dépôt cible afin de configurer les Repository Secrets

Étape 1 : Préparer les modèles SMS

L'appel de l'API pour envoyer des SMS nécessite des modèles pré-validés ; la transmission directe de texte personnalisé n'est pas prise en charge.

Connectez-vous à la console EngageLab, accédez à SMS → Gestion des modèles et créez un nouveau modèle. En prenant l'exemple d'une notification de déploiement, le contenu du modèle peut être conçu ainsi :

【{{sign}}】Bonjour, le dépôt {{repo}} a été {{status}} le {{time}}, Commit : {{commit}}.
              
              {{sign}}】Bonjour, le dépôt {{repo}} a été {{status}} le {{time}}, Commit : {{commit}}.

            
Afficher ce bloc de code dans la fenêtre flottante

Après avoir soumis le modèle, attendez sa validation et notez l'ID de modèle (par exemple deploy-notify-template).

Recommandation : créer des modèles indépendants pour « Déploiement réussi » et « Échec du déploiement » rend la sémantique plus claire et augmente le taux de validation.

Étape 2 : Configurer les GitHub Secrets

Pour éviter de coder les clés en dur dans les fichiers de Workflow, les informations sensibles doivent être stockées dans les GitHub Repository Secrets.

Accédez à la page du dépôt, cliquez successivement sur Settings → Secrets and variables → Actions → New repository secret, puis ajoutez une à une les variables suivantes :

Nom du Secret Description
ENGAGELAB_DEV_KEY Le dev_key de la page des clés API EngageLab
ENGAGELAB_DEV_SECRET Le dev_secret correspondant
ENGAGELAB_TEMPLATE_SUCCESS ID du modèle de notification de déploiement réussi
ENGAGELAB_TEMPLATE_FAILURE ID du modèle de notification d'échec de déploiement
ON_CALL_PHONE Le numéro de mobile destinataire des notifications, incluant l'indicatif pays, ex. +6591234567

Étape 3 : Ajouter des étapes de notification dans le Workflow

L'API EngageLab SMS utilise l'authentification HTTP Basic, et la chaîne d'authentification est générée par base64(dev_key:dev_secret). Voici un exemple complet 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": "Déploiement réussi", "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": "Échec du déploiement", "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": "Déploiement réussi",
                  "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": "Échec du déploiement",
                  "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

            
Afficher ce bloc de code dans la fenêtre flottante

Description des paramètres clés

Paramètre Description
if: success() S'exécute uniquement si toutes les étapes précédentes du Job en cours ont réussi
if: failure() S'exécute uniquement si une étape quelconque du Job en cours a échoué
github.repository Variable intégrée de GitHub, au format owner/repo
github.sha Le Commit SHA ayant déclenché ce Workflow
date '+%Y-%m-%d %H:%M' Récupère l'heure actuelle du Runner, par défaut en fuseau UTC

Remarque : la commande date récupère l'heure système (UTC) du Runner GitHub Actions. Si vous devez afficher l'heure du fuseau local, définissez la variable d'environnement TZ avant la commande, par exemple : TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M'.

Scénarios étendus

Notifier plusieurs destinataires

En remplaçant le champ to par un tableau, vous pouvez envoyer à plusieurs numéros de mobile en même temps :

-d '{ "to": [ "${{ secrets.ON_CALL_PHONE }}", "${{ secrets.TEAM_LEAD_PHONE }}" ], "template": { "id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}", "params": { "repo": "${{ github.repository }}", "commit": "${{ github.sha }}", "status": "Échec du déploiement", "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": "Échec du déploiement",
      "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
    }
  }
}'

            
Afficher ce bloc de code dans la fenêtre flottante

Alerte d'analyse de sécurité

Dans un Workflow comportant une étape d'analyse de sécurité, notifiez immédiatement lorsqu'une vulnérabilité critique est détectée :

- 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')"'"
          }
        }
      }'

            
Afficher ce bloc de code dans la fenêtre flottante

Diffusion du résultat d'exécution d'une tâche planifiée

Pour les Workflows planifiés déclenchés via schedule (par exemple une synchronisation quotidienne de données ou une sauvegarde régulière), envoyez un SMS de synthèse une fois l'exécution terminée :

on: schedule: - cron: '0 2 * * *' # Exécution chaque jour à 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 * * *'   # Exécution chaque jour à 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')"'"
                }
              }
            }'

            
Afficher ce bloc de code dans la fenêtre flottante

if: always() indique une exécution que les étapes réussissent ou échouent, ce qui convient aux scénarios où la livraison de la notification doit être garantie.

Points d'attention

  1. Un modèle ne peut être utilisé qu'après validation. Si le modèle est en attente de validation ou refusé au moment de l'appel, l'API renverra une erreur 4001.
  2. Le format du numéro de téléphone doit inclure l'indicatif pays, par exemple un numéro de Singapour doit s'écrire +6591234567 ; l'absence du + ou de l'indicatif pays entraînera un échec d'envoi.
  3. La chaîne d'authentification est générée dynamiquement à chaque requête ; inutile de stocker à l'avance le résultat encodé en Base64, il suffit de le calculer en temps réel avec echo -n "key:secret" | base64.
  4. Une réponse HTTP 200 de l'API ne signifie pas que le SMS a été envoyé avec succès ; vérifiez le champ code dans le corps de la réponse : lorsque code vaut 0 ou est absent, tout est normal ; s'il est différent de zéro, consultez les explications des codes d'erreur pour en identifier la cause.
  5. Évitez de divulguer les clés dans les journaux ; n'affichez pas directement le contenu de la variable AUTH avec echo dans l'étape run.
Icon Solid Transparent White Qiyu
Contactez-nous