GitHub

Dans les flux CI/CD, les événements critiques tels qu’échecs de build, fin de déploiement et alertes d’analyse de sécurité doivent souvent être communiqués immédiatement aux membres concernés de l’équipe. En intégrant EngageLab SMS dans GitHub Actions, vous pouvez déclencher des notifications SMS à n’importe quelle étape d’un workflow, afin que l’équipe reste informée de l’état du système qu’elle soit en ligne ou non.

Prérequis

Avant de commencer, assurez-vous que les configurations suivantes sont en place :

Côté EngageLab

  • Le service SMS EngageLab est activé
  • Un modèle SMS a été créé et approuvé sur la page Gestion des modèles ; l’ID du modèle a été obtenu
  • Une clé API a été créée sur la page Clés API ; dev_key et dev_secret ont été obtenus

Côté GitHub

  • Vous disposez des droits d’administration sur le dépôt cible et pouvez configurer les secrets du dépôt

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

L’envoi de SMS via l’API nécessite des modèles préapprouvés ; le texte personnalisé ne peut pas être envoyé directement.

Connectez-vous à la console EngageLab, allez dans SMS → Gestion des modèles, et créez un nouveau modèle. Pour un exemple de notification de déploiement, le contenu du modèle peut ressembler à :

【{{sign}}】Hello, repository {{repo}} {{status}} at {{time}}, Commit: {{commit}}.
              
              {{sign}}】Hello, repository {{repo}} {{status}} at {{time}}, Commit: {{commit}}.

            
Afficher ce bloc de code dans la fenêtre flottante

Après soumission du modèle, attendez l’approbation et notez l’ID du modèle (ex. deploy-notify-template).

Astuce : Créez des modèles distincts pour « déploiement réussi » et « échec du déploiement » — l’intention est plus claire et le taux d’approbation s’en trouve amélioré.

Étape 2 : Configurer les secrets GitHub

Pour éviter de coder en dur les secrets dans les fichiers de workflow, stockez les informations sensibles dans les secrets du dépôt GitHub.

Sur la page du dépôt, allez dans Paramètres → Secrets et variables → Actions → Nouveau secret de dépôt, et ajoutez les variables suivantes une par une :

Nom du secret Description
ENGAGELAB_DEV_KEY dev_key depuis la page Clés API EngageLab
ENGAGELAB_DEV_SECRET dev_secret correspondant
ENGAGELAB_TEMPLATE_SUCCESS ID du modèle pour les notifications de déploiement réussi
ENGAGELAB_TEMPLATE_FAILURE ID du modèle pour les notifications d’échec de déploiement
ON_CALL_PHONE Numéro de téléphone pour les notifications, avec indicatif pays, ex. +8618701235678

Étape 3 : Ajouter les étapes de notification au workflow

L’API SMS EngageLab utilise l’authentification HTTP Basic ; la chaîne d’auth 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": "deployed successfully", "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": "deployment failed", "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": "deployed successfully",
                  "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": "deployment failed",
                  "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

            
Afficher ce bloc de code dans la fenêtre flottante

Référence des paramètres clés

Paramètre Description
if: success() S’exécute uniquement lorsque toutes les étapes précédentes du job en cours ont réussi
if: failure() S’exécute uniquement lorsqu’une étape du job en cours a échoué
github.repository Variable GitHub intégrée, au format owner/repo
github.sha SHA du commit qui a déclenché ce workflow
date '+%Y-%m-%d %H:%M' Obtient l’heure actuelle sur le runner, fuseau UTC par défaut

Remarque : La commande date renvoie l’heure système du runner GitHub Actions (UTC). Pour afficher un fuseau local, définissez la variable d’environnement TZ avant la commande, ex. : TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M'.

Scénarios étendus

Avertir plusieurs destinataires

Modifiez le champ to en tableau pour envoyer simultanément à plusieurs numéros :

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

            
Afficher ce bloc de code dans la fenêtre flottante

Alertes d’analyse de sécurité

Dans les workflows incluant des étapes d’analyse de sécurité, envoyez des notifications immédiates lorsque des vulnérabilités de gravité élevée sont détectées :

- 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

Rapports de résultats pour tâches planifiées

Pour les workflows déclenchés par schedule (synchronisations quotidiennes, sauvegardes périodiques, etc.), envoyez un SMS récapitulatif après exécution :

on: schedule: - cron: '0 2 * * *' # Runs daily at 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 * * *'   # Runs daily at 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() signifie que l’étape s’exécute que les étapes précédentes réussissent ou échouent — adapté aux cas où la notification doit toujours être envoyée.

Points importants

  1. Les modèles doivent être approuvés avant utilisation. Si un modèle est en attente d’examen ou rejeté lors de l’appel, l’API renvoie une erreur 4001.
  2. Les numéros doivent inclure l’indicatif pays, ex. pour la Chine continentale +8618701235678. Omettre + ou l’indicatif provoque un échec de livraison.
  3. La chaîne d’authentification est générée dynamiquement à chaque requête — inutile de stocker le résultat encodé en Base64 à l’avance. Calculez-le à la volée avec echo -n "key:secret" | base64.
  4. Une réponse HTTP 200 de l’API ne garantit pas la livraison du SMS — vérifiez le champ code dans le corps de la réponse. Un code égal à 0 ou absent indique le succès ; pour les valeurs non nulles, consultez la documentation des codes d’erreur pour le diagnostic.
  5. Évitez les fuites de secrets dans les journaux — n’affichez pas directement le contenu de la variable AUTH avec echo dans les étapes run.
Icon Solid Transparent White Qiyu
Contactez-nous