Événements et déclencheurs
Table des matières
- Types d'événements
- Événements Git
- Événements GitHub
- Événements planifiés
- Déclenchement manuel
- Exercices pratiques
1 - Types d'événements
Catégories
Vue d'ensemble
| Catégorie | Événements | Usage |
|---|---|---|
| Git | push, pull_request | CI/CD standard |
| GitHub | issues, release, fork | Automation |
| Schedule | cron | Tâches récurrentes |
| Manual | workflow_dispatch | Tests, déploiements |
| External | repository_dispatch | Intégrations externes |
🔝 Retour à la table des matières
2 - Événements Git
push
on:
push:
# Branches spécifiques
branches:
- main
- develop
- 'release/**' # Pattern glob
- '!release/beta' # Exclusion
# Tags
tags:
- 'v*' # v1.0.0, v2.0.0
- '!v*-beta' # Exclure beta
# Chemins (fichiers modifiés)
paths:
- 'src/**'
- 'package.json'
- '!**/*.md' # Exclure markdown
paths-ignore:
- 'docs/**'
- '*.md'
pull_request
on:
pull_request:
branches:
- main
- develop
types:
- opened # PR ouverte
- synchronize # Nouveaux commits
- reopened # PR réouverte
- closed # PR fermée
- ready_for_review # PR prête pour review
paths:
- 'src/**'
pull_request_target
# Pour les forks (attention : risque de sécurité)
on:
pull_request_target:
types: [opened, synchronize]
jobs:
build:
runs-on: ubuntu-latest
steps:
# Checkout du repo cible (pas du fork)
- uses: actions/checkout@v4
Sécurité
pull_request_target a accès aux secrets du repo. Ne jamais exécuter de code non vérifié du fork !
Différence PR events
| Event | Contexte | Secrets | Usage |
|---|---|---|---|
pull_request | Fork | ❌ Non | CI standard |
pull_request_target | Base | ✅ Oui | Labeling, comments |
🔝 Retour à la table des matières
3 - Événements GitHub
issues
on:
issues:
types:
- opened
- edited
- deleted
- labeled
- unlabeled
- assigned
- closed
jobs:
auto-label:
if: github.event.action == 'opened'
runs-on: ubuntu-latest
steps:
- run: echo "New issue: ${{ github.event.issue.title }}"
release
on:
release:
types:
- published # Release publiée
- created # Release créée
- edited # Release modifiée
- prereleased # Pre-release
jobs:
publish:
if: github.event.action == 'published'
runs-on: ubuntu-latest
steps:
- run: echo "Publishing ${{ github.event.release.tag_name }}"
workflow_run
# Déclenché après un autre workflow
on:
workflow_run:
workflows: ["CI"] # Nom du workflow source
types:
- completed # Terminé (succès ou échec)
branches: [main]
jobs:
deploy:
# Seulement si CI réussi
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- run: echo "Deploying after successful CI"
Autres événements utiles
# Fork du repo
on: fork
# Star ajoutée
on:
watch:
types: [started]
# Discussion créée
on:
discussion:
types: [created]
# Package publié
on:
package:
types: [published]
🔝 Retour à la table des matières
4 - Événements planifiés
Syntaxe cron
on:
schedule:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of week (0 - 6)
# │ │ │ │ │
# * * * * *
- cron: '0 0 * * *' # Tous les jours à minuit
- cron: '30 8 * * 1-5' # Lun-Ven à 8h30
- cron: '0 */6 * * *' # Toutes les 6 heures
Exemples courants
| Expression | Description |
|---|---|
0 0 * * * | Tous les jours à minuit UTC |
0 8 * * 1 | Tous les lundis à 8h |
0 0 1 * * | Premier jour du mois |
*/15 * * * * | Toutes les 15 minutes |
0 0 * * 0 | Tous les dimanches |
Exemple complet
name: Nightly Build
on:
schedule:
- cron: '0 2 * * *' # 2h du matin UTC
jobs:
nightly:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run nightly tests
run: npm run test:e2e
- name: Send report
run: ./send-report.sh
Note
- Les schedules utilisent le fuseau UTC
- Délai possible jusqu'à 15 minutes en période de charge
- Ne se déclenche que sur la branche par défaut
🔝 Retour à la table des matières
5 - Déclenchement manuel
workflow_dispatch
on:
workflow_dispatch:
inputs:
environment:
description: 'Environment to deploy'
required: true
type: choice
options:
- staging
- production
default: 'staging'
version:
description: 'Version to deploy'
required: true
type: string
dry_run:
description: 'Dry run mode'
required: false
type: boolean
default: false
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
run: |
echo "Environment: ${{ inputs.environment }}"
echo "Version: ${{ inputs.version }}"
echo "Dry run: ${{ inputs.dry_run }}"
Types d'inputs
| Type | Description |
|---|---|
string | Texte libre |
boolean | Checkbox |
choice | Liste déroulante |
environment | Sélecteur d'environnement |
repository_dispatch
# Déclenché par API externe
on:
repository_dispatch:
types: [deploy, build]
jobs:
handle:
runs-on: ubuntu-latest
steps:
- run: |
echo "Event: ${{ github.event.action }}"
echo "Payload: ${{ toJSON(github.event.client_payload) }}"
# Déclencher via API
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/OWNER/REPO/dispatches \
-d '{"event_type":"deploy","client_payload":{"env":"prod"}}'
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : CI sur PR
Créez un workflow qui s'exécute sur les PR vers main :
Solution
name: PR Check
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
Exercice 2 : Déploiement manuel
Créez un workflow avec choix d'environnement :
Solution
name: Manual Deploy
on:
workflow_dispatch:
inputs:
environment:
type: choice
options: [staging, production]
required: true
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- run: echo "Deploying to ${{ inputs.environment }}"
Quiz
Q1. Quel événement permet le déclenchement par API ?
Réponse
repository_dispatch
Q2. Quel fuseau horaire utilise le schedule ?
Réponse
UTC
🔝 Retour à la table des matières
Points clés à retenir
pushetpull_requestpour CI standard- Filtrer par
branches,tags,paths scheduleavec syntaxe cron (UTC)workflow_dispatchpour déclenchement manuelrepository_dispatchpour API externeworkflow_runpour chaîner les workflowspull_request_target: attention à la sécurité !