GitHub Actions
GitHub Actions est une plateforme d'automatisation intégrée à GitHub qui vous permet de définir et d'exécuter des workflows automatisés directement dans votre dépôt de code sans dépendre d'outils CI/CD externes.
Les cas d'utilisation courants incluent : exécuter automatiquement des tests après un push de code, déployer automatiquement sur des serveurs après la fusion de PR, et exécuter des scripts de scraping de données selon un calendrier.

GitHub Actions est entièrement gratuit pour lesdépôts publics., les dépôts privés disposent d'un quota gratuit de 2,000 minutes par mois.
Concepts fondamentaux
Avant d'écrire le fichier de configuration, vous devez comprendre les concepts clés suivants, et les relations entre eux sont les suivantes :
仓库(Repository)
└── Workflow(工作流) ← 一个 .yml 文件 = 一个 Workflow
├── Event(触发事件) ← 什么情况下启动这个 Workflow,如 push、PR
└── Job(作业)× N ← 一个 Workflow 可以包含多个并行或串行的 Job
├── Runner(运行器) ← 执行 Job 的服务器,如 ubuntu-latest
└── Step(步骤)× N ← Job 内按顺序执行的一系列操作
├── Action ← 可复用的封装好的操作,如 actions/checkout
└── Run ← 直接执行 Shell 命令
| Concepts | Description | Analogie |
|---|---|---|
| Workflow | L'ensemble du workflow automatisé est défini par un.ymlfichier, stocké dans.github/workflows/sous le répertoire |
un plan de travail complet. |
| Événement | Conditions qui déclenchent l'exécution du Workflow, telles que le push de code, la création de PR, les tâches planifiées, etc. | La condition de démarrage du plan. |
| Job(tâche) | Une unité de tâche indépendante dans un Workflow. Chaque Job s'exécute sur une machine virtuelle indépendante, et plusieurs Jobs s'exécutent en parallèle par défaut. | Une section dans le plan. |
| Étape | La plus petite unité d'opération exécutée séquentiellement dans un Job, qui peut être une commande Shell ou une Action. | Chaque étape spécifique au sein d'une section. |
| Action | Opérations empaquetées réutilisables, provenant de GitHub officiel, de tiers ou écrites par vous-même, viausesRéférence |
Modèles d'outils prêts à l'emploi |
| Runner | Serveur qui exécute les Jobs. GitHub propose trois environnements hébergés : Ubuntu, Windows et macOS. | L'agent qui exécute le plan. |
Créez votre premier Workflow.
1. Structure des répertoires
Tous les fichiers Workflow doivent être stockés dans le.github/workflows/répertoire à la racine du dépôt, et les noms de fichiers doivent se terminer par.ymlou.yamlLe nom du fichier peut être personnalisé :
your-repo/ ├── .github/ │ └── workflows/ │ ├── ci.yml ← 持续集成流程(如运行测试) │ ├── deploy.yml ← 部署流程 │ └── scheduled.yml ← 定时任务 ├── src/ ├── package.json └── README.md
Un dépôt peut contenir plusieurs fichiers Workflow, qui sont indépendants les uns des autres et sont déclenchés par leurs événements définis respectifs.
2. Le workflow le plus simple
Voici un exemple très basique : chaque fois que du code est poussé vers le dépôt, afficher une ligne "Hello, GitHub Actions!" :
Exemple
name: Hello World # Nom du workflow, affiché sur la page GitHub Actions
on: push # Condition de déclenchement : se déclenche lorsque du code est poussé vers n'importe quelle branche
jobs: # Définir toutes les tâches
say-hello: # ID de la tâche (nom personnalisé, unique au sein du même workflow)
name: Print greeting# Nom d'affichage de la tâche (facultatif ; si vide, affiche l'ID de la tâche)
runs-on: ubuntu-latest # Spécifier l'environnement d'exécution : utiliser la dernière machine virtuelle Ubuntu fournie par GitHub
steps: # Toutes les étapes de cette tâche sont exécutées dans l'ordre
- name: printMessage# Nom de l'étape (facultatif, utilisé pour identifier cette étape dans les journaux)
run: echo "Hello, GitHub Actions!" # run : exécuter directement des commandes Shell
Les fichiers YAML sont très sensibles à l'indentation et doivent utiliserdes espacesd'indentation, et ne peuvent pas utiliser la touche Tab. Il est recommandé d'utiliser VS Code et d'installer le plugin YAML, qui peut détecter les erreurs de format en temps réel.
Événements déclencheurs (on)
onLe champ définit quels événements déclenchent ce Workflow. Il peut s'agir d'un seul événement ou d'une combinaison de plusieurs événements.
1. Événements déclencheurs courants
| Événements | Moment du déclenchement | Utilisations courantes |
|---|---|---|
push |
Lorsque du code est poussé vers le dépôt. | Exécuter des tests, des vérifications de code |
pull_request |
Lorsqu'une Pull Request est créée ou mise à jour. | Revue et tests automatisés avant la fusion de la PR. |
schedule |
Déclenché selon un calendrier à l'aide d'une expression Cron. | Sauvegardes planifiées, extraction de données planifiée. |
workflow_dispatch |
Déclenchement manuel sur la page web GitHub | Déploiement à la demande, exécution manuelle de script. |
release |
Lors de la publication d'une nouvelle version (création d'une Release) | Empaquetage et publication automatiques vers la production. |
workflow_call |
Lorsqu'il est appelé par d'autres Workflows | Réutiliser des workflows publics (comme les workflows de test publics) |
2. Filtrage par branche ou par chemin
Exemple
on:
push:
branches:
- main # Déclencher uniquement lors d'un push vers la branche main
- develop # Ou déclencher lors d'un push vers la branche develop
- 'release/**' # Ou déclencher lors d'un push vers toute branche commençant par release/ (** correspond à n'importe quels caractères)
chemins:
- 'src/**' # Filtrage supplémentaire : déclencher uniquement lorsque les fichiers du répertoire src/ changent.
- 'package.json' # Ou déclencher lorsque le fichier package.json change
# Les deux sont dans une relation « OU » ; l’un ou l’autre déclenche
pull_request:
branches:
- main # Se déclenche uniquement sur les PR dont la branche cible est main (c.-à-d. les PR destinées à être fusionnées dans main)
types:
- opened # Lorsqu’une PR est créée
- synchronize # Lorsqu’un nouveau commit est poussé vers la PR
- reopened # Lorsqu’une PR est rouverte
3. Déclencheurs planifiés (schedule)
Utilisez une expression Cron standard pour définir l’heure d’exécution, le fuseau horaire étant UTC (heure de Pékin = UTC+8, conversion nécessaire) :
Exemple
on:
schedule:
# Format Cron : minute heure jour mois semaine
- cron: '0 2 * * *' # Exécuter une fois par jour à 02:00 UTC (c.-à-d. 10:00 heure de Pékin)
- cron: '0 9 * * 1' # Exécuter une fois chaque lundi à 09:00 UTC (soit 17:00 heure de Pékin)
- cron: '*/30 * * * *' # Exécuter toutes les 30 minutes
# Aide-mémoire rapide des expressions Cron courantes :
# '0 0 * * *' Chaque jour à minuit (UTC 00:00)
# '0 * * * *' toutes les heures à l'heure pile
# '0 0 * * 0' chaque dimanche à minuit
# '0 0 1 * *' minuit le 1er de chaque mois
4. Déclenchement manuel (workflow_dispatch)
workflow_dispatchPermet de cliquer manuellement sur un bouton dans l'onglet Actions de la page web GitHub pour démarrer le Workflow, et vous pouvez également définir des paramètres d'entrée :
Exemple
on:
workflow_dispatch:
inputs:
environment: # Nom du paramètre d'entrée (peut être référencé dans les étapes via ${{ inputs.environment }})
description: 'Environnement cible de déploiement'# Description du paramètre, affichée dans le formulaire de déclenchement manuel
required: true # Est-ce requis ?
default: 'staging' # Valeur par défaut
type: choice # Type de paramètre : choice (sélection dans un menu déroulant)
options:
- staging # Valeurs optionnelles
- production
run_tests:
description: 'Exécuter les tests ou non'
required: false
type: boolean # Type de paramètre : boolean (case à cocher)
default: true
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Afficher les paramètres de déploiement
run: |
echo "Environnement cible : ${{ inputs.environment }}"
echo "Run tests: ${{ inputs.run_tests }}"
Explication détaillée des jobs et des étapes
1. Structure de base d’un job
Exemple
jobs:
build: # ID du job, doit être unique dans le même workflow
name: structurebuildProject# Nom d’affichage du job (facultatif)
runs-on: ubuntu-latest # Environnement d’exécution (obligatoire)
# Facultatif : définir des variables d’environnement pour l’ensemble du job, accessibles par toutes les étapes du job
env:
NODE_ENV: production
APP_PORT: 8080
# Facultatif : définir un délai d’attente en minutes. Le job sera automatiquement annulé après expiration du délai pour éviter tout blocage.
timeout-minutes: 30
steps:
# Méthode d'étape 1 : utiliser une Action (référence avec uses)
- name: Récupérer le code
uses: actions/checkout@v4 # Référence à l'Action checkout officielle (@v4 indique que la version v4 est utilisée)
# Syntaxe d'étape 2 : Exécuter une commande Shell (spécifiée avec run)
- name: Afficher la version de Node
run: node --version
# Étape 3 : Exécution de commandes Shell multilignes (utilisation de | pour plusieurs lignes)
- name: Installer les dépendances et structurer le build
run: |
npm install
npm run build
echo "Compilation terminée"
2. Environnement d'exécution (runs-on)
GitHub fournit les runners hébergés gratuits suivants, que vous pouvez choisir selon vos besoins :
| Balises | Système d'exploitation | Description |
|---|---|---|
ubuntu-latest |
Ubuntu (dernière LTS) | Le plus couramment utilisé, rapide, et dispose du quota gratuit le plus généreux. Recommandé pour une utilisation prioritaire. |
ubuntu-22.04 |
Ubuntu 22.04 | Spécifiez une version fixe pour éviter les problèmes d'incompatibilité introduits par les dernières mises à niveau. |
windows-latest |
Windows Server (dernière version) | Utilisé pour les tests ou les compilations nécessitant un environnement Windows. |
macos-latest |
macOS (dernière version) | Utilisé pour les builds iOS/macOS, consomme le quota gratuit le plus rapidement (environ 10 fois celui d'Ubuntu). |
3. Dépendances entre les Jobs (needs)
Par défaut, plusieurs Jobs s'exécutent en parallèle. UtilisezneedsVous pouvez définir l'ordre d'exécution des Jobs, formant des relations de dépendance en série :
Exemple
jobs:
test: # Étape 1 : exécuter les tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
build: # Étape 2 : Compiler le projet
runs-on: ubuntu-latest
needs: test # le build ne démarrera qu'une fois le job de test terminé avec succès
steps:
- uses: actions/checkout@v4
- run: npm run build
deploy: # Étape 3 : Déployer
runs-on: ubuntu-latest
needs: [test, build] # Le déploiement doit attendre que test et build se terminent avec succès
steps:
- run: echo Début du déploiement...
# Ordre d'exécution : test → build → deploy (séquentiel)
# Si needs est supprimé, les trois Jobs s'exécuteront en parallèle.
4. Exécution conditionnelle (if)
ViaifVous pouvez contrôler si un Job ou une Step s'exécute, ce qui est couramment utilisé pour distinguer les branches, déterminer si l'étape précédente a réussi, etc. :
Exemple
jobs:
deploy:
runs-on: ubuntu-latest
# if écrit au niveau du Job : l'ensemble du Job ne s'exécute que lors d'un push vers la branche main
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Déploiement vers l'environnement de production
run: ./deploy.sh
# if peut également être écrit au niveau de l'étape pour contrôler si une étape spécifique s'exécute
- name: Envoyer une notification de réussite
if: success() # success(): s'exécute uniquement lorsque toutes les étapes ci-dessus réussissent
run: echo "Déploiement réussi, envoyer une notification"
- name: Envoyer une notification d'échec
if: failure() # failure(): S'exécute uniquement lorsqu'une étape échoue
run: echo Échec du déploiement, envoyer une alerte
- name: Étapes de nettoyage toujours exécutées
if: always() # always(): S'exécute indépendamment du succès ou de l'échec (souvent utilisé pour nettoyer les fichiers temporaires)
run: rm -rf ./tmp
Variables d'environnement et secrets
1. Variables d'environnement (env)
Les variables d'environnement peuvent être définies à trois niveaux dans le Workflow, avec une portée décroissante dans l'ordre :
Exemple
env:
APP_NAME: my-app
NODE_VERSION: '18'
jobs:
build:
runs-on: ubuntu-latest
# Niveau 2 : niveau Job (seules les étapes au sein du Job actuel peuvent y accéder)
env:
BUILD_MODE: production
steps:
- name: Afficher les variables d'environnement
# Niveau 3 : niveau Étape (seule l'étape actuelle peut y accéder)
env:
STEP_VAR: bonjour
run: |
echo "Nom de l'application : $APP_NAME" # Accéder à la variable de niveau workflow
echo "Mode de build : $BUILD_MODE" # Accéder à la variable de niveau job
echo "Variable d'étape : $STEP_VAR" # Accéder à la variable de niveau étape
echo "Version de Node : $NODE_VERSION"
2. Variables intégrées de GitHub (contexte github)
GitHub Actions fournit un ensemble de variables de contexte intégrées, accessibles partout via${{ }}Référence de syntaxe :
Exemple
steps:
- name: Afficher les variables intégrées courantes
run: |
echo "Nom du dépôt : ${{ github.repository }}" # Par exemple : your-user/your-repo
echo "Événement déclencheur : ${{ github.event_name }}" # p. ex. : push, pull_request
echo "Branche actuelle : ${{ github.ref_name }}" # p. ex. : main, develop
echo "Submit SHA:${{ github.sha }}" # valeur de hachage SHA complète de la soumission actuelle
echo "Committer: ${{ github.actor }}" # nom d'utilisateur qui a déclenché ce Workflow
echo "Working directory: ${{ github.workspace }}" # chemin du répertoire où se trouve le code après le checkout
echo "Run ID:${{ github.run_id }}" # ID unique de chaque exécution du Workflow
echo "RuneditNumber:${{ github.run_number }}" # nombre d'exécutions de ce Workflow
3. Secrets (gestion des informations sensibles)
Les informations sensibles telles que les mots de passe, les clés API, les adresses de serveur, etc.Ne peuvent pas être écrites directement dans le fichier yml.(Parce que le code est public), elles doivent être stockées dans les Secrets du dépôt GitHub.
Étapes de configuration : accédez à la page du dépôt →Paramètres → Secrets et variables → Actions→ Cliquez surNouveau secret de dépôtrenseignez le nom et la valeur, puis enregistrez.
Exemple
steps:
# Dans l'étape, référencez le Secret configuré via ${{ secrets.secret_name }}
# Les valeurs de secret sont automatiquement masquées avec *** dans les journaux et ne seront pas divulguées
- name: Déployer sur le serveur
env:
SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }} # Clé privée SSH du serveur
SERVER_IP: ${{ secrets.DEPLOY_SERVER_IP }} # Adresse IP du serveur
run: |
echo "$SSH_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh user@$SERVER_IP "cd /app && git pull && pm2 restart all"
# GitHub fournit automatiquement GITHUB_TOKEN pour opérer sur ce dépôt (par exemple, pousser du code, créer des versions)
# Pas besoin de le créer manuellement, il suffit de l'utiliser directement
- name: Pousser les modifications vers le dépôt
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .
git commit -m "Mise à jour automatique [skip ci]"
git push
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub le fournit automatiquement, pas besoin de le créer manuellement
Introduction aux Actions courantes
GitHub officiel et la communauté fournissent un grand nombre d'Actions prêtes à l'emploi, grâce àuses: action名称@版本des références, vous pouvez éviter d'écrire de manière répétée des opérations courantes.
1. actions/checkout (récupérer le code)
Presque la première étape de chaque Workflow consiste à récupérer le code du dépôt, en utilisant l'action officielleactions/checkout:
Exemple
steps:
# L'utilisation la plus basique : récupérer le code le plus récent de la branche actuelle dans le répertoire de travail
- uses: actions/checkout@v4
# Utilisation avancée : personnaliser en passant des paramètres avec 'with'
- uses: actions/checkout@v4
with:
ref: develop # Récupérer la branche spécifiée (par défaut, récupère la branche où se trouve l'événement déclencheur)
fetch-depth: 0 # Récupérer tout l'historique git (par défaut, seul le dernier commit est récupéré)
# Définir à 0 pour récupérer tout l'historique, afin que des commandes comme git log puissent fonctionner correctement.
submodules: true # Initialiser et mettre à jour également les sous-modules git
2. actions/setup-node (configurer l'environnement Node.js)
Exemple
steps:
- uses: actions/checkout@v4
- name: Configurer l'environnement Node.js
uses: actions/setup-node@v4
with:
node-version: '20' # Spécifier la version de Node.js
# Une fois la configuration terminée, les commandes npm et node peuvent être utilisées directement
- run: node --version
- run: npm install
- run: npm test
3. actions/setup-python (configurer l'environnement Python)
Exemple
steps:
- uses: actions/checkout@v4
- name: Configurer l'environnement Python
uses: actions/setup-python@v5
with:
python-version: '3.11' # Spécifier la version de Python
- name: Installer les dépendances
run: pip install -r requirements.txt
- name: Exécuter les tests
run: pytest tests/
4. actions/cache (mettre en cache les dépendances pour accélérer les builds)
Télécharger les dépendances à chaque exécution du workflow peut être lent. L'utilisation de l'Action cache permet de mettre les dépendances en cache et de les utiliser directement lors de la prochaine exécution, ce qui réduit considérablement le temps de build :
Exemple
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Mettre en cache node_modules
uses: actions/cache@v4
with:
path: ~/.npm # Spécifier le répertoire à mettre en cache
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
# key: identifiant unique pour le cache
# hashFiles('**/package-lock.json'): générer une valeur de hachage basée sur le contenu du fichier de verrouillage
# Si le fichier de verrouillage est inchangé, la clé est inchangée et le cache est directement utilisé ; si le fichier de verrouillage change, les dépendances sont réinstallées.
restore-keys: |
${{ runner.os }}-node-
# restore-keys : stratégie de correspondance de secours lorsque la clé ne correspond pas, en utilisant le cache valide le plus récent
- run: npm ci # npm ci est plus adapté aux scénarios CI que npm install, plus rapide et plus strict
- run: npm test
5. actions/upload-artifact / download-artifact (transférer des fichiers entre les jobs)
Des jobs différents s'exécutent sur des machines virtuelles indépendantes, donc les fichiers ne peuvent pas être partagés directement. En utilisant des artefacts, vous pouvez transmettre les fichiers de sortie d'un job à un autre job :
Exemple
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install && npm run build # Les artefacts de build seront générés dans le répertoire ./dist
- name: Téléverser les artefacts de build
uses: actions/upload-artifact@v4
with:
name: dist-files # Nom de l'artefact (référencé par ce nom lors du téléchargement)
path: ./dist # Le répertoire ou le chemin de fichier à téléverser
retention-days: 7 # Jours de conservation de l'artefact (max 90 jours)
deploy:
runs-on: ubuntu-latest
needs: build # Exécuter après la fin du job build
steps:
- name: Télécharger les artefacts de build
uses: actions/download-artifact@v4
with:
name: dist-files # Identique au nom lors du téléversement
path: ./dist # Répertoire de téléchargement en local
- name: Fichier de déploiement
run: rsync -avz ./dist/ user@server:/var/www/html/
Builds matriciels (Matrix)
Les builds matriciels vous permettent d'exécuter une seule configuration de job sur plusieurs environnements en parallèle, couramment utilisés pour les tests de compatibilité entre versions et systèmes d'exploitation :
Exemple
jobs:
test:
name: Tester Node ${{ matrix.node-version }} sur ${{ matrix.os }}
runs-on: ${{ matrix.os }} # Lire l'environnement d'exécution à partir des variables de la matrice
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest] # 3 Systèmes d'exploitation
node-version: ['18', '20', '22'] # 3 versions de Node
# Les combinaisons ci-dessus produisent 3 × 3 = 9 jobs parallèles
fail-fast: false # Par défaut true : annule tous les jobs restants si un job échoue.
# Défini sur false : même si une combinaison échoue, les autres combinaisons continuent de s'exécuter,
# Pratique pour voir les résultats des tests pour tous les environnements
steps:
- uses: actions/checkout@v4
- name: Configurer Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }} # Référencer les variables de matrice
- run: npm ci
- run: npm test
Exemple
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: ['18', '20']
exclude:
- os: windows-latest
node-version: '18' # Exclure la combinaison Windows + Node 18
include:
- os: ubuntu-latest
node-version: '20'
experimental: true # Ajouter des variables supplémentaires pour des combinaisons spécifiques (peuvent être référencées dans les étapes en utilisant matrix.experimental)
Exemples pratiques
Exemple 1 : CI du projet Node.js (tests automatisés)
À chaque fois que du code est poussé ou qu'une PR est créée, installez automatiquement les dépendances et exécutez les vérifications de code et les tests :
Exemple
name: Node.js CI
sur:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
name: CodeChecksandTesting
runs-on: ubuntu-latest
steps:
- name: Récupérer le code
uses: actions/checkout@v4
- name: Configurer l'environnement Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm' # setup-node dispose d'une prise en charge intégrée de la mise en cache, plus concise que d'utiliser l'action cache séparément
- name: Installer les dépendances
run: npm ci # npm ci effectuera l'installation strictement selon package-lock.json,
# Plus adapté aux scénarios CI que npm install
- name: Exécuter le linting du code (ESLint)
run: npm run lint
- name: Exécuter les tests unitaires
run: npm test -- --coverage # Générer aussi le rapport de couverture des tests
- name: Téléverser le rapport de couverture
uses: actions/upload-artifact@v4
if: always() # Téléverser le rapport que le test réussisse ou non (pour faciliter la consultation des causes d'échec)
with:
name: coverage-report
path: ./coverage
Exemple 2 : CI de projet Python
Exemple
name: CI Python
sur:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configurer l'environnement Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip' # Mettre en cache les dépendances pip
- name: Installer les dépendances
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install flake8 pytest # Installer les outils de linting et de test du code
- name: Exécuter la vérification du format de code (flake8)
run: |
# Vérifier les erreurs de syntaxe et les variables non définies (séries E9, F63, F7, F82), et quitter directement avec une erreur si un problème est détecté
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# Vérifier le style de code (longueur maximale de ligne 120), compter uniquement le nombre de problèmes, ne pas quitter avec une erreur.
flake8 . --count --max-line-length=120 --statistics
- name: Exécuter les tests
run: pytest tests/ -v # -v affiche les résultats détaillés des tests
Exemple 3 : Construire et pousser une ou plusieurs images Docker
Exemple
name: Construire et pousser une image Docker
sur:
push:
branches: [main]
tags:
- 'v*' # Se déclenche lors du push de tags commençant par v, tels que v1.0.0
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Utiliser l’action officielle Docker metadata pour générer automatiquement les tags d’image.
# Par exemple, lors du push du tag v1.2.3, générer automatiquement plusieurs tags tels que 1.2.3, 1.2, 1, latest
- name: Extraire les métadonnées Docker (tags d’image, etc.)
id: meta # Définir un ID pour cette étape afin que les étapes suivantes puissent référencer sa sortie.
uses: docker/metadata-action@v5
with:
images: your-dockerhub-username/your-image-name
- name: Se connecter à Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} # Utilisez un jeton d'accès au lieu d'un mot de passe pour une meilleure sécurité
- name: Construire et pousser l'image
uses: docker/build-push-action@v5
with:
context: . # Répertoire où se trouve le Dockerfile (répertoire courant)
push: true # true : pousser vers le registre après la fin de la construction
tags: ${{ steps.meta.outputs.tags }} # Référence la liste des tags générée par l'étape meta
labels: ${{ steps.meta.outputs.labels }} # Référence les informations de tag générées par l'étape meta
Exemple 4 : Déployer automatiquement sur un serveur après le build
Exemple
name: Compiler et déployer
sur:
push:
branches: [main] # Déploiement déclenché uniquement lors d'un push sur la branche main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Installer les dépendances et structurer le build
run: |
npm ci
npm run build # Les artefacts de build sont générés dans le répertoire ./dist
- name: Déployer sur le serveur via SSH
uses: appleboy/[email protected] # Action SSH tierce, pas besoin de configurer SSH manuellement
with:
host: ${{ secrets.SERVER_HOST }} # IP ou domaine du serveur
username: ${{ secrets.SERVER_USER }} # Nom d'utilisateur de connexion SSH
key: ${{ secrets.SSH_PRIVATE_KEY }} # Contenu de la clé privée SSH (correspondant à la clé publique sur le serveur)
port: 22 # Port SSH, par défaut 22
script: |
# Les commandes suivantes sont exécutées sur le serveur distant
cd /var/www/my-app
git pull origin main
npm ci --production
pm2 restart my-app # Redémarrer l'application Node.js avec pm2
echo "Déploiement terminé : $(date)"
Exemple 5 : tâche planifiée (sauvegarde automatique de la base de données)
Exemple
name: décider quand sauvegarder la base de données
sur:
schedule:
- cron: '0 2 * * *' # Exécuter quotidiennement à 02:00 UTC (10:00 heure de Pékin)
workflow_dispatch: # Prend également en charge le déclenchement manuel pour les sauvegardes temporaires
jobs:
backup:
runs-on: ubuntu-latest
steps:
- name: Exécuter le script de sauvegarde via SSH
uses: appleboy/[email protected]
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="/backup/db_$TIMESTAMP.sql"
# Effectuer la sauvegarde de la base de données
mysqldump -u root -p${{ secrets.DB_PASSWORD }} my_database > $BACKUP_FILE
# Compresser les fichiers de sauvegarde
gzip $BACKUP_FILE
# Supprimer les fichiers de sauvegarde datant de plus de 30 jours pour éviter que le disque ne se remplisse
find /backup -name "*.sql.gz" -mtime +30 -delete
echo "Sauvegarde terminée : ${BACKUP_FILE}.gz"
Astuces de débogage
1. Activation des journaux de débogage
Lorsqu'une exécution de workflow échoue mais que les informations du journal sont insuffisantes, vous pouvez activer le mode de débogage détaillé. Méthode : accédez au dépôtParamètres → Secrets et variables → Actions, ajoutez les deux Secrets suivants (définissez les deux valeurs surtrue):
ACTIONS_RUNNER_DEBUGActiver les journaux détaillés du runnerACTIONS_STEP_DEBUG: Activer la journalisation de débogage détaillée pour chaque étape.
2. Affichage des informations de contexte pour faciliter le dépannage
Exemple
steps:
- name: Afficher toutes les informations de contexte (pour le débogage ; à ajouter lors du dépannage, à supprimer après résolution)
run: |
echo "=== github context ==="
echo '${{ toJson(github) }}' # toJson() convertira le format d'objet en sortie de chaîne JSON
echo "=== env context ==="
echo '${{ toJson(env) }}'
echo "=== job context ==="
echo '${{ toJson(job) }}'
3. Test local du Workflow (avec act)
Tester le Workflow seulement en poussant du code à chaque fois est très inefficace.actest un outil open source qui peut simuler l'exécution de GitHub Actions localement, ce qui améliore grandement l'efficacité de débogage :
# 安装 act(需要本地已安装 Docker) # macOS brew install act # Linux curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash # 在仓库根目录运行所有 Workflow act # 只运行指定事件触发的 Workflow act push # 只运行指定的 Job act -j build
Lors de l'exécution de tests locaux,
actIl utilise des conteneurs Docker pour simuler l'environnement d'exécution GitHub, mais certaines Actions (telles queactions/cache) peuvent se comporter différemment lorsqu'elles sont simulées localement par rapport à l'environnement réel. Les résultats finaux dépendent de ce qui s'exécute réellement sur GitHub.
Problèmes courants et notes
1. Problème de permissions (Permission refusée)
Si le Workflow doit pousser du code vers le dépôt ou effectuer des opérations sur les Issues, vous devez déclarer explicitement les permissions dans le fichier de configuration :
Exemple
permissions:
contents: write # Autorise la lecture/l'écriture du contenu du dépôt (code, fichiers)
issues: write # Autoriser la création et la modification des Issues
pull-requests: write # Autoriser les opérations sur les Pull Requests
# Principe du moindre privilège : n'accorder que les permissions réellement nécessaires, le reste est par défaut read ou none
2. Éviter les déclenchements en boucle du Workflow
Si le Workflow pousse automatiquement du code vers le dépôt, il peut déclencher un nouvel événement push, provoquant une boucle infinie. Solution : dans le message de commit du commit automatique, ajoutez[skip ci]mot-clé, et GitHub ignorera le déclenchement du Workflow pour ce commit :
git commit -m "自动格式化代码 [skip ci]"
3. Échappement des caractères spéciaux YAML
DansrunDans la commande Shell du champ, utilisez${{ }}expression, si l'expression contient un deux-points (:) et d'autres caractères spéciaux YAML, vous devez entourer toute la valeur de guillemets, ou, à la place, l'affecter d'abord à une variable d'environnement puis l'utiliser:
Exemple
steps:
# Non recommandé : intégrer directement des commandes complexes dans les expressions ${{ }} peut provoquer des erreurs d'analyse YAML.
- run: echo ${{ github.event.pull_request.title }}
# Recommandé : affectez d'abord la valeur à une variable d'environnement, puis utilisez la variable d'environnement dans Shell
- name: Afficher le titre de la PR
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: echo "Titre de la PR : $PR_TITLE"
Pour une documentation plus complète, veuillez consulter la documentation officielle :https://docs.github.com/zh/actions
autres extensions