Aller au contenu

Tout savoir sur GitHub Actions CI/CD

Mise à jour :

GitHub Actions, intégré directement dans GitHub, offre une plateforme puissante et flexible pour la mise en place de pipelines CI/CD.

Histoire et Évolution de GitHub Actions

GitHub Actions a été lancé en 2018, marquant une étape importante dans l’évolution de GitHub en tant que plateforme DevOps. Avant GitHub Actions, les développeurs s’appuyaient sur des outils tiers pour automatiser leurs workflows CI/CD. GitHub Actions est donc né de la nécessité de fournir une solution d’automatisation intégrée directement au sein de GitHub, permettant aux utilisateurs de gérer l’ensemble du cycle de vie du développement logiciel sans quitter la plateforme.

Concepts Clés

  • Workflow: ensemble d’actions déclenchées par des événements (push, PR, cron) décrites en YAML pour automatiser build, tests et déploiement.
  • Job: unité de travail d’un workflow; s’exécute dans un environnement dédié; peut être parallèle ou séquentiel selon la configuration.
  • Steps: étapes séquentielles d’un job (actions Marketplace ou commandes) comme compiler, tester, packager ou déployer.
  • Checkout: action qui clone le dépôt dans l’environnement du workflow pour rendre le code disponible aux étapes suivantes.
  • Secrets: variables sensibles (jetons, mots de passe, clés API) stockées de façon sécurisée et référencées dans les workflows.
  • Environnements: contextes d’exécution (dev, test, prod) appliquant des contraintes et validations aux jobs ciblés.
  • Conditions: expressions contrôlant l’exécution des jobs/steps selon événements, branches ou critères spécifiques.
  • Marketplace GitHub Actions: catalogue d’actions réutilisables de la communauté pour accélérer l’automatisation (voir).

Créations des workflows

Pour créer des workflows dans GitHub Actions, vous devez :

  1. Créez le répertoire .github/workflows : Si ce répertoire n’existe pas déjà dans votre projet, créez-le.
  2. Créez un fichier de workflow : Dans le répertoire .github/workflows, créez un fichier YAML pour définir votre workflow. Vous pouvez nommer ce fichier comme vous le souhaitez, mais il doit posséder l’extension .yml. Par exemple, build.yml.

Syntaxe des Workflows

La syntaxe des fichiers de workflows GitHub Actions est basée sur le YAML. L’utilisation du YAML rend la définition des workflows intuitive et lisible, ce

Structure de base

Un fichier de workflow GitHub Actions commence généralement par une structure de base qui définit les propriétés de celui-ci :

name: Mon Workflow
on:
push:
branches:
- main
  • name : Il s’agit du nom de votre workflow.
  • on : Cette section définit les événements déclencheurs du workflow. Dans cet exemple, le workflow est déclenché à chaque push sur la branche principale (main) et seulement sur cette branche.

Jobs et steps

Ensuite on retrouve la définition des jobs et des steps : structure :

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout du code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
- name: Installation des dépendances
run: npm install
- name: Exécution des tests
run: npm test
  • jobs : Cette section définit les jobs à exécuter dans le workflow. Ici il y a un job appelé “build”.
  • runs-on : Cette ligne indique l’environnement sur lequel le job sera exécuté. Ici, il s’agit d’une Ubuntu.
  • steps : Cette section définit la suite d’actions ou de commandes à exécuter.

Utilisation d’actions de la marketplace

GitHub Actions encourage l’utilisation d’actions de sont marketplace, qui sont des composants réutilisables permettant d’automatiser des tâches spécifiques. Vous pouvez aussi créer vos propres actions. Voici comment utiliser une action prédéfinie pour l’étape “Checkout du code” :

- name: Checkout du code
uses: actions/checkout@v6.0.1
  • name : Le nom de l’étape.
  • uses : L’action à utiliser. Dans cet exemple, actions/checkout@v6.0.1 est l’action qui clone le code source du projet.

Retrouver les hashes (commit SHA) des actions

Pour épingler une action avec une référence immuable, récupérez le commit SHA correspondant :

  • Interface GitHub: ouvrez le dépôt de l’action (actions/checkout), onglet Releases/Tags, cliquez sur le tag (v4, v3, v2) puis suivez le lien du commit pour copier le SHA.

  • API GitHub:

    Terminal window
    # Résoudre un tag vers son commit
    curl -s https://api.github.com/repos/actions/checkout/commits/v6.0.1 | jq -r .sha
    8e8c483db84b4bee98b60c0593521ed34d9990e8
    # Lister les tags et leur cible
    curl -s https://api.github.com/repos/actions/checkout/tags | jq -r '.[0]'
    {
    "name": "v6.0.1",
    "zipball_url": "https://api.github.com/repos/actions/checkout/zipball/refs/tags/v6.0.1",
    "tarball_url": "https://api.github.com/repos/actions/checkout/tarball/refs/tags/v6.0.1",
    "commit": {
    "sha": "8e8c483db84b4bee98b60c0593521ed34d9990e8",
    "url": "https://api.github.com/repos/actions/checkout/commits/8e8c483db84b4bee98b60c0593521ed34d9990e8"
    },
    "node_id": "MDM6UmVmMTk3ODE0NjI5OnJlZnMvdGFncy92Ni4wLjE="
    }
  • CLI gh:

    Terminal window
    # Obtenir le SHA pour un tag donné
    gh api repos/actions/checkout/commits/v4 --jq .sha
    {
    "name": "v6.0.1",
    "sha": "8e8c483db84b4bee98b60c0593521ed34d9990e8"
    }
    # Lister les tags et leur commit
    gh api repos/actions/checkout/tags --jq '.[] | {name: .name, sha: .commit.sha}'

Ensuite, épinglez l’action (exemple avec actions/checkout déjà résolu):

uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8

Note: remplacez les autres @<commit-sha> par les SHA réels obtenus via les commandes ci-dessus pour chaque action utilisée (upload-artifact, download-artifact, molecule-action, etc.).

Gestion des Artifacts

Les artifacts sont des fichiers ou des dossiers générés par un job et qui peuvent être archivés et partagés entre les jobs d’un même workflow. Ils permettent de stocker des résultats importants tels que des fichiers de build, des rapports de test ou des binaires. Vous pouvez utiliser l’action upload-artifact pour archiver des artifacts et l’action download-artifact pour les récupérer dans d’autres jobs.

Exemple:

name: Pipeline Avancée
on:
push:
branches:
- main
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout du code
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
- name: Installation des dépendances
run: npm install
- name: Exécution des tests
run: npm test
- name: Archive des résultats de tests
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: test-results
path: test-results
deploy:
needs: build-and-test
runs-on: ubuntu-latest
steps:
- name: Téléchargement des résultats de tests
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
with:
name: test-results
- name: Déploiement sur le serveur de production
run: |
# Script de déploiement ici
echo "Déploiement de l'application sur le serveur de production."

Matrices

Les matrices vous permettent d’exécuter en parallèle un même job avec plusieurs configurations différentes. Cela peut être utile lorsque vous avez besoin de tester votre application sur différentes versions de langages, de systèmes d’exploitation ou de dépendances. Vous pouvez définir une matrice de configurations dans votre fichier de workflow pour exécuter un job pour chaque combinaison de valeurs que vous spécifiez.

Un exemple :

---
#
# Ansible managed
#
name: Ansible Molecule
on:
push:
tags_ignore:
- '*'
pull_request:
schedule:
- cron: '1 1 1 * *'
jobs:
lint:
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
with:
path: "${{ github.repository }}"
- name: molecule
uses: robertdebock/molecule-action@d3e37309fc9c287d6a3507d172520d37df0e2dda
with:
command: lint
test:
needs:
- lint
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
config:
- image: "debian"
tag: "latest"
- image: "debian"
tag: "bookworm"
- image: "fedora"
tag: "35"
- image: "fedora"
tag: "latest"
- image: "fedora"
tag: "rawhide"
- image: "ubuntu"
tag: "latest"
- image: "ubuntu"
tag: "focal"
steps:
- name: checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
with:
path: "${{ github.repository }}"
- name: molecule
uses: robertdebock/molecule-action@d3e37309fc9c287d6a3507d172520d37df0e2dda
with:
image: ${{ matrix.config.image }}
tag: ${{ matrix.config.tag }}

Cet exemple permet de lancer des tests sur des roles Ansible avec molecule sur différents OS.

Utilisation de l’API GitHub

GitHub Actions permet d’interagir avec l’API GitHub directement depuis vos workflows. Vous pouvez créer, mettre à jour ou extraire des informations de votre projet, des pull requests ou des problèmes en utilisant des actions prédéfinies telles que actions/github-script. Cela permet par exemple de poser des tags, de créer des commentaires automatiques…

La CLI GitHub (gh)

La CLI GitHub gh permet d’interagir avec GitHub directement depuis votre terminal. L’utilisation de La CLI GitHub dans vos workflows peut vous offrir des fonctionnalités supplémentaires pour automatiser et simplifier votre flux de travail de développement.

