Module 04 · Git & GitHub · Chapitre 6 · strict

6. GitHub — Événements et actions - strict

Version fidèle au support fourni : formulations, exemples, commandes et exercices conservés. La présentation et la numérotation sont adaptées au wiki.

Lecture du support : certaines formulations ou réponses sont imprécises. La version Standard distingue les notions et précise le comportement réel des outils.

6.1 5. Événements et actions Github étape par étape

Illustration du support Liora — chapitre 6, figure 1

Dans cette section, nous allons créer une action qui exécute des tests avec pytest et contrôle la qualité de votre code avec Flake8 lorsque vous chargez sur votre dépôt.

Le framework pytest permet de créer facilement des tests simples et lisibles, et peut s'adapter à des tests fonctionnels complexes pour des applications et des bibliothèques.

Flake8 est une bibliothèque Python qui englobe PyFlakes, pycodestyle et le script McCabe de Ned Batchelder. Il s'agit d'une excellente boîte à outils pour vérifier votre base de code par rapport au style de codage (PEP8), aux erreurs de programmation (comme "library imported but unused - bibliothèque importée mais inutilisée" et "Undefined name - nom non défini").

6.2 Première étape

Tout d'abord, vous devez créer un script python qui contient des fonctions avec des assertions à tester. Pytest analysera toutes les fonctions de vos scripts mais il y a une condition : le nom de vos fonctions doit commencer par test_.

Créons donc ce script nommé file_test.py

import pytest

def test_calc_addition():
    output = 2+4
    assert output == 6

def test_calc_substraction():
  # Fonction test du résultat de 2-4
    output = 2-4
    assert output == -2

def test_calc_multiply():
  # Fonction test du résultat de 2*4
    output = 2*4
    assert output == 8

def test_coucou():
  # Fonction test si le résultat renvoie 'hello'
    output='hello'
    assert output == 'hello'

6.3 Construire notre action

Maintenant que nous avons notre fichier de tests, faisons notre workflow. Allez dans votre dossier contenant votre dépôt, créez un dossier secret nommé .github et un sous-dossier nommé workflows et créez votre fichier.

Créez control_tests.yaml et attribuez un nom à notre flux de travail, définissez l'action sur "push"

name: Pytest & flake8 control Push
on: push

Définissez un id de tâche, nommez-le et définissons sur quelle instance nous voulons l'exécuter.

jobs:
  qa:
    name: Check tests
    runs-on: ubuntu-24.04

Maintenant, configurons nos étapes. Nous avons 5 étapes :

  • Un contrôle du dépôt
  • Configuration de Python sur la VM
  • L'installation des paquets
  • L'exécution de nos tests
  • Le contrôle de la convention PEP8
steps:
  - name: Checkout on master
    uses: actions/checkout@v3

  - name: Set up Python
    uses: actions/setup-python@master
    with:
      python-version: "3.x"

Dans la première étape, nous avons le mot-clé uses qui fait appel à un workflow réutilisable déjà existant sur GitHub.
Ensuite, nous installons Python sur l'instance avec un autre workflow qui existe déjà, et nous spécifions la version de Python avec le mot-clé with.

Dans les étapes suivantes, nous allons installer deux paquets et exécuter pytest et flake8

- name: Install pytest and flake8
  run: |
    pip install pytest
    pip install flake8

- name: Run tests
  run: |
    pytest

- name: Run flake8
  uses: py-actions/flake8@v2

Avec le mot clé run, il suffit de lancer cette commande dans le shell Ubuntu sur l'instance. Pour utiliser flake8, vous devez utiliser un workflow déjà existant sur le marketplace github.

Voici votre workflow final :

name: Control Push
on: push
jobs:
  qa:
    name: Check tests
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout on master
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@master
        with:
          python-version: "3.x"

      - name: Install pytest and flake8
        run: |
          pip install pytest
          pip install flake8

      - name: Run tests
        run: |
          pytest

      - name: Run flake8
        uses: py-actions/flake8@v2

Maintenant, vous n'avez plus qu'à faire un commit et charger votre code dans votre dépôt.

Allez sur votre dépôt sur www.github.com, cliquez sur Actions et vous pourrez voir votre workflow s'exécuter.

Illustration du support Liora — chapitre 6, figure 2

Vous constatez que notre workflow renvoie une erreur. Cliquez sur votre action.

Illustration du support Liora — chapitre 6, figure 3

Maintenant, cliquez sur check tests (vérifier les tests) et vous verrez alors pourquoi notre action a échoué.

