Améliorer la DX de votre projet avec Task
Contexte
Dans notre vie de développeur, nous sommes souvent amenés à exécuter un certain nombre de tâches récurrentes, comme par exemple mettre à jour des dépendances, exécuter des migrations de base de données etc.
Ces tâches sont fastidieuses et répétitives.
De plus, au sein d’une entreprise chacun à tendance à avoir ses propres outils et le partage n’est pas systématique.
Chez Quable, l’apparition d’équipes pluridisciplinaires a accentué cette problématique.
Certaines erreurs pouvaient ainsi être rencontrées lors de la réalisation d’une nouvelle fonctionnalité, nécessitant l’exécution d’un script, afin d’assurer le bon fonctionnement de la stack locale (une migration, mise à jour des traductions, etc.).
La centralisation des tâches récurrentes devenait indispensable.
Solutions
Plusieurs solutions ont été envisagées : scripts shell, make, task…
Scripts shell
Avantages :
- Flexible
- Arguments natifs
Inconvénients :
- Syntaxe complexe et différente en fonction du shell (sh, bash, zsh..)
- Absence de compatibilité cross-platform
Make
Avantages :
- Cross-platform
- Capacité de ne pas exécuter les commandes si elles ne sont pas nécessaires
Inconvénients :
- Syntaxe complexe
- Documentation indigeste
Task
Avantages :
- Syntaxe simple (YAML)
- Cross-platform
- Parallélisation des tâches
- Documentation claire et concise
Inconvénients :
- Impossible de réaliser des conditions
Notre choix
Un TaskFile.yml versionné pour chaque projet et un TaskFile.yml global incluant tous les autres. Grâce à cette architecture, nous avons la possibilité, avec une seule commande, d’exécuter plusieurs tâches sur différents dossiers.
Imaginons, par exemple, un repository monolithique avec deux dossiers :
- un dossier api contenant un projet en Symfony / API Platform
- un dossier front contenant un projet en React
./Taskfile.yml
version: '3'
includes:
api: './api'
front: './front'
tasks:
# This allows to list all tasks available by typing task
default:
cmds:
- 'task --list'
setup:
# As you can see the key specified in the includes section is the namespace for the commands
- task: api:setup
- task: front:setup
./api/Taskfile.yml
version: '3'
tasks:
setup:
desc: 'Setup the project'
cmds:
- 'php composer install'
lint:
desc: 'Execute php-cs-fixer on the project'
cmds:
- 'php vendor/bin/php-cs-fixer fix --verbose'
./front/Taskfile.yml
version: '3'
tasks:
setup:
desc: 'Setup the project'
cmds:
- 'yarn install'
Dans cet exemple, task setup
dans le dossier global, exécutera successivement les tâches setup
des dossiers enfants : api et front.
Les tâches setup
sont également exécutables individuellement dans chaque dossier.
Pour aller plus loin
Grâce à cet outil, la documentation est simplifiée, ce qui facilite l’onboarding d’un nouveau développeur.
Au-delà du confort pour le développement sur la stack locale, Quable utilise Task dans ses processus d’intégration continue.
Article rédigé par Cedric MONCADE, Yannick Snobbert et Quentin Decaunes.