Cache sur les agents Hosted de vos Azure Pipelines - test avec Nuget
Un des reproches que l'on peut faire aux agents Hosted de TFS Online, VSTS, d'Azure DevOps est la lenteur des builds à partir du moment où on effectue des tâches de restore de package (NPM, Yarn, Nuget...). En effet, comme il n'y a pas de cache cela prend un temps fou de re-télécharger les packages et de les installer. Dans cet article, nous verrons la solution récemment proposée par Microsoft à base de tâches de build en l'appliquant sur Nuget.
L'idée derrière les "Azure Pipelines Artifact Caching Tasks" est toute bête : on configure un dossier qui sera restauré au début de notre build et sauvegardé à la fin de celle-ci en cas de succès. Cela est décrit de façon complète dans la documentation Microsoft. On va donc faire cela pour mettre en cache le dossier global de Nuget où il installe tous ses packages.
Cache Nuget
La première étape consiste à indiquer l'emplacement de ce fameux dossier de cache Nuget. J'utilise une tâche de script PowerShell inline pour remplacer la valeur de la variable d'environnement "NUGET_PACKAGES" par un dossier du répertoire DefaultWorkingDirectory.
Write-Host "##vso[task.setvariable variable=NUGET_PACKAGES;]$(System.DefaultWorkingDirectory)/NUGET_PACKAGES"
La deuxième étape consiste à ajouter la tâche "CacheBeta" et à la configurer comme suit :
- Choisir une clef de cache (vous pouvez mettre ce que vous souhaitez, je mets ici "NUGET_PACKAGES") ;
- Indiquer le chemin du cache Nuget précédemment configuré.
En plaçant cette tâche, une opération de restauration du cache sera faite à l'emplacement où vous l'avez placée dans la liste des tâches et une opération de sauvegarde sera automatiquement ajoutée à la fin de la build en cas de réussite. Attention, sur de gros projets, la restauration du cache peut elle-même prendre du temps (40 secondes pour 1Go environ sur l'exemple ci-dessous).
Il ne reste plus qu'à exécuter votre build : la première fois servira à "remplir" le cache qui sera alors utilisé par les builds suivantes.
Honnêtement je n'ai vu que très peu d'améliorations avec Nuget.... J'ai donc décidé d'essayer le même système mais pour le cache NPM.
Cache NPM
Cette fois-ci les résultats sont un peu meilleurs même s'il faut prendre en compte que la tâche de restauration du cache prends du temps elle même.
Happy coding !
Commentaires