将命令的结果分配给声明性 Jenkinsfile 中的变量

Lon*_*rer 1 groovy jenkins jenkins-groovy jenkins-pipeline

我正在实现声明式 Jenkinsfile,我想运行 Windows 命令并将结果分配给变量。

这是我的代码:

stage('check latest commit') {
    steps {
        script{
            COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'").trim() as String
            echo "${COMMIT}"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 Jenkins 作业中收到以下日志

c:\Software\JenkinsWorkspace\workspace\TFS - XXX>c:\Software\Git\bin\git.exe log -n 1 --pretty=format:'%H' 
'656669102c187fe390a1e9d72ed47aa2d8528ad6'[Pipeline] }
[Pipeline] // script
Run Code Online (Sandbox Code Playgroud)

因此该命令按预期执行并返回 HEAD 中最新提交的哈希值。伟大的。然而:

[Pipeline] End of Pipeline
java.lang.NullPointerException: Cannot invoke method trim() on null object
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
Run Code Online (Sandbox Code Playgroud)

在运行结束时,我收到此错误。这意味着命令的结果值为null,即使命令本身产生结果。

如果我不包括修剪,例如:

stage('check latest commit') {
    steps {
        script{
            COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'")
            echo "${COMMIT}"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

日志中的以下条目显示:

[Pipeline] bat

c:\Software\JenkinsWorkspace\workspace\TFS - XXX>c:\Software\Git\bin\git.exe log -n 1 --pretty=format:'%H' 
'c77c806cdafd4f45373ef0cef8c6ff60da26611f'[Pipeline] echo
null
[Pipeline] }
Run Code Online (Sandbox Code Playgroud)

注意日志中的NULL值。这是我尝试打印 COMMIT 值的结果。

问题:当 cmd 命令返回该值时,如何正确地为变量赋值。我正在实施声明式 Jenkinsfile,现在无法返回到脚本化文件。

编辑:是的,我知道我可以以不同的方式获取提交哈希,但是,我还需要运行其他命令,并且我也需要它们的值。

Szy*_*iak 5

您执行步骤的方式bat不会返回任何输出。

COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'")
Run Code Online (Sandbox Code Playgroud)

默认行为返回null并将输出打印到控制台。如果要捕获输出,则需要将returnStdout参数设置为true

COMMIT = bat(script: "@c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'", returnStdout: true).trim()
Run Code Online (Sandbox Code Playgroud)

您可以查看官方文档页面以了解有关该bat步骤支持的所有参数的更多信息。