deblan.io-gemini/blog/posts/636.gmi
2024-01-05 22:48:52 +01:00

83 lines
3.2 KiB
Plaintext

# 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
.