
在 Jenkins 的 Declarative Pipeline 中,post
是一个非常重要的 声明式语法块,用于定义在 Pipeline 或某个 stage 执行完成后,根据其执行结果自动执行的后续操作。
简单来说:
post
就是"事后处理"的逻辑,比如:无论成功还是失败,都要发送通知、归档日志、清理资源等。
一、post
的作用
post
块可以放在两个位置:
- Pipeline 级别:作用于整个 Pipeline 执行完成后
- Stage 级别:作用于某个 stage 执行完成后
它支持根据不同的构建状态来触发不同的操作,常见的状态包括:
状态 | 触发条件 |
---|---|
success |
Pipeline/stage 成功完成 |
failure |
Pipeline/stage 失败(例如编译失败、测试失败) |
unstable |
构建完成但有测试失败、静态检查警告等(如单元测试失败) |
aborted |
用户手动取消构建 |
always |
无论什么结果,都会执行 |
changed |
当前状态与上一次构建状态不同时才执行 |
二、语法结构
post {
// 根据不同状态定义要执行的操作
success {
// 构建成功时执行
}
failure {
// 构建失败时执行
}
unstable {
// 构建不稳定时执行
}
aborted {
// 构建被取消时执行
}
always {
// 总是执行
}
changed {
// 状态发生变化时执行(如从失败变成功)
}
}
三、例子中的 post
解读
post {
always {
cleanWs() // 总是清理工作空间
}
failure {
emailext(
subject: "构建失败: ${currentBuild.fullDisplayName}",
body: "扫描发现高危漏洞,请查看报告:${env.BUILD_URL}",
recipientProviders: [developers(), requestor()],
mimeType: 'text/html'
)
}
}
含义解释:
-
always { cleanWs() }
→ 无论构建成功、失败还是被取消,都会执行
cleanWs()
,即清理 Jenkins 工作区(workspace),释放磁盘空间,避免残留文件影响下次构建。 -
failure { emailext(...) }
→ 只有当整个 Pipeline 失败时(比如安全门禁触发
error
),才会发送一封邮件通知相关责任人(开发者 + 触发者)。
四、常见使用场景
场景 | 使用方式 |
---|---|
发送通知 | 邮件、企业微信、钉钉、Slack |
归档报告 | 成功时归档测试报告、安全扫描报告 |
清理资源 | 总是清理临时文件、容器、工作区 |
告警通知 | 失败时通知负责人 |
上报指标 | 构建完成后上报到监控系统 |
五、完整示例(Pipeline 级 + Stage 级)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
post {
success {
echo "编译成功!"
}
failure {
echo "编译失败!"
}
}
}
stage('Test') {
steps {
sh 'make test'
}
}
}
post {
success {
emailext(
subject: '构建成功',
body: '构建成功,一切正常。',
to: 'dev-team@example.com'
)
}
failure {
emailext(
subject: '构建失败',
body: '构建失败,请立即查看:${BUILD_URL}',
to: 'dev-team@example.com, manager@example.com'
)
}
always {
cleanWs() // 清理工作空间
sh 'rm -f *.tmp' // 删除临时文件
}
}
}
六、注意事项
post
中不能写stages
或steps
,它本身就是steps
的容器。- 支持所有 Jenkins Step,如
sh
,echo
,mail
,script
,junit
,archiveArtifacts
等。 - 推荐将资源清理(如
cleanWs()
)放在always
中,确保不残留文件。 - 敏感操作(如部署生产)可放在
success
中,避免失败后继续执行。
总结
关键词 | 含义 |
---|---|
post |
声明"事后动作" |
always |
不管结果如何都执行 |
success |
成功后执行 |
failure |
失败后执行 |
cleanWs() |
清理工作区,常用在 always |
一句话总结 :
post
就像是"构建完成后的钩子函数",让你可以优雅地处理通知、清理、归档等收尾工作。