Blog technique Wizaplace

Accélérez vos builds Drone CI

Par Hector Jusforgues le 25 April 2017

Chez Wizaplace nous utilisons Drone pour notre intégration continue. Comme le dit si bien Martin Fowler :

The whole point of Continuous Integration is to provide rapid feedback. Nothing sucks the blood of a CI activity more than a build that takes a long time.

Dans cet esprit, nous cherchons régulièrement à optimiser nos pipelines de CI.

Situation initiale, ou “Thirty Seconds to Github

Cloning in progress

Aujourd’hui, je vais vour parler de notre première étape : le traditionel git clone du projet.

L’objectif de cette étape est trivial : récupérer la version $DRONE_COMMIT_SHA de notre code, ainsi que le tag git éventuellement associé à ce commit.

Dans notre fichier .drone.yml, cela ressemblait à ca :

clone:
        image: plugins/git
        tags: true

Nous utilisions le plugin git par défaut, avec l’option tags: true pour récupérer les tags git.

Le problème étant que cette opération prenait entre 25 et 30 secondes pour chaque build :

git clone

Un clone complet du projet est réalisé, en partant de zéro.

L’optimisation, ou “Let go of your gitly tether

Enter the void

L’optimisation commence par une prise de conscience : toutes nos étapes suivantes n’ont pas besoin d’un repo git (qui contient l’historique complet des commits).

Tout ce qui nous intéresse est le code source à un commit précis. Pour ce qui est du tag, Drone le fournit en fait sous forme de variable d’environnement $DRONE_TAG.

Git sait très bien fournir des snapshots d’un commit. Github permet d’ailleurs de télécharger une archive assez facilement (à l’adresse https://github.com/your/repo/archive/$DRONE_COMMIT_SHA.zip). Mais cela n’aurait toujours pas été optimal : il faut encore télécharger l’intégralité du code à chaque fois.

Au final, nous utilisons notre propre plugin git pour Drone, disponible en open-source sur GitHub.

Il nécessite un volume Docker qui est utilisé pour stocker un bare repository.

À chaque build, seuls les nouveaux commits sont téléchargés : ce qui est considérablement plus léger qu’un clone intégral, ou même que tout notre code source.

Puis la commande git archive est utilisée pour exporter la version demandée par Drone.

Le plugin s’utilise très simplement comme ceci :

    clone:
        image: wizaplace/drone-ci-git
        volumes:
            - /data/gitBareRepo:/bareRepo

Les résultats, ou “Great Success

We did it

git fetch & git archive

Notre nouvelle étape ne prend désormais plus qu’une seule seconde et consomme moins de bande passante.

Gagner une vingtaine de secondes peut sembler négligeable, mais il faut bien voir que cela s’accumule : nous effectuons plusieurs centaines de builds par jour, et cela avec un nombre limité de workers. Si votre build est vingtième dans la file, ces vingt secondes gagnées peuvent par exemple devenir plus de six minutes d’attente en moins.