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

相关推荐
记得开心一点嘛11 小时前
Elasticsearch
运维·jenkins
oMcLin14 小时前
如何在 Ubuntu 22.04 上部署并优化 Jenkins 2.x 流水线,提升持续集成与自动化测试的效率?
ubuntu·ci/cd·jenkins
世界尽头与你15 小时前
CVE-2024-43044_ Jenkins agent connections 文件读取漏洞
安全·网络安全·渗透测试·jenkins
tianyuanwo15 小时前
TERM变量迷思:从Jenkins节点连接差异看终端仿真与构建系统的微妙关系
运维·ssh·jenkins·java web·term
一勺菠萝丶15 小时前
Jenkins 打包显示 SUCCESS 但产物不全?日志出现 Killed 的排查与解决(小白版)
运维·jenkins
Anakki15 小时前
企业级 Elastic Stack 集成架构:Spring Boot 3.x 与 Elasticsearch 8.x 深度实践指南
运维·jenkins·springboot·elastic search
一只往上爬的蜗牛16 小时前
【Jenkins】Jenkins 中如何在 Build Artifacts 显示自动化测试生成的文件
运维·jenkins
小二·16 小时前
前端 DevOps 完全指南:从 Docker 容器化到 GitHub Actions 自动化部署(Vue 3 + Vite)
前端·docker·devops
2501_906150561 天前
开源问卷平台DWSurvey开发配置记录
运维·开源·jenkins
一点晖光1 天前
jenkins 流水线脚本
运维·jenkins