2017-10-09 3 views
0

Pas beaucoup d'expérience de programmation mais heureux d'apprendre. Question: L'envoi de données d'erreur de construction jenkinsfile à la plupart des travaux fonctionne très bien localement dans le fichier, mais lorsqu'il est chargé en tant que script .groovy, il échoue "silencieusement". Des conseils sur pourquoi/comment je peux poster cette information à une chaîne dans un script groovy chargé?jenkinsfile chargement des variables locales dans le script groovy

Jenkinsfile

#!groovy 
properties([[$class: 'jenkins.model.BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '5', artifactNumToKeepStr: '5']]]) 

node('node_name'){ 

    def err = null 
    currentBuild.result = "SUCCESS" 
    role_name = "deploy" 

    try { 
     timeout(60){ 
      stage "${role_name}" 
       deleteDir() 
       checkout scm 
       sh 'introduce error here' 
     } 
    } 
    catch (error){ 
     err = error 
     currentBuild.result = "FAILURE" 
     load "ci/curlBuildFailed.groovy" 
    } 
    finally { 
     if (err){ 
      throw err 
     } 
    } 
} 

curlBuildFailed.groovy

sh "curl -i -X POST -d \'payload={" + 
"\"text\": \"${env.JOB_NAME}: ${env.BUILD_URL} - build failed with ${err}!\", " + 
"\"username\": \"JenkinsBot\", " + 
"\"icon_url\": \"$FAIL_BUILD\"}\' $DEVOPS_NOTIFY_URL " 

L'exécution du produit ci-dessus ceci:

[cure-deploy] Running shell script 
+ introduce error here 
/home/jenkins/remote/workspace/blablabla/script.sh: line 2: introduce: command not found 
[Pipeline] } 
[Pipeline] // dir 
[Pipeline] } 
[Pipeline] // timeout 
[Pipeline] load 
[Pipeline] { (ci/curlBuildFailed.groovy) 
[Pipeline] } 
[Pipeline] // load 
[Pipeline] } 
[Pipeline] // wrap 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] } 
[Pipeline] // load 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] End of Pipeline 
ERROR: script returned exit code 127 
Finished: FAILURE 

Notes:

  • La suppression du contenu de curlBuildFailed.groovy dans le même emplacement comme load "ci/curlBuildFailed.groovy" crée la sortie souhaitée.
  • Avoir réduit le coupable à ${err} en curlBuildFailed.groovy, dès que je supprime cette variable, il publie à peine très bien.
  • (Nous avons environ 30 rôles ansible similaires à celui-ci afin d'essayer de faire abstraction du code en double à une structure plus facile à maintenir)
  • J'ai cherché autour pendant quelques heures et il semble similaire à ceux-ci, mais je n'avais pas trouvé une résolution d'équations encore:
  • jenkins plain catch blocks
  • don't think I need a 'returns this;' but who knows
  • Passing Variables in Jenkinsfile Closure

Merci pour votre temps! - Sam

Répondre

0

Vous n'avez pas besoin d'utiliser le script groovy pour envoyer un message à Mattermost. Il y a un plugin Jenkins qui vous aide à envoyer des messages de notification à Mattermost. Vous pouvez suivre ce lien: https://github.com/jenkinsci/mattermost-plugin

Après l'installation et la configuration, vous pouvez utiliser le mattermostSend pour envoyer une notification.

alors votre pipeline sera semblable à ceci:

node('node_name') {def err = null 
    currentBuild.result = "SUCCESS" 
    role_name = "deploy" 

    try { 
     timeout(60){ 
      stage "${role_name}" 
       deleteDir() 
       checkout scm 
       sh 'introduce error here' 
     } 
    } 
    catch (error){ 
     err = error 
     currentBuild.result = "FAILURE" 
     mattermostSend color: 'danger', message: 'Message from Jenkins Pipeline', text: \"${env.JOB_NAME}: ${env.BUILD_URL} - build failed with ${err}!\" 
    } 
    finally { 
     if (err){ 
      throw err 
     } 
    } 
}