1. 概述

Jenkins 流水线(Pipeline)是自动化软件开发流程的有力工具,广泛用于构建、测试、分发、发布和部署应用。除了这些基础功能,Jenkins 流水线还支持构建可重复、可扩展的流程,并能根据开发需求灵活调整。

在本教程中,我们将讨论如何在 Jenkins 流水线中执行 Shell 命令并获取其输出结果,这对于自动化流程中的条件判断、日志记录和后续处理非常关键。


2. 获取 Shell 输出的重要性

Shell 命令是 Jenkins 流水线中非常强大的功能之一,允许我们在流水线脚本中运行 Shell 脚本。Jenkins 代理会执行这些命令,并将输出打印到 Jenkins 控制台日志中。

如果我们能将 Shell 命令的输出保存到变量中,就可以在后续步骤中复用这个结果,例如作为另一个命令的输入参数,或者用于判断流程是否继续执行。


3. 使用 sh 步骤的 returnStdout 方法

Jenkins 提供了内置的 sh 步骤,允许我们执行 Shell 命令并捕获其标准输出。通过设置 returnStdout: true,我们可以将输出结果赋值给一个变量。

示例代码如下:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                script {
                    def output = sh(returnStdout: true, script: 'pwd')
                    echo "Output: ${output}"
                }
            }
        }
    }
}

✅ 说明:

  • returnStdout: true:表示返回标准输出内容
  • script: 'pwd':执行的 Shell 命令
  • output 变量将保存当前工作目录路径
  • 最后通过 echo 打印输出内容

⚠️ 注意:返回的内容通常会包含换行符,如果需要去除末尾换行,可以使用 .trim() 方法(见第 5.2 节)。


4. 使用命令替换(Command Substitution)

命令替换是 Shell 的一个特性,允许在一个命令中嵌套执行另一个命令,并将其输出作为字符串的一部分使用。在 Jenkins 流水线中,我们也可以使用这种方式来捕获命令输出。

示例代码如下:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                script {
                    def output = sh(script: "echo \$(ls)", returnStdout: true)
                    echo "Output: ${output}"
                }
            }
        }
    }
}

✅ 说明:

  • $(ls) 是 Shell 命令替换语法,表示先执行 ls,然后将其输出替换到 echo 命令中
  • Jenkins 会将整个命令的结果保存到 output 变量中

⚠️ 踩坑提醒:如果命令中包含特殊字符(如 $, ", \),建议使用转义或使用单引号包裹脚本内容,避免语法错误。


5. 其他常见用法

除了获取标准输出,我们还可以获取命令的退出状态码或对输出进行清理处理。

5.1. 使用 returnStatus 获取退出状态码

通过 returnStatus: true,可以获取 Shell 命令的退出状态码(exit status)。

示例代码如下:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                script {
                    def status = sh(returnStatus: true, script: 'ls /test')
                    if (status != 0) {
                        echo "Error: Command exited with status ${status}"
                    } else {
                        echo "Command executed successfully"
                    }
                }
            }
        }
    }
}

✅ 说明:

  • 如果 /test 目录不存在,ls 会返回非零状态码,表示出错
  • 我们可以通过判断状态码来决定后续流程是否继续执行

5.2. 使用 trim() 方法清理输出

有时候 Shell 命令输出的前后可能包含空格或换行符,我们可以使用 .trim() 方法进行清理。

示例代码如下:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                script {
                  def output = sh(returnStdout: true, script: 'echo "    hello    "').trim()
                  echo "Output: '${output}'"
                }
            }
        }
    }
}

✅ 说明:

  • trim() 会移除字符串前后的空白字符(包括空格、制表符、换行等)
  • 输出内容会更干净,方便后续处理或判断

6. 总结

本文介绍了两种在 Jenkins 流水线中获取 Shell 命令输出的方法:

方法 说明
sh(returnStdout: true) 推荐使用,语法简洁,直接获取标准输出
命令替换($(command) 适用于嵌套命令场景,但需注意转义问题

此外,我们还介绍了如何获取命令的退出状态码(returnStatus)以及如何清理输出内容(.trim())。这些技巧在构建复杂自动化流程时非常实用。

✅ 建议:优先使用 sh(returnStdout: true) 方式,结构清晰、可读性强,避免复杂的 Shell 嵌套语法带来的维护问题。


原始标题:Get the Output of a Shell Command in a Jenkins Pipeline