Encore une fois, je me suis donné un challenge pour apprendre à utiliser Github Action. J’ai essayé de voir s’il était possible de lancer dynamiquement un job pour chaque dossier dans un répertoire.
On est souvent amené à vouloir paralléliser l’exécution des tests pour réduire le temps de l’intégration continue.
Souvent les outils comme Jest
ou CucumberJS
possèdent des fonctionnalités de parrallélisation mais celles-ci confrontent souvent les limites de la puissance des machines sur lesquelles on souhaite les lancer.
tests/
user/
foo.feature
bar.feature
account/
example.feature
live/
a.feature
video.feature
Je me suis demandé si il ne serait pas plus performant de paralléliser le lancement des tests directement grâce à l’outil de CI pour n’avoir besoin que de petits runners.
Dans l’exemple précédent, j’aimerais pouvoir lancer en parallèle sur un runner distinct pour chaque dossier dans test/
.
Une Solution avec les Github action
name: CI
on:
push:
branches: [main]
jobs:
directories: # Job that list subdirectories
runs-on: ubuntu-latest
outputs:
dir: ${{ steps.set-dirs.outputs.dir }} # generate output name dir by using inner step output
steps:
- uses: actions/checkout@v2
- id: set-dirs # Give it an id to handle to get step outputs in the outputs key above
run: echo "::set-output name=dir::$(ls -d */ | jq -R -s -c 'split("\n")[:-1]')"
# Define step output named dir base on ls command transformed to JSON thanks to jq
loop:
runs-on: ubuntu-latest
needs: [directories] # Depends on previous job
strategy:
matrix:
dir: ${{fromJson(needs.directories.outputs.dir)}} # List matrix strategy from directories dynamically
steps:
- run: echo ${{matrix.dir}}
À vous de l’adapter à vos besoins !