Installation de La CLI GitHub

Pour commencer, vous devez installer La CLI GitHub sur votre système. Vous pouvez suivre les instructions d’installation officielles pour votre système d’exploitation sur la page GitHub CLI.

Vous pouvez aussi l’installer avec asdf vm :

Terminal window
asdf plugin add github-cli
asdf install github-cli latest
asdf set --home github-cli latest
gh --version 07:17:30
gh version 2.39.1 (2023-11-14)
https://github.com/cli/cli/releases/tag/v2.39.1

Une fois installé, vous pouvez utiliser gh pour effectuer diverses opérations sur vos projets GitHub, notamment la création de pull requests, la gestion des problèmes, la consultation des informations de projet et bien plus encore.

Intégration de La CLI GitHub dans les Workflows GitHub Actions

La CLI GitHub peut être utilisée dans les workflows GitHub Actions pour automatiser certaines tâches, notamment la création de pull requests, la gestion des étiquettes ou l’accès aux données de votre projet GitHub.

Voici un exemple de workflow qui utilise La CLI GitHub pour créer une pull request à partir d’une branche :

name: Création de Pull Request
on:
push:
branches:
- feature/*
jobs:
create-pr:
runs-on: ubuntu-latest
steps:
- name: Checkout du code
uses: actions/checkout@v2
- name: Installation de La CLI GitHub
run: |
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | gpg --dearmor -o /usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg arch=all] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list
apt update
apt install gh
- name: Création de la Pull Request
run: |
gh auth login --with-token < ${{ secrets.GITHUB_TOKEN }}
gh pr create --base main --head ${{ github.ref }} --title "Nouvelle fonctionnalité" --body "Cette pull request ajoute une nouvelle fonctionnalité."

Sécurité et Accès aux Secrets

Lorsque vous utilisez la CLI GitHub dans vos workflows GitHub Actions, assurez-vous de gérer les autorisations et l’accès aux secrets de manière sécurisée. Dans l’exemple ci-dessus, nous utilisons le token GitHub ${{ secrets.GITHUB_TOKEN }} pour authentifier la CLI GitHub. Veillez à ne pas exposer vos tokens ou vos informations sensibles dans vos workflows.

En utilisant La CLI GitHub en conjonction avec GitHub Actions, vous pouvez automatiser des tâches spécifiques de manière plus avancée et simplifier la gestion de vos workflows. Cette intégration vous offre davantage de flexibilité pour personnaliser et optimiser votre processus de développement.

Lancer localement vos workflows avec act

act est un outil open source qui vous permet de tester sur votre machine de travail vos workflows avant de les pousser sur votre projet GitHub. Cette approche vous permet d’accélérer le processus de développement, d’identifier les erreurs potentielles et de valider vos workflows sans avoir à attendre une exécution réelle sur GitHub.

Installation de act

Pour commencer à utiliser act, vous devez l’installer sur votre système. Voici comment procéder avec asdf :

Terminal window
asdf plugin add act
asdf install act latest
asdf set --home act latest
act --version
act version 0.2.54

Autre solution pour le télécharger :

  1. Téléchargez la dernière version de act depuis le projet GitHub.
  2. Installez act en suivant les instructions d’installation spécifiques à votre système d’exploitation.

Utilisation de act

Une fois act installé, vous pouvez l’utiliser pour exécuter des workflows GitHub Actions localement. Voici comment fonctionne la commande de base :

Terminal window
act -j <nom-du-job>
  • <nom-du-job> : Remplacez ceci par le nom du job que vous souhaitez exécuter. Si vous ne spécifiez pas de nom de job, act exécutera le premier job défini dans votre fichier de workflow.

Par exemple, si vous avez un fichier de workflow nommé ci-cd.yml avec un job appelé build, vous pouvez lancer le test localement avec la commande suivante :

Terminal window
act -j build

act utilise Docker pour créer un environnement d’exécution isolé basé sur les actions définies dans votre workflow. Il exécutera ensuite le job spécifié, vous permettant de voir les résultats.

Personnalisation de l’environnement

Vous pouvez personnaliser l’environnement d’exécution de act en utilisant des fichiers de configuration spécifiques, tels que .actrc ou .github/act.yml. Cela vous permet de définir des variables d’environnement, des secrets, ou d’autres paramètres nécessaires à votre workflow.

Conclusion

Vous l’aurez compris, GitHub Actions est une puissante solution de CI/CD intégrée qui offre de nombreuses fonctionnalités pour automatiser et améliorer vos projets.

Plus d’infos

Site Officiel et Documentation

Blogs

Livres