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 嵌套语法带来的维护问题。