如何在jenkins管道构建日志中禁用命令输出

时间:2016-10-06 09:06:34

标签: jenkins jenkins-pipeline jenkinsfile

我使用Jenkinsfile编写管道脚本。

有没有办法在构建日志中禁用已执行的shell命令的打印?

以下是jenkins管道的一个简单示例:

node{
  stage ("Example") {
    sh('echo shellscript.sh arg1 arg2')
    sh('echo shellscript.sh arg3 arg4')        
  }
}

在控制台日志中生成以下输出:

[Pipeline] node
Running on master in /var/lib/jenkins/workspace/testpipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
[testpipeline] Running shell script
+ echo shellscript.sh arg1 arg2  
shellscript.sh arg1 arg2
[Pipeline] sh
[testpipeline] Running shell script
+ echo shellscript.sh arg3 arg4
shellscript.sh arg3 arg4
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

基本上我想禁用命令本身的打印。

+ echo shellscript.sh arg1 arg2
+ echo shellscript.sh arg3 arg4

2 个答案:

答案 0 :(得分:38)

默认情况下,Jenkins使用标记-xe启动shell脚本。 -x启用其他日志记录。如果任何内部命令返回非零退出状态,则-e使脚本退出。要重置标记,我建议两个选项:

  1. 在脚本正文中调用set +x
  2. 通过自定义shebang行而不-xsh('#!/bin/sh -e\n' + 'echo shellscript.sh arg1 arg2')
  3. 对于第二个选项,您可以为方便起见定义包装函数,该函数将使用自定义shebang添加脚本,然后调用sh

    def mysh(cmd) {
        sh('#!/bin/sh -e\n' + cmd)
    }
    

答案 1 :(得分:2)

对于需要后期处理的情况。我扩展了这里提供的原始解决方案。

例如

def output = printWithNoTrace("ping -c 1 $FQDN | grep PING).trim()

包装函数

def printWithNoTrace(cmd) {
steps.sh (script: '#!/bin/sh -e\n'+ cmd,returnStdout: true)
        }

shell输出返回trim()并保存到"输出"