# Woodpecker CI, envoyer du mail dans certaines conditions * 2023-01-04 22:40:00 * Développement, Projets personnels En juin dernier, j'ai migré ma plateforme d'intégration continue vers => https://woodpecker-ci.org/ Woodpecker CI et j'en suis très satisfait. => https://woodpecker-ci.org/ 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`. ```{.language-yaml} 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 => https://github.com/drillster/drone-email drillster/drone-email , initialement destinée à => https://www.drone.io/ Drone . En combinant cette image et `evaluate`, je pensais pouvoir réaliser ce que je voulais : ```{.language-yaml} 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é => https://github.com/drillster/drone-email drillster/drone-email pour créer => https://gitnet.fr/deblan/woodpecker-email deblan/woodpecker-email . Cette image est totalement orientée vers => https://woodpecker-ci.org/ 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é. ```{.language-yaml} 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 => https://gitnet.fr/deblan/woodpecker-email Gitnet et l'image est à la fois publiée sur => https://hub.docker.com/r/deblan/woodpecker-email Docker Hub et => https://gitnet.fr/deblan/-/packages/container/woodpecker-email/latest Gitnet .