Workflows
Exemple d'intégration des actions GitHub dans les workflows
Voici un exemple d'intégration des actions GitHub dans un workflow pour automatiser le déploiement d'une application Node.js.
Un workflow est l'élément central de GitHub Actions. Il s'agit d'un processus automatisé composé de jobs
et de steps
qui s'exécutent sur des runners
. Les workflows sont déclenchés par des événements, tels que des pushs, des pull requests, des forks, etc.
Pour créer un fichier de workflow, il faut créer un fichier .yml
dans le dossier .github/workflows
du dépôt. Un workflow est composé de jobs
et de steps
. Un job
est une suite d'étapes qui s'exécutent sur le même runner, tandis qu'un step
est une tâche individuelle qui peut s'exécuter dans un job
. Chaque job
est exécuté dans un environnement dédié défini par runs-on
.
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run a one-line script
run: echo Hello, world!
- name: Run a multi-line script
run: |
echo Add other actions to build,
echo test, and deploy your project.
Documentation Complète : https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions
Déclenchement des actions
Les déclencheurs de workflow sont des événements qui entraînent l’exécution d’un workflow. La syntaxe dépend du niveau de précision
- Pour tout ce qui concerne un événement :
on: [push] # pull_request, fork etc
- Pour plus de finesse sur l’événement :
on: # trigger
label: # type d'event (push, fork, pull_request)
types:
- created # trigger à chaque fois qu'un label est créé
push:
branches:
- main # tous les push sur la branche main
- Déclenchement manuel de l’opération (avec prise d’argument)
on:
workflow_dispatch:
inputs:
test_mode:
description: 'True or False'
required: true
La liste complète des déclencheurs est disponible dans la Documentation Github
Une exécution de workflow est composée d’un ou de plusieurs jobs
, qui s’exécutent en parallèle par défaut. Chaque job est constitué d’un name
et d’au moins un step
pour être exécutable et peut être configuré.
La documentation précise des job est disponible dans la Documentation Github
Marketplace
Chaque job
permet d’exécuter un script. Le script le plus basique est un simple run
avec des commandes bash
derrière. Cependant, il est possible de réutiliser des actions définies dans le marketplace. Par exemple le steps
ci-dessous permet d’exécuter l’action https://github.com/ros-tooling/action-ros-ci. Le mot clé with
permet de passer des paramètres à l’action.
Le marketplace permet de réutiliser des actions déjà définies par la communauté. Il est important de vérifier la source de l’action avant de l’utiliser.
steps:
- name: build and test ROS 2
uses: ros-tooling/action-ros-ci@v0.2
with:
package-name: github-action-test
target-ros2-distro: ${{ matrix.ros_distribution }}
import-token: ${{ secrets.GITHUB_TOKEN }} # token autogenerated par github
Réutiliser les Workflows et Actions
Il est possible de réutiliser des workflows
et des actions
dans un workflow. Pour cela, il est possible de créer des workflows
et des actions
dans des fichiers séparés et de les appeler dans le workflow principal.
jobs:
workflow: # réutilisation du workflow
uses: path/to/your-workflow.yml@v1
action: # réutilisation d'une action
runs-on: ubuntu-latest
container: ubuntu:latest
steps:
- uses: path/to/your-action@v1
Documentation des wokflows réutilisables
Documentation des actions réutilisables
Lorsqu'un workflow est réutilisé il défini son propre environnement (runner, container, etc). De plus il n'est pas utilisable dans une step
.
À l'inverse, une action est utilisable dans une step
et fonctionne dans l'environnement du job
qui l'appelle.
Type de machine
Utilisez jobs.<job_id>.runs-on
pour définir le type de machine sur laquelle le travail doit être exécuté. La configuration prend en argument un tag
défini pour les runners
jobs:
name-job:
runs-on: ubuntu-latest # runner distant sur les serveur de Github
runs-on: self-hosted # runner local
steps:
- run: echo "Hello World !"
Les runners
distants fourni par Github consomment du temps pour l’organisation dans les limites de 2 000 minutes gratuites par mois. Il est préférable d’utiliser des runners self hosted
(voir https://docs.github.com/fr/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners)
Le choix du runner
se fait via les tags. Toutes les machines auto-hébergées partagent le tag self-hosted
, le tag de leur système d’exploitation (Linux
, Windows
), leur architecture (x64
) et des tags personnalisés par machine.
Container
L’utilisation d’un container
permet de créer un nouveau conteneur permettant d’exécuter les étapes d’un travail dans un conteneur spécififé. Si vous ne définissez pas de container
, toutes les étapes s’exécutent directement sur l’hôte spécifié par runs-on
dans le cas d’une machine auto-hébergées, il n’y a donc accès qu’aux packages installés sur la machine. Un container
est rattaché à un job
.
jobs:
name-job:
runs-on: self-hosted
container:
image: ubuntu:jammy # run job with ubuntu:jammy docker
steps:
- run: echo "Hello World !"
Strategy
L’utilisation de strategy
permet créer automatiquement plusieurs exécutions de travaux basées sur des combinaisons de variables. Une stratégie de matrice est utile pour tester du code dans différentes versions d'un langage ou sur différents systèmes d'exploitation.
Par exemple
jobs:
example_matrix:
strategy:
matrix:
version: [10, 12, 14]
os: [ubuntu-latest, windows-latest]
steps:
- run : echo "${{ matrix.version }} ${{ matrix.os }}"
Un travail s’exécute pour chaque combinaison possible des variables. Dans cet exemple, le workflow exécute six travaux, un pour chaque combinaison des variables os
et version
.
Artéfact
Les artefacts permettent de conserver des données une fois un travail terminé et de les partager avec une autre action. Un artefact est un fichier ou une collection de fichiers générés pendant l’exécution d’un workflow. Cet exemple permet de stocker un fichier comme artefact.
- name: Archive code coverage results
uses: actions/upload-artifact@v3
with:
name: code-coverage-report
path: output/test/code-coverage.html
Pour récupérer un artefact
- name: Download math result for job 2
uses: actions/download-artifact@v3
with:
name: homework
Vrac
needs
le job actuel ne commencera que quand le job mentionné sera terminéif
condition de lancement du jobpermission
permet d’augmenter les droits duGITHUB_TOKEN
(voir https://docs.github.com/fr/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token)environnement
permet de définir des variables d’environnement