我想在管道Jenkins作业中获取最后的构建输出,并附加到电子邮件中(使用emailext插件)。卷毛工作正常,并提供适当的构建输出,但我不能存储在变量中以附加到电子邮件中。我正在使用最新的詹金斯版本。
我可以看到有几个简单的sh命令的相关文章,但不适用于curl响应存储。
1。
def consoleOutput = sh(returnStdout: true, script: 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + 'myJob/lastBuild/consoleText').trim() echo consoleOutput
2。
sh 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + "${env.JOB_NAME}" + '/lastBuild/consoleText; echo $? > status' def consoleOutput = readFile('status').trim()
3。
def consoleOutput = sh(script: 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + '/myJob/lastBuild/consoleText', returnStatus: true).split("\r?\n") echo consoleOutput
看起来您缺少内部数组和一些双引号,并且在运行脚本时转义了双引号:
sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim()
另外,有多种方法可以执行Shell脚本,这取决于您使用 的jenkins管道 的 类型 。
在jenkins声明性管道中,您需要script {...}为所有脚本类型代码和设置变量包括一个块,其看起来像这样:
script {...}
pipeline { agent { ... } parameters { ... } environment { ... } stages { stage('Run Required Scripts') { steps { ... script { NOTIFIER_BULD_NAME = sh([script: "./getNotifier.sh", returnStdout: true]).trim() EMAIL_TEXT = sh([script: "./printEmailText.sh ${CURRENT_BUILD} ${PREVIOUS_BUILD}", returnStdout: true]).trim() BODY= sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim() } } } stage('Send Email') { when { expression { // Only send when there is text. "${EMAIL_TEXT}" != ""; } } steps{ emailext ( to: 'software@company.com', subject: "You have mail - ${EMAIL_TEXT}", body: """${NOTIFIER_BULD_NAME} - ${EMAIL_TEXT}: ... ${BODY} """, attachLog: false ) } } }
在Jenkins脚本化管道中,您不需要script{}块,实际上可以将其放置在大多数位置。通常,我将其放在阶段块中,stage('some stage'){...}并且这样做是这样的:
script{}
stage('some stage'){...}
V5_DIR = WORKSPACE + '/' + sh([script: "basename ${V5_GIT_URL} .git", returnStdout: true]).trim()
尽管我也使用了curl命令(用于脚本化管道),并且不需要内部数组…
lastSuccessfulCommit = sh( script: "curl -sL --user ${JENKINS_API_USER}:${JENKINS_API_PSW} \"${lastSuccessfulCommitUrl}\" | sed -e 's/<[^>]*>//g'", returnStdout: true )
作为参考,两者的回显var都类似
sh([script: "echo \"Value: ${someVariable}\""])
希望该文档也能有所帮助,但是我最近知道Jenkins文档可能很参差不齐,因此我也找到了关于如何不为Jenkins Declarative管道做事的精髓。祝好运!