我在Jenkinsfile (Groovy)上有类似的东西,我想在一个变量中记录标准输出和退出码,以便以后使用这些信息。

sh "ls -l"

我该如何做到这一点呢,特别是当您似乎无法在Jenkinsfile中真正运行任何类型的groovy代码时?


当前回答

最新版本的管道sh步骤允许您执行以下操作;

// Git committer email
GIT_COMMIT_EMAIL = sh (
    script: 'git --no-pager show -s --format=\'%ae\'',
    returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"

另一个特性是returnStatus选项。

// Test commit message for flags
BUILD_FULL = sh (
    script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
    returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"

这些选项是根据此问题添加的。

sh命令请参见官方文档。

对于声明式管道(见注释),你需要将代码包装到脚本步骤:

script {
   GIT_COMMIT_EMAIL = sh (
        script: 'git --no-pager show -s --format=\'%ae\'',
        returnStdout: true
    ).trim()
    echo "Git committer email: ${GIT_COMMIT_EMAIL}"
}

其他回答

最简单的方法就是用这种方法

my_var = '回声2》 echo $ my_var 输出 : 2

注意不是简单的单引号是反引号(')。

简单的回答是:

sh "ls -l > commandResult"
result = readFile('commandResult').trim()

我认为存在一个特性请求能够得到sh步骤的结果,但据我所知,目前没有其他选择。

编辑:詹金斯- 26133

EDIT2:不太确定从哪个版本开始,但是sh/bat步骤现在可以返回std输出,简单地说:

def output = sh returnStdout: true, script: 'ls -l'

最新版本的管道sh步骤允许您执行以下操作;

// Git committer email
GIT_COMMIT_EMAIL = sh (
    script: 'git --no-pager show -s --format=\'%ae\'',
    returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"

另一个特性是returnStatus选项。

// Test commit message for flags
BUILD_FULL = sh (
    script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
    returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"

这些选项是根据此问题添加的。

sh命令请参见官方文档。

对于声明式管道(见注释),你需要将代码包装到脚本步骤:

script {
   GIT_COMMIT_EMAIL = sh (
        script: 'git --no-pager show -s --format=\'%ae\'',
        returnStdout: true
    ).trim()
    echo "Git committer email: ${GIT_COMMIT_EMAIL}"
}

如果你没有一个sh命令而是一个sh命令块,那么returnstdout将不起作用。

我有一个类似的问题,我应用了一些东西,这不是一个干净的方式,但最终它工作了,并达到了目的。

解决方案- 在shell块中,回显该值并将其添加到某个文件中。 在shell块之外和脚本块内部,读取这个文件,修剪它并将其分配给任何本地/params/环境变量。

的例子,

steps {
     script {
            sh '''
               echo $PATH>path.txt
               // I am using '>' because I want to create a new file every time to get the newest value of PATH
            '''
            path = readFile(file: 'path.txt')
            path = path.trim() //local groovy variable assignment

            //One  can assign these values to env and params as below  - 
            env.PATH = path  //if you want to assign it to env var
            params.PATH  = path //if you want to assign it to params var


     }
}

对于那些需要在后续shell命令中使用输出的人,而不是groovy,可以像这样做:

    stage('Show Files') {
        environment {
          MY_FILES = sh(script: 'cd mydir && ls -l', returnStdout: true)
        }
        steps {
          sh '''
            echo "$MY_FILES"
          '''
        }
    }

我发现code maven上的示例非常有用。