Woodpecker CI, envoyer du mail dans certaines conditions
En juin dernier, j'ai migré ma plateforme d'intégration continue vers Woodpecker CI et j'en suis très satisfait.
Woodpecker CI permet de créer des conditions d'exécution des étapes avec la clause evaluate
. Elle doit être définie dans la section when
des étapes concernées. Voici un exemple avec une condition sur la valeur de la variable CI_BUILD_EVENT
pour l'étape foo
.
pipeline:
foo:
image: vendor/image
when:
- evaluate: 'CI_BUILD_EVENT == "push"'
Je souhaite avoir est une notification par mail quand une étape du pipeline échoue ou dès lors que le précédent pipeline a échoué. L'idée est d'être notifié quand il y a eu un problème et quand il est résolu. L'image plus ou moins officielle pour envoyer du mail est drillster/drone-email, initialement destinée à Drone. En combinant cette image et evaluate
, je pensais pouvoir réaliser ce que je voulais :
pipeline:
mail:
image: drillster/drone-email
settings:
host:
from_secret: mail_host
username:
from_secret: mail_username
password:
from_secret: mail_password
from:
from_secret: mail_from
subject: "[{{ repo.owner }}/{{ repo.name }}] Pipeline #{{ build.number }}: {{ build.status }}"
when:
- evaluate: 'CI_STEP_STATUS == "failure" || CI_PREV_PIPELINE_STATUS == "failure"'
Le problème est que l'expression est évaluée avant la génération du pipeline donc CI_STEP_STATUS
n'existe pas encore et l'étape mail
est ignorée sauf si le précédent pipeline a échoué.
Pour résoudre mon problème, j'ai forké drillster/drone-email pour créer deblan/woodpecker-email. Cette image est totalement orientée vers Woodpecker CI et permet de définir une evaluate
au niveau de settings
. J'ai fais en sorte que l'expression soit évaluée au moment de l'exécution de l'étape et si la condition n'est pas validée alors aucun mail n'est envoyé.
pipeline:
mail:
image: deblan/woodpecker-email
settings:
host:
from_secret: mail_host
username:
from_secret: mail_username
password:
from_secret: mail_password
from:
from_secret: mail_from
subject: "[{{ repo.owner }}/{{ repo.name }}] Pipeline #{{ build.number }}: {{ build.status }}"
evaluate: 'CI_STEP_STATUS == "failure" || CI_PREV_PIPELINE_STATUS == "failure"'
when:
- status: [success, failure]
Mon problème est résolu !
Le code source est disponible sur Gitnet et l'image est à la fois publiée sur Docker Hub et Gitnet.