Photo par Georg Bommeli

Comment utiliser les variables d'environnement et les secrets avec GitHub Actions

Vue d'ensemble des différentes manières d'utiliser les variables

Créé par Damien Aicheh le 15 April, 2021 · 8 mins

Lorsque vous créez un workflow dans GitHub Actions, vous avez toujours plusieurs variables d’environnement que vous devez utiliser ou réutiliser à différentes étapes pour atteindre votre objectif. Cela peut être le chemin de l’environnement, le chemin du dossier, les logins, les mots de passe, etc.

Dans ce tutoriel, nous découvrirons les différentes façons de déclarer et d’utiliser des variables d’environnement et de stocker et récupérer vos certificats à l’aide de secrets.

Définir une variable d’environnement pour une step

La manière la plus simple de définir une variable d’environnement est de la déclarer directement dans une step:

- name: Basic variable usage
  run: |
    echo Let\'s define a variable:
    VERSION_PREFIX=MyPrefix

    echo Display the version prefix: $VERSION_PREFIX
    echo And use it multiple times: $VERSION_PREFIX

Comme vous pouvez le voir ci-dessus, la variable MY_OUTPUT_PATH est définie directement dans la step et peut ensuite être utilisée plusieurs fois à l’intérieur. Ceci est utile lorsque vous définissez des variables tout au long de vos scripts.

Une autre syntaxe équivalente qui fait la même chose est celle-ci:

- name: Display local environment variable
  env:
    VERSION_PREFIX: MyPrefix
  run: |
    echo We can use a variable multiple time: $VERSION_PREFIX
    echo inside a multi-line script: $VERSION_PREFIX

L’avantage de cette syntaxe est que les variables d’environnement ont une zone spécifique appelée env au-dessus du script. Le mot clé env est une propriété dédiée définie par les GitHub Actions pour déclarer nos variables. Mieux vaut utiliser cette syntaxe, si vous connaissez toutes les valeurs de chaque variable au début du script.

Définir une variable d’environnement sur l’ensemble du job

Parfois, vous souhaitez définir une variable d’environnement pour la réutiliser plusieurs fois dans vos jobs, par exemple une configuration de build, un suffixe de fichier, etc. Vous devez donc la définir globalement dans le job. Pour ce faire, vous avez une propriété env accessible au niveau du job où vous pouvez le faire:

job1:
  runs-on: ubuntu-latest
  env:
    OUTPUT_SUFFIX: MySuffix
  steps:
    - name: Use environment variables from entire job
      run: echo We display the $OUTPUT_SUFFIX define for the entire job1

    - name: Use environment variables from entire job
      run: echo We reuse the output suffix $OUTPUT_SUFFIX multiples time in the entire job1

Comme démontré ci-dessus, vous avez la possibilité de réutiliser la variable d’environnement OUTPUT_SUFFIX à travers plusieurs steps de votre job.

Définissez une variable d’environnement sur l’ensemble du workflow

Si vous avez plusieurs jobs dans votre workflow, vous devrez probablement partager certaines variables globales entre chaque jobs.

Heureusement, vous avez une propriété env disponible au niveau du workflow, que vous pouvez utiliser comme ceci:

name: Variables

on:
  push:
    branches: [main]

env:
  BUILD_CONFIGURATION: Release

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - name: First script from job1
        run: echo We use the global workflow variable $BUILD_CONFIGURATION

  job2:
    needs: job1
    runs-on: ubuntu-latest
    steps:
      - name: First script from job2
        run: echo And here again we use the same workflow variable $BUILD_CONFIGURATION

Comme vous le voyez ci-dessus, la variable BUILD_CONFIGURATION est définie pour tout le workflow et est utilisée dans job1 et job2

Stocker un certificat dans les GitHub Actions

Pour avoir accès à vos certificats dans vos workflows, vous devez utiliser quelque chose appelé secrets. Cela vous permet de stocker ces fichiers en toute sécurité dans les GitHub Actions.

Ne stockez pas vos certificats et mots de passe directement dans vos répertoires GitHub, ces fichiers contiennent des données que vous seul devez connaître.

Pour stocker ces fichiers, allez dans votre projet GitHub et allez dans Settings puis Secrets.

Secrets tab

Dans ce menu, cliquez sur le bouton New repository secret pour ajouter le premier. Comme vous l’avez probablement déjà remarqué, il n’y a aucun moyen de télécharger vos certificats directement sur cette interface. Pour résoudre ce problème, nous devons transformer notre fichier en une chaîne de caractère base64.

Pour encoder votre certificat, en fonction de votre machine locale, vous pouvez faire:

Windows

certutil -encode data.txt tmp.b64 && findstr /v /c:- tmp.b64 > data.b64 && del tmp.b64

Mac

base64 -i data.txt -o data.b64

Ubuntu

base64 data.txt > data.b64

Ensuite, nous pouvons stocker cette chaîne en toute sécurité dans les secrets des GitHub Actions. Par exemple, si nous stockons un keystore dans les secrets, nous aurons quelque chose comme ceci:

Secrets example

Dans votre job, vous pouvez récupérer ce fichier en le décodant, par exemple avec un runner Ubuntu:


- name: Get secret from base64
  env:
    KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
  run: |
    echo import certificate from secrets and regenerate the file
    echo $KEYSTORE_BASE64 | base64 -d > $RUNNER_TEMP/my_production.keystore

Pour les autres runners, la syntaxe pour obtenir un fichier à partir d’une chaîne base64 est:

Windows

echo $YOUR_STRING > data.b64 && certutil -decode data.b64 data.txt

Mac

echo $YOUR_STRING | base64 -D  -o data2.txt

Ubuntu

echo $YOUR_STRING | base64 -d > data.txt

Touche finale

Vous trouverez un exemple complet dans ce répertoire GitHub. Comme vous pouvez le voir dans ce tutoriel, vous avez plusieurs façons d’utiliser les variables d’environnement dans les GitHub Actions, assurez-vous de vérifier le contexte pour appliquer le bon.

Sources:

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !