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.

Vus : 29
Publié par Simon Vieille : 124