web-dev-qa-db-fra.com

Faire fonctionner les modèles de script e-mail avec le pipeline Jenkins

J'ai récemment converti en Jenkins 2.x et j'expérimente avec le flux de pipeline, mais je n'arrive pas à faire fonctionner le plug-in e-mail avec des modèles de script groovy. Bien que mon flux standard fonctionne toujours correctement, si j'essaie ce qui suit, j'obtiens une erreur avec un jeton inattendu SCRIPT

    emailext mimeType: 'text/html', replyTo: 'xxxx', subject: "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${env.BUILD_STATUS}", to: 'xxxx', body: "${SCRIPT, template='regressionfailed.groovy'}"

Je sais qu'il y a eu des problèmes avec l'expansion des jetons dès le début, mais il semble que les dernières mises à jour du wiki aient été corrigées. Je n'ai également toujours aucune extension de jeton pour aucun jeton. Existe-t-il une bonne référence pour que cela fonctionne à nouveau? Je voudrais passer au flux de pipeline, mais le modèle d'e-mail avec extension de jeton est essentiel pour que le flux fonctionne.

18
naven87

Il n'y a aucun problème à utiliser emailext dans le pipeline déclaratif. Mais votre script ne pourra pas accéder correctement au paramètre "build.result" car il n'est pas encore terminé. Comme dans le script par défaut groovy-html.template.

Modifier: En fait, vous pouvez accéder à build.result si vous le définissez manuellement vous-même.

Il est donc préférable d'ajouter une étape à la fin du pipeline déclaratif comme ceci:

stage('Send email') {
    def mailRecipients = "[email protected]"
    def jobName = currentBuild.fullDisplayName

    emailext body: '''${SCRIPT, template="groovy-html.template"}''',
        mimeType: 'text/html',
        subject: "[Jenkins] ${jobName}",
        to: "${mailRecipients}",
        replyTo: "${mailRecipients}",
        recipientProviders: [[$class: 'CulpritsRecipientProvider']]
}

Notez également que si vous utilisez votre propre script, vous ne pouvez pas le nommer "groovy-html.template" ou "groovy-text.template" car ils sont par défaut d'emailext (donc le fichier ne sera même pas accessible). Voir "Contenu du script" ici .

21
user3360767

Face au même problème aujourd'hui, avoir apparemment le corps défini avant l'e-mail semble faire l'affaire:

def emailBody = '${SCRIPT, template="regressionfailed.groovy"}'
def emailSubject = "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${env.BUILD_STATUS}"
emailext(mimeType: 'text/html', replyTo: 'xxxx', subject: emailSubject, to: 'xxxx', body: emailBody)

N'oubliez pas que vous devrez peut-être refaire des parties de votre modèle.

5
Martin

Apparemment, tout le monde le sait. Il existe 2 façons de définir un pipeline: pipeline déclaratif (commencer par 'pipeline') et pipeline scripté (commencer par 'node')

En utilisant le pipeline déclaratif, il faut spécifier le script pour exécuter une procédure, c'est-à-dire utiliser def pour définir les variables. Donc, dans le cas d'un pipeline:

stage('Email') {
    steps {
        script {
            def mailRecipients = '[email protected]'
            def jobName = currentBuild.fullDisplayName
            emailext body: '''${SCRIPT, template="groovy-html.template"}''',
            mimeType: 'text/html',
            subject: "[Jenkins] ${jobName}",
            to: "${mailRecipients}",
            replyTo: "${mailRecipients}",
            recipientProviders: [[$class: 'CulpritsRecipientProvider']]
        }
    }
}

J'ai passé un peu de temps pour ça, j'espère que c'est utile pour quelqu'un d'autre.

4
Daniele Cruciani