Jenkins将shell输出保存到变量

6

我想要检查一个文件的md5sum并将结果存储到一个变量中,然后检查该变量以标记其是否正常,如果不正常则失败构建。

我该如何将md5checksum的结果保存到Jenkins中可以检查的变量中。

我之前找到了这篇文章,但它似乎无法正常工作。每当我尝试运行脚本时,都会从Jenkins中收到错误信息。

md5Check = sh( script: 'md5sum -c ${env.SSH_HOME}/MD5SUM.MD5', returnStdout: true ).trim()
sh "sudo ssh -i ${env.SSH_KEY} ${env.SSH_URL} -tt \"cd ${env.SSH_HOME}/; echo ${md5Check}\""

它根本不喜欢第一行。还有其他方式可以做到这一点吗?

错误:

WorkflowScript: 44: Expected a step @ line 44, column 17.
               md5Check = sh "sudo ssh -i ${env.SSH_KEY} 
${env.SSH_URL} -tt \"cd ${env.SSH_HOME}/; md5sum -c 
${env.SSH_HOME}/MD5SUM.MD5;\""
               ^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)

更新:

我已经通过下面提供的两个答案来解决问题,但现在sh命令是在Jenkins端运行,而不是通过ssh。

我还发现我需要将代码封装在脚本和节点中才能运行该脚本。

script{
    node(){
        unstash 'build'
        env.FAIL=sh([script: "md5sum -c ${env.SSH_HOME}/MD5SUM.MD5", returnStdout: true ]).trim()
        sh "sudo ssh -i ${env.SSH_KEY} ${env.SSH_URL} -tt \"cd ${env.SSH_HOME}/; echo ${env.FAIL}\""
    }
}

使用echo ${env.FAIL}时,现在调用了正确的命令,但无法找到该文件,因为我认为它是在Jenkins shell而不是ssh中运行。

更新2

好的,如果我将ssh内容移动到已定义的脚本中,然后只从Jenkins shell调用echo,它会正确地在远程服务器上找到该文件。这是我使用的最终代码。

script{
    node(){
        unstash 'build'
        env.FAIL=sh([script: "sudo ssh -i ${env.SSH_KEY} ${env.SSH_URL} -tt \"cd ${env.SSH_HOME}/; md5sum -c ${env.SSH_HOME}/MD5SUM.MD5\"", returnStdout: true ]).trim()
        sh "sudo echo ${env.FAIL}"
     }
}
2个回答

5

看起来你缺少了运行脚本的内部数组:

sh([ script: 'md5sum -c ${env.SSH_HOME}/MD5SUM.MD5', returnStdout: true ]).trim()

每当我在Jenkins scripted pipeline中使用脚本设置变量时,我会像这样操作:
env.V5_DIR = WORKSPACE + '/' + sh([script: "basename ${V5_GIT_URL} .git", returnStdout: true]).trim()

这让我解决了错误,但问题现在是它似乎在本地运行命令而不是通过ssh。因此,我会得到一个文件未找到的异常。 - Derek Lawrence
你可以将ssh命令放入一个单独的脚本文件中,然后通过sh ./myScript.sh命令调用该脚本。如果你需要从脚本中获取输出,可以尝试使用类似于env.FAIL=$(sh ./myScript.sh)的方式。此外,如果密钥和ssh url是敏感信息,你是否考虑将它们放入Jenkins的凭据中? - Wimateeka

2

我想知道您的问题是否是因为在第一行中使用了单引号而不是双引号来引用变量。例如,请尝试:

md5Check = sh( script: "md5sum -c ${env.SSH_HOME}/MD5SUM.MD5", returnStdout: true ).trim()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接