Jenkins Groovy脚本执行shell命令

时间:2017-09-29 08:11:47

标签: bash shell jenkins groovy graphite

我正在使用一个groovy脚本来计算我的构建持续时间并将度量标准发布到Hosted Graphite,从命令行开始,以下curl将产生意图效果:

echo {someMetricHere} | nc carbon.hostedgraphite.com 2003

然而,在我的groovy脚本中,生成度量标准的最后一步是运行以下内容:

"echo "+ metric +" | nc carbon.hostedgraphite.com 2003".execute()

它回归:

抓到:java.io.IOException:无法运行程序“|”:error = 20,不是目录 java.io.IOException:无法运行程序“|”:error = 20,不是目录     在hudson8814765985646265134.run(hudson8814765985646265134.groovy:27) 引起:java.io.IOException:error = 20,不是目录     ......还有1个

我假设命令不理解“|”命令的一部分,任何建议我如何修复此脚本以运行预期的bash?我认为有可能在工作区中创建.sh文件,但我不确定如何。

希望查看完整脚本的人使用Pastebin:https://pastebin.com/izaXVucF

干杯:)

4 个答案:

答案 0 :(得分:4)

使用管道|试试这段代码:

// this command line definitely works under linux:
def cmd = ['/bin/sh',  '-c',  'echo "12345" | grep "23"']
// this one should work for you:
// def cmd = ['/bin/sh',  '-c',  'echo "${metric}" | nc carbon.hostedgraphite.com 2003']

cmd.execute().with{
    def output = new StringWriter()
    def error = new StringWriter()
    //wait for process ended and catch stderr and stdout.
    it.waitForProcessOutput(output, error)
    //check there is no error
    println "error=$error"
    println "output=$output"
    println "code=${it.exitValue()}"
}

输出:

error=
output=12345
code=0

答案 1 :(得分:1)

实现此目的的更简单方法是使用Jenkins Job DSL。它具有shell命令,可以在给定的step内发出。例如:

// execute echo command
job('example-1') {
    steps {
        shell('echo Hello World!')
    }
}

// read file from workspace
job('example-2') {
    steps {
        shell(readFileFromWorkspace('build.sh'))
    }
}

您可以找到参考here

答案 2 :(得分:1)

我认为你所做的连接有问题。

此代码应该有效:

"echo ${metric} | nc carbon.hostedgraphite.com 2003".execute()

答案 3 :(得分:0)

如果必须将变量传递到常规脚本,则可以使用${variableName}来完成。双引号不会像您认为的那样被解释,并且每个编译器都会以一种奇怪的方式对待它。

根据您的情况,以下内容应有助于您完成所需的操作:

sh "echo ${metric} | nc carbon.hostedgraphite.com 2003"