看起来您缺少内部数组和一些双引号以及用于运行脚本的转义双引号:
sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim()
此外,还有多种方法可以执行 shell 脚本,这取决于詹金斯管道的类型您正在使用。
In a 詹金斯声明式管道 https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline你需要包括一个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: '[email protected] /cdn-cgi/l/email-protection',
subject: "You have mail - ${EMAIL_TEXT}",
body: """${NOTIFIER_BULD_NAME} - ${EMAIL_TEXT}:
...
${BODY}
""",
attachLog: false
)
}
}
}
In a Jenkins 脚本化管道 https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline,你不需要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
)
作为参考,回显变量在两个中看起来都是这样的
sh([script: "echo \"Value: ${someVariable}\""])
希望本文档 https://jenkins.io/doc/book/pipeline/jenkinsfile/#working-with-the-environment也有一点帮助,但我知道最近 Jenkins 文档可能非常参差不齐,所以我还发现关于如何不为 Jenkins 声明性管道做事的重要要点 https://gist.github.com/katcaola/2f18350ee66e0a3b2feb57a2992643c3。祝你好运!