How to disable command output in jenkins pipeline

2020-05-24 20:27发布

问题:

I am using Jenkinsfile for scripting of a pipeline.

Is there any way to disable printing of executed shell commands in build logs?

Here is just a simple example of a jenkins pipeline:

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

which produces the following output in console log:

[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

Basically I would like to disable printing of the commands itself.

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

回答1:

By default Jenkins starts shell scripts with flags -xe. -x enables additional logging. -e makes the script exit if any command inside returns non-zero exit status. To reset a flag I'd suggest two options:

  1. Call set +x in the body of your script.
  2. Pass custom shebang line without -x: sh('#!/bin/sh -e\n' + 'echo shellscript.sh arg1 arg2')

As for the second option you can define a wrapper function for convenience which will prepend the script with custom shebang and then call sh

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


回答2:

For instances where post processing is required. I extended the original solution provided here.

For example

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

wrapper function

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

The shell output is returned to trim() and saved to "output"