详解Jenkins 的 Declarative Pipeline中post 语法
在 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 anystages {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
就像是“构建完成后的钩子函数”,让你可以优雅地处理通知、清理、归档等收尾工作。