如何在Jenkins奴隶的脚本控制台中使用groovy运行python命令?

时间:2015-12-31 03:26:09

标签: python jenkins groovy

我需要在Jenkins的一个从属脚本控制台上运行像python -c "print('hello')"那样简单的任意操作。这是我正在尝试的:

def cmd = 'python -c "print(\'hello\')"'
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = cmd.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout\nerr> $serr"

然而,获得空输出:

out> 
err> 

有没有办法在Groovy中获取python的输出?

3 个答案:

答案 0 :(得分:4)

尝试将命令分成数组

def cmdArray = ["python", "-c", "print('hello')"]
def cmd = cmdArray.execute()
cmd.waitForOrKill(1000)
println cmd.text

不确定为什么你的版本不起作用。

答案 1 :(得分:3)

这对我来说很完美:

def cmd = 'python -c "print(\'hello\')"'
def proc = cmd.execute()
proc.waitFor()
println "return code: ${ proc.exitValue()}"
println "stderr: ${proc.err.text}"
println "stdout: ${proc.in.text}"

使用"执行Groovy脚本" (不是"执行系统groovy脚本")

答案 2 :(得分:1)

时髦地执行shell和python命令

要在上面提供的答案中添加一个更重要的信息,就是考虑为 python cmd或执行脚本的脚本stdoutstderr

Groovy 添加了execute方法以使执行Shell变得相当容易,例如,例如: python -c cmd:

groovy:000> "python -c print('hello_world')".execute()
===> java.lang.UNIXProcess@2f62ea70

但是,如果您想获得与cmd 标准输出String)相关的stdout和/或标准错误({ {1}}),那么使用上面引用的代码将没有结果输出

因此,为了获得Groovy exec进程的 cmd输出,请始终尝试使用:

stderr

而不是

String bashCmd = "python -c print('hello_world')"
def proc = bashCmd.execute()
def cmdOtputStream = new StringBuffer()
proc.waitForProcessOutput(cmdOtputStream, System.err)
print cmdOtputStream.toString()

通过这种方式,我们在Groovy中执行命令后捕获了输出,因为后者是阻塞调用(check ref for reason)。

带有def cmdOtputStream = proc.in.text print cmdOtputStream.toString() 函数的完整示例

executeBashCommand

输出

String bashCmd1 = "python -c print('hello_world')"
println "bashCmd1: ${bashCmd1}"
String bashCmdStdOut = executeBashCommand(bashCmd1)
print "[DEBUG] cmd output: ${bashCmdStdOut}\n"


String bashCmd2 = "sh aws_route53_tests_int.sh"
println "bashCmd2: ${bashCmd2}"
bashCmdStdOut = executeBashCommand(bashCmd2)
print "[DEBUG] cmd output: ${bashCmdStdOut}\n"

def static executeBashCommand(shCmd){
    def proc = shCmd.execute()
    def outputStream = new StringBuffer()
    proc.waitForProcessOutput(outputStream, System.err)
    return outputStream.toString().trim()
}

注意1::如上面的代码(bashCmd1: python -c print('hello_world') [DEBUG] cmd output: hello_world bashCmd2: sh aws_route53_tests_int.sh [DEBUG] cmd output: hello world script )中所示,对于更复杂的python脚本,您应通过bashCmd2 bash shell脚本执行它。

注意2:所有示例均已在

下进行了测试
.sh