详解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 就像是"构建完成后的钩子函数",让你可以优雅地处理通知、清理、归档等收尾工作。

相关推荐
NineData1 天前
NineData云原生智能数据管理平台新功能发布|2025年9月版
数据库·云原生·devops·ninedata·数据库迁移·数据复制·风险sql管控
学习的周周啊1 天前
一人AI自动化开发体系(Cursor 驱动):从需求到上线的全流程闭环与实战清单
运维·人工智能·自动化·ai编程·全栈·devops·cursor
qq_312920111 天前
从零搭建企业级DevOps流水线
运维·devops
一张假钞1 天前
Jenkins 项目迁移
ci/cd·jenkins
软件测试君1 天前
Jenkins Share Library教程 —— 开发入门
jenkins
Broken Arrows2 天前
如何在Linux服务器上部署jenkins?
linux·jenkins
19岁开始学习2 天前
PHP操作elasticsearch7.8
elasticsearch·jenkins·php
wearegogog1232 天前
Centos7下docker的jenkins下载并配置jdk与maven
java·docker·jenkins
gb42152873 天前
elasticsearch索引多长时间刷新一次(智能刷新索引根据数据条数去更新)
大数据·elasticsearch·jenkins