DevOpsAzure DevOps – Hoe houd je je agent schoon?

Azure DevOps: hoe houd je je build agents schoon?

In ons blog ‘Azure DevOps – Pipeline en Task Decorators’ legt collega Peter Barendse uit wat pipeline decorators zijn en hoe deze gerealiseerd kunnen worden. Hij benoemt dat een pipeline decorator bijvoorbeeld gebruikt kan worden om lokale build agents schoon te houden. In dit blog leg ik uit hoe je dat doet.

Azure DevOps gebruikt agents die het werk van builden, testen en deployen voor hun rekening nemen. Agents zijn virtual machines of containers met hierop de Azure DevOps Pipeline Agent geïnstalleerd. Op de agent zijn twee bestandslocaties belangrijk:

  • De work directory. Dit is de locatie waar Azure DevOps data opslaat;
  • De pipeline workspace. Dit is de locatie die onder de work directory valt en waar per pipeline job bestanden worden neerzet zoals code, artifacts, dependencies en testresultaten. Deze zijn nodig of worden geproduceerd worden tijdens het uitvoeren van de pipeline job.

De bestanden binnen de pipeline workspace blijven achter nadat een pipeline gedraaid heeft. Handig want data, zoals bijvoorbeeld dependencies, zijn zo beschikbaar voor opvolgende pipeline jobs van dezelfde pipeline wat een positief effect heeft op de uitvoertijd.

Er zijn een aantal situaties waarbij het achteraf opschonen van de Pipeline Workspace wenselijk is. Bijvoorbeeld als er agents gebruikt worden waarbij de harde schijven regelmatig vollopen en je niet wilt wachten op scheduled maintenance jobs. Een andere reden zou kunnen zijn dat het vanuit security oogpunt onwenselijk is dat er bestanden achter blijven.

Met een pipeline decorator kun je er voor zorgen dat de pipeline workspace automatisch opgeschoond wordt aan het einde van elke job binnen de gehele Azure DevOps organisatie. We hoeven hiervoor dus niet alle pipelines te wijzigen. In ons voorbeeld maken we een simpel inline bash script:

https://gist.github.com/JoostVoskuil/9c71262e21cc3fe35b3504e377a6e7f5

Bovenstaand stuk pipeline schoont in eerste instantie de speciale directories op. Dit zijn de /s /a /b en/testresults directories. Deze directories dienen te blijven bestaan omdat Azure DevOps deze kan vasthouden tijdens het uitvoeren van de job. Daarna worden alle overige directories en bestanden verwijderd.

Omdat we dit stuk pipeline willen draaien nadat alle andere taken zijn uitgevoerd van de job geven we de target ‘ms.azure-pipelines-agent-job.post-job-tasks’ mee in onze pipeline decorator, zoals uitgelegd op de pagina van Microsoft ‘Author a pipeline decorator’

https://gist.github.com/JoostVoskuil/00615a9d7095dde464c97f62b4edda07

Nu zal dit in de meeste gevallen correct werken echter zijn er tasks die een post-job-executor hebben. Een voorbeeld is hiervan de Cache task van Microsoft. Deze wordt gebruikt om dependencies te cachen. Indien je deze task in je pipeline toevoegt zal deze task op twee plaatsen worden uitgevoerd. Eén keer op de plaats waar je deze hebt toegevoegd in de pipeline om de cache op te halen. De andere als zogenaamde post-job task om de cache te uploaden. De laatste wordt als laatste taak uitgevoerd van de job en daar gaat onze pipeline decorator de mist in. Onze ‘clean workspace’ task wordt uitgevoerd vóór de cache task waardoor de cache niet meer opgebouwd kan worden want deze is immers al leeggemaakt.

Azure DevOps – Hoe houd je je agent schoon?Het blijkt dat Azure DevOps de target ‘ms.azure-pipelines-agent-job.post-job-tasks’ uitvoert vóór de tasks met een post-job-executor’ wat in deze situatie onwenselijk is.

We kunnen dit oplossen door gebruik te maken van Jesse Houwings extension ‘Pre and post script tasks’. Jesse heeft de standaard Bash en Powershell tasks van Microsoft aangepast en de mogelijkheid gemaakt om deze in te zetten als Pre-job & Post-job executors tasks.

 

Met Jesse’s tasks ziet onze cleanup pipeline ziet er zo uit:

https://gist.github.com/JoostVoskuil/4a51c8de5c9c56ada65d7a494b331b2e

Azure DevOps – Hoe houd je je agent schoon?Azure DevOps zal de volgorde van de tasks binnen de Post-Job executor in omgekeerde volgorde uitvoeren waarmee deze zijn toegevoegd in de pipeline. De post-job task die als eerste is toegevoegd is zal als laatste uitgevoerd worden.

Om te garanderen dat onze cleanup task als allerlaatste wordt uitgevoerd, dienen we deze dus als eerste te injecteren in de pipeline. Ondanks dat dit tegenstrijdig voelt, kunnen we dit realiseren door de target ‘ms.azure-pipelines-agent-job.pre-job-tasks’ mee te geven in onze pipeline decorator.

 

https://gist.github.com/JoostVoskuil/cbf8fe1cb4ef07825d3ce870f705485c

Met deze decorator zorgen we na elke pipeline job voor een schone workspace en hebben we de garantie ingebouwd dat deze altijd als laatste wordt uitgevoerd. De volgorde waarmee de decorator wordt uitgevoerd is te beïnvloeden door post-job-executor tasks te gebruiken.

Joost Voskuil, DevOps Consultant

  • Wil jij ook werken aan een Modern Ontwikkelproces bij klanten? Bekijk vacatures!