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

总结

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

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

相关推荐
醉颜凉12 小时前
Elasticsearch核心架构:集群(Cluster)原理详解与核心作用
elasticsearch·架构·jenkins
王志来1379447300815 小时前
工控服务器机箱选型决策要素解析:匀天以“快全准省”构建价值坐标
运维·服务器·python·devops
云间月13141 天前
Elasticsearch 数据怎么看?部署 Kibana,从索引查询到可视化图表
大数据·elasticsearch·jenkins
Zadig1 天前
DevOps 选型指南:Zadig / 云效/Coding/Jenkins/GitLab/Argo/Tekton
devops
2601_966871402 天前
全新 云原生系统精讲与全流程落地实践,云原生 DevOpS 进阶实战营
运维·云原生·devops
略略略咯咯2 天前
jenkins
运维·servlet·jenkins
智能运维指南2 天前
敏捷研发系统选型,企业如何既快又不乱?
devops·ctest
蒲锘2 天前
Devops项目笔记阶段 7:Jenkins CI/CD 自动化部署
笔记·jenkins·devops
醉颜凉2 天前
Elasticsearch 相关性评分核心解密:tie_breaker 参数作用原理与实战调优全解析
大数据·elasticsearch·jenkins
Harm灬小海2 天前
2026 年主流 AI+DevOps 平台调研分析报告
运维·人工智能·devops