在阶段结束后或阶段开始前立即触发 Jenkins 声明性管道中的操作?

Trigger an action within Jenkins declarative pipeline right after a stage ends or just before a stage begins?

我有以下 Jenkinsfile:

pipeline {
    agent any
    environment { }
    stages {
        stage('stageA') {
            steps {
                ... Do something with arg1, arg2 or arg3
            }
        }
        stage('stageB') {
            steps {
                ... Do something with arg1, arg2 or arg3
            }
        }
        ...
    }
}

是否可以在任何地方指定要执行的通用 "pre-stage" 或 "post-stage" 一组操作?一个用例是在阶段结束时将日志记录信息发送到日志管理器,但最好不要在每个阶段结束时复制和粘贴这些调用。

据我所知,Jenkins 管道中没有通用的 post- 或预阶段挂钩。您可以在 post section 中定义 post 个步骤,但每个阶段需要一个步骤。

但是,如果您不想重复自己,您有一些选择。

使用共享库

放置重复代码的地方shared library。这种方式允许您使用 Groovy.

声明自己的步骤

您需要另一个存储库来定义共享库,但除此之外,这是一种非常简单的方法,您可以在所有 Jenkins 管道中重用代码。

使用函数

如果您在 pipeline 之外声明一个函数,您可以从任何阶段调用它。这并没有真正记录下来,将来可能会被阻止。据我所知,它扰乱了主人和代理人之间的协调。但是,它有效:

pipeline {

    agent any

    stages {
        stage ("First") {
            steps {
                writeFile file: "resultFirst.txt", text: "all good"
            }
            post {
                always {
                    cleanup "first"
                }
            }
        }
        stage ("Second") {
            steps {
                writeFile file: "resultSecond.txt", text: "all good as well"
            }
            post {
                always {
                    cleanup "second"
                }
            }
        }

        post {
            always {
                cleanup "global" // this is only triggered after all stages, not after every
            }
        }
    }
}

void cleanup(String stage) {
    echo "cleanup ${stage}"
    archiveArtifacts artifacts: "result*"
}