当前位置: 首页 > 知识库问答 >
问题:

无法在Jenkins管道作业中通过DSL(groovy)存储sh命令输出

狄法
2023-03-14

我想在管道Jenkins作业中获得最后的构建输出,并在电子邮件中附加(使用emailext插件)。Curl工作正常,并提供适当的构建输出,但我无法将其存储在变量中以附加到电子邮件中。我用的是詹金斯的最新版本。

我可以看到,对于简单的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

共有1个答案

宇文梓
2023-03-14

看起来您缺少运行脚本的内部数组和一些双引号和转义双引号:

sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim()

还有多种方法可以执行shell脚本,这取决于您使用的jenkins管道的类型。

在jenkins声明性管道中,需要包含一个脚本{…} 阻止所有脚本类型代码和设置变量,如下所示:

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{}块,您实际上可以将其放在大多数地方。大多数情况下,我将其放在阶段块阶段('某个阶段'){...}中,我是这样做的:

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
)

作为参考,回音vars在两个

 sh([script: "echo \"Value: ${someVariable}\""])

希望此文档也能有所帮助,但我知道最近Jenkins文档可能会非常零散,所以我还找到了一个关于如何不为Jenkins声明性管道执行操作的要点。祝你好运

 类似资料:
  • 问题内容: 我想在管道Jenkins作业中获取最后的构建输出,并附加到电子邮件中(使用emailext插件)。卷毛工作正常,并提供适当的构建输出,但我不能存储在变量中以附加到电子邮件中。我正在使用最新的詹金斯版本。 我可以看到有几个简单的sh命令的相关文章,但不适用于curl响应存储。 1。 2。 3。 问题答案: 看起来您缺少内部数组和一些双引号,并且在运行脚本时转义了双引号: 另外,有多种方法

  • 我正在编写一个Groovy脚本,其中包含部署terraform的作业。我正在使用作业DSL并使种子作业由JCasC实现,一切正常。然后我有一个包含作业的Groovy文件的存储库。 如果我将Groovy文件保持为单个作业,它就可以正常工作。 然而,我希望能够构建具有构建阶段的管道。我知道我可以把管道写在詹金斯文件中 我有这个作为开始: 但是,我看到了这个错误: 我已经尝试了各种方法,并阅读了一堆文档

  • 我有一个管道(jenkins)工作,它使用多个存储库。 存储库是这样签出的: 现在,我想在对任何存储库进行提交时触发该作业。如何配置?

  • Jenkins控制台日志:(得到异常:由用户Edgar Yu启动,运行在耐久性级别:MAX_SURVIVABILITY[Pipeline]节点,在/var/Jenkins_home/workspace/test2[Pipeline]{[Pipeline]stage[Pipeline]{(Build)[Pipeline]echo Building..[Pipeline]echo Jenkins [管

  • 问题内容: 例如: 我会得到: 因此,显然我得到的是退出代码,而不是标准输出。是否有可能将stdout捕获到管道变量中,这样我就可以得到: 作为结果? 问题答案: 现在,该步骤通过提供参数来支持返回 stdout。 请参阅此示例。

  • 例如: 我将获得: 所以,显然我得到的是退出代码,而不是标准输出。是否可以将标准输出捕获到管道变量中,这样我就可以得到:?