Illustration du support Liora — chapitre 6, figure 4

Nous observons que les tests sont passés mais que l'étape flake8 a échoué. En examinant notre script, on constate que nous n'avons pas la convention de code PEP 8. Vous pouvez corriger cela en effectuant un réusinage de votre code et en faisant attention aux messages d'erreur.

Dans cet exemple, à l'intérieur du script de workflow, vous pouvez remarquer que nous avons une ligne uses contenant actions/checkout@v3. Github Marketplace contient des outils qui ajoutent des fonctionnalités. Dans notre exemple, nous avons utilisé une action appelée checkout qui nous permet de recopier notre repository sur le serveur distant sur lequel tourne le workflow pour que le job puisse avoir accès à nos fichiers. Vous pouvez construire votre propre action et la publier sur le marketplace.

6.4 Variable d'environnement

Présentons un concept très utile dans l'action github appelé variable d'environnement. Une variable d'environnement est une variable dont la valeur est définie en dehors du programme et peut être utilisée pour déterminer des informations spécifiques à votre ordinateur. Vous pouvez définir une variable d'environnement pour l'ensemble du workflow en utilisant le niveau supérieur du fichier de workflow, seulement pour une tâche spécifique ou seulement pour une étape à l'intérieur d'une tâche.

Voici un bon exemple pour l'illustrer:

name: salutation sur un jour quelconque

on: workflow_dispatch

env:
  DAY_OF_WEEK: Lundi ## Variable d'environnement pour l'ensemble du flux de travail

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    env:
      Greeting: Salut ## Variable d'environnement pour la tâche
    steps:
      - name: "Dites Salut Mona nous sommes lundi"
        run: echo "$Greeting $First_Name. Nous sommes $DAY_OF_WEEK!"
        env:
          First_Name: Mona ## Variable d'environnement uniquement pour l'étape "Dites Salut Mona nous sommes lundi" de la tâche "greeting_job"

L'exemple ci-dessus montre trois variables d'environnement personnalisées utilisées dans une commande echo : $DAY_OF_WEEK, $Greeting, et $First_Name.

Il existe un autre moyen de définir les variables d'environnement de manière plus sûre. Si vous ne voulez pas afficher certaines informations confidentielles, vous pouvez utiliser github secret pour ne pas afficher le code. Cela peut être très utile pour les identifiants de base de données ou les identifiants d'API par exemple. Pour créer des secrets, vous devez être le propriétaire du dépôt.

1- Sur GitHub.com, accédez à la page principale du dépôt.

2- Sous le nom de votre dépôt, cliquez sur Settings.

3- Bouton Repository settings (paramètres du dépôt).

4- Dans la barre latérale gauche, cliquez sur Environnements.

5- Cliquez sur l'environnement auquel vous voulez ajouter un secret.

6- Sous Secrets d'environnement, cliquez sur Ajouter un secret.

7- Tapez un nom pour votre secret dans la zone de saisie Name.

8- Saisissez la valeur de votre secret.

9- Cliquez sur Add secret.

Voici un autre exemple :

create_commit:
  runs-on: ubuntu-latest
  permissions:
    contents: write
  steps:
    - name: Push a file to our repository
      run: |
        pwd
        ls -a 
        git init
        git remote add origin "https://$GITHUB_ACTOR:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY.git" 
        git config --global user.email "my-bot@bot.com"
        git config --global user.name "my-bot"
        git fetch
        git checkout main
        git branch --set-upstream-to=origin/main
        git pull
        pytest >> log_pytest.txt
        ls -a
        git add .
        git commit -m "random file from action"
        git push

Dans ce code, nous voulons charger un fichier dans notre dépôt distant github. Certaines opérations comme push ou pull requièrent des informations d'identification comme votre nom d'utilisateur ou votre mot de passe. Github a supprimé le mot de passe pour le remplacer par un jeton d'accès personnel pour une durée limitée ou pas. Le jeton peut être appelé et utilisé comme une variable d'environnement appelée dans notre script : GITHUB_TOKEN. Dans cette action nous avons aussi 2 variables d'environnement nommées GITHUB_ACTOR et GITHUB_REPOSITORY. Cette action initialise un dépôt git à l'intérieur de la VM, définit les informations d'identification du compte, se connecte à votre dépôt distant, extrait le contenu puis exécute pytest et stocke les logs dans un fichier nommé log_pytest.txt. Ensuite, nous validons ce fichier et nous le chargeons dans le dépôt.