stdout is null when executing a command from a shared library

38 views
Skip to first unread message

Francis Pereira

unread,
Jun 14, 2017, 5:36:34 AM6/14/17
to Jenkins Users
When executing commands from a shared library, stdout is always null. How do I get an handle on it ? This only happens when calling the shared library from a pipeline. If I run it in the 'Script Console' (with modification to make it execute), I get content from stdout. 

Example:

Shared library:

// CodeDeploy.groovy
class CodeDeploy {

    Script script

    def executeOnShell(String... command) {
        script.println "About to execute: " + command
        def process = new ProcessBuilder(command)
        process.redirectOutput()
        process.redirectErrorStream(true)
        def shell = process.start()
        InputStream shellIn = shell.getInputStream()
        BufferedReader reader = new BufferedReader(new InputStreamReader(shellIn))
        StringBuilder builder = new StringBuilder()
        String line = null;
        shell.waitFor()
        while ((line = reader.readLine()) != null) {
            builder.append(line);
            builder.append("\n");
        }


        script.println('Output from command: ' + builder.toString())

        int shellExitStatus = shell.exitValue();
        script.println('Exit value: ' + shellExitStatus)

        return builder.toString();
    }
}

Pipeline Usage:
//Jenkinsfile

@Library('jenkins-pipeline-libraries')
import com.wizrocket.jenkins.CodeDeploy

pipeline {

    agent any

    options {
        timestamps()
        buildDiscarder(logRotator(numToKeepStr: '9999'))
        disableConcurrentBuilds()
        timeout(time: 1, unit: 'HOURS')
    }

    stages {
        stage('lost output') {
            steps {
                script {
                    CodeDeploy cd = new CodeDeploy(script: this)
                    cd.executeOnShell('time', 'sleep', '10')
                }
            }
        }
    }

    post {
        always {
            deleteDir()
            echo 'I will always say Hello again!'
        }
    }
}

Output:

[Pipeline] }
[Pipeline] // stage
[Pipeline] timestamps
[Pipeline] {
[Pipeline] timeout
14:00:49 Timeout set to expire in 1 hr 0 min
[Pipeline] {
[Pipeline] stage
[Pipeline] { (lost output)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
14:00:49 About to execute: [time, sleep, 10]
[Pipeline] echo
14:00:59 Output from command: 
[Pipeline] echo
14:00:59 Exit value: 0
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] deleteDir
[Pipeline] echo
14:00:59 I will always say Hello again!
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // timeout
[Pipeline] }
[Pipeline] // timestamps
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS


Reply all
Reply to author
Forward
0 new messages