详解Jenkins 的 Declarative Pipeline中post 语法

在 Jenkins 的 Declarative Pipeline 中,post 是一个非常重要的 声明式语法块,用于定义在 Pipeline 或某个 stage 执行完成后,根据其执行结果自动执行的后续操作。

简单来说:

post 就是"事后处理"的逻辑,比如:无论成功还是失败,都要发送通知、归档日志、清理资源等。

一、post 的作用

post 块可以放在两个位置:

  1. Pipeline 级别:作用于整个 Pipeline 执行完成后
  2. 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'  // 删除临时文件
        }
    }
}

六、注意事项

  1. post 中不能写 stages 或 steps,它本身就是 steps 的容器。
  2. 支持所有 Jenkins Step,如 sh, echo, mail, script, junit, archiveArtifacts 等。
  3. 推荐将资源清理(如 cleanWs())放在 always 中,确保不残留文件。
  4. 敏感操作(如部署生产)可放在 success 中,避免失败后继续执行。

总结

关键词 含义
post 声明"事后动作"
always 不管结果如何都执行
success 成功后执行
failure 失败后执行
cleanWs() 清理工作区,常用在 always

一句话总结 :
post 就像是"构建完成后的钩子函数",让你可以优雅地处理通知、清理、归档等收尾工作。

相关推荐
tianyuanwo2 小时前
【软考高级系统架构设计师】05 - DevOps & CI/CD专题备考
ci/cd·系统架构·devops
元Y亨H17 小时前
基于 Jenkins + Docker 的前端(Vben Admin)CI/CD 踩坑
docker·jenkins
小白的码BUG之路21 小时前
Jenkins -- 连接gitee
运维·gitee·jenkins
ZeroNews内网穿透1 天前
内网穿透安全加固实践:通过 Geo 地理围栏阻挡境外扫描风险
运维·安全·devops
诚丞成1 天前
ELK日志分析:Elasticsearch索引、Logstash接入与Kibana可视化
elk·elasticsearch·jenkins
元Y亨H2 天前
宿主机 SSH 免密已通,为何 Jenkins 流水线仍报 Permission denied?
jenkins
落魄大学生之流水线上谋生计2 天前
从 Jenkins 小白到企业级交付平台
运维·jenkins
java、iOS、Vue3 天前
Maven antrun vs Jenkins 脚本组装 deb的优缺点、适用场景
java·jenkins·maven
协皓家具4 天前
2026年广州岛台吧台椅厂家有啥新变化
大数据·运维·python·devops
記億揺晃着的那天4 天前
【Agent 架构实战】大模型长期项目开发:决策文档生命周期管理与 CI 门禁治理
软件工程·devops·架构设计·ai agent·文档管理