Alertes d’échec GitHub Actions sur votre iPhone
GitHub sait déjà vous tenir informé de vos workflows : dans l’app GitHub Mobile, activez les notifications Actions, et vous recevrez un push pour les exécutions que vous avez lancées. Si cela vous suffit, inutile d’aller plus loin.
Honk va un cran plus loin. Il réunit les échecs de tous vos dépôts, y compris ceux déclenchés par d’autres, regroupés par branche, dans la même boîte de réception que vos serveurs et vos tâches cron, avec un rétablissement quand la branche repasse au vert. Ce guide l’ajoute en une seule étape, à la fin d’un job.
Avant de commencer
- Un compte Honk. Honk est pour l’instant sur invitation : demandez un accès.
- Un projet pour la CI et une clé d’ingestion : dans l’app web, ouvrez le projet, puis Clés, et créez-en une.
1. Enregistrer l’URL et la clé comme secrets
Un secret de dépôt ne vaut que pour ce dépôt ; un secret d’organisation vous évite de répéter l’opération partout. Avec GitHub CLI :
# with the GitHub CLI, for one repository (or use --org for all of them)
gh secret set HONK_URL --body "https://honk-me.app"
gh secret set HONK_KEY # paste the ingestion key when asked2. Ajouter une étape qui ne s’exécute qu’en cas d’échec
Placez cette étape en dernier dans le job qui vous intéresse. if: failure() ne l’exécute que si une étape précédente a échoué. Elle utilise jq et curl, déjà présents sur tous les runners hébergés par GitHub, il n’y a donc rien à installer :
- name: Tell Honk
if: failure()
env:
HONK_URL: ${{ secrets.HONK_URL }}
HONK_KEY: ${{ secrets.HONK_KEY }}
WORKFLOW: ${{ github.workflow }}
REPO: ${{ github.repository }}
BRANCH: ${{ github.ref_name }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
ATTEMPT: ${{ github.run_id }}-${{ github.run_attempt }}
run: |
jq -n --arg title "CI failed: $WORKFLOW on $BRANCH" --arg url "$RUN_URL" --arg key "ci/$REPO/$BRANCH" \
'{title: $title, message: $url, url: $url, severity: "long", event_type: "problem",
group_key: $key, source: "github-actions", category: "deployments"}' |
curl -sS --max-time 10 --retry 3 --retry-all-errors "$HONK_URL/v1/messages" \
-H "Authorization: Bearer $HONK_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: gh-$ATTEMPT" --data-binary @- || trueQuelques choix à noter :
- La clé de groupe combine le dépôt et la branche,
ci/acme/api/main. Le premier échec surmaindéclenche un push ; les échecs suivants surmainrejoignent le même groupe et deviennent des mises à jour discrètes. Un échec sur une autre branche forme son propre groupe. - La clé d’idempotence combine l’identifiant de l’exécution et le numéro de tentative. Si curl réessaie après une réponse perdue, Honk renvoie l’événement d’origine au lieu d’en créer un second. En revanche, un clic sur Re-run lance une nouvelle tentative, donc un nouvel événement.
jqconstruit le JSON : un nom de workflow ou de branche contenant des guillemets ne peut pas casser la requête.|| truegarantit qu’une panne de Honk ne change jamais la nature de l’échec d’un build.
3. Facultatif : un rétablissement quand la branche repasse au vert
Pour clore l’incident quand la branche est de nouveau verte, ajoutez une seconde étape, exécutée en cas de succès. Elle demande à GitHub si l’exécution précédente sur cette branche a échoué et, seulement dans ce cas, signale un rétablissement :
# needs `permissions: actions: read` when the workflow restricts the token
- name: Tell Honk it works again
if: success()
env:
GH_TOKEN: ${{ github.token }}
HONK_URL: ${{ secrets.HONK_URL }}
HONK_KEY: ${{ secrets.HONK_KEY }}
WORKFLOW: ${{ github.workflow }}
REPO: ${{ github.repository }}
BRANCH: ${{ github.ref_name }}
ATTEMPT: ${{ github.run_id }}-${{ github.run_attempt }}
run: |
previous=$(gh run list --repo "$REPO" --workflow "$WORKFLOW" --branch "$BRANCH" \
--limit 2 --json conclusion --jq '.[1].conclusion')
[ "$previous" = "failure" ] || exit 0
jq -n --arg title "CI green again: $WORKFLOW on $BRANCH" --arg key "ci/$REPO/$BRANCH" \
'{title: $title, message: "The last run passed.", severity: "beep", event_type: "recovery",
group_key: $key, source: "github-actions", category: "deployments"}' |
curl -sS --max-time 10 --retry 3 --retry-all-errors "$HONK_URL/v1/messages" \
-H "Authorization: Bearer $HONK_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: gh-$ATTEMPT-ok" --data-binary @- || trueCette étape reste facultative. Sans elle, un épisode sans nouvel événement devient inactif au bout de 24 heures, et l’échec suivant en ouvre un autre, avec un nouveau push.
La même chose avec la CLI honk-me
Si vous préférez la CLI, qui gère pour vous les nouvelles tentatives avec une seule clé d’idempotence et un délai maximal global, installez-la dans les étapes exécutées en cas d’échec et appelez problem. Go est préinstallé sur les runners Linux hébergés par GitHub :
- name: Install honk-me
if: failure()
run: |
go install github.com/honk-me/honk-go/cmd/honk-me@latest
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
- name: Notify
if: failure()
env:
HONK_URL: ${{ secrets.HONK_URL }}
HONK_KEY: ${{ secrets.HONK_KEY }}
run: |
honk-me problem --group-key "ci/${{ github.repository }}/${{ github.ref_name }}" \
--title "CI failed: ${{ github.workflow }}" --message "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--source github-actions --category deployments \
--idempotency-key "gh-${{ github.run_id }}-${{ github.run_attempt }}" || trueLe résultat
Le premier échec sur main arrive en Long coup de klaxon, et le lien vers l’exécution s’ouvre d’un toucher depuis la boîte de réception. Les échecs suivants sur la même branche mettent à jour ce groupe sans refaire vibrer le téléphone, et les heures calmes retiennent les échecs de CI la nuit, sauf si vous les envoyez en priorité urgente. Pour signaler aussi les déploiements réussis, voyez le guide des déploiements.
Pour l’instant, Honk est sur invitation : demandez un accès. Tout ce guide fonctionne avec le forfait Free.