Jenkins post 构建步骤作为函数

Jenkins post build step as a Function

在詹金斯,我知道我可以做到...

pipeline {
    agent any
    stages {
        stage('Demo') {
            steps {
                MyFunction()
            }
        }
    }
}

void MyFunction() {
    sh 'ls /'
}

在这种情况下,函数在管道内,但我总是可以将 MyFunction 提取到共享库中,以便跨管道重用。

但是可以通过 post-构建步骤来实现吗?

在这种情况下,我想将其转换为函数并将其提取到库中。

    post {
        always {
            /* clean up our workspace */
            deleteDir()
            /* clean up tmp directory */
            dir("${workspace}@tmp") {
                deleteDir()
            }
            /* clean up script directory */
            dir("${workspace}@script") {
                deleteDir()
            }
            dir("${workspace}@2") {
                deleteDir()
            }
            dir("${workspace}@2@tmp") {
                deleteDir()
            }            
        }
    }

我试过了

    post {
        always{
            test()
        }
    }
}

有功能

void test() {
         {
            /* clean up our workspace */
            deleteDir()
            /* clean up tmp directory */
            dir("${workspace}@tmp") {
                deleteDir()
            }
            /* clean up script directory */
            dir("${workspace}@script") {
                deleteDir()
            }
            dir("${workspace}@2") {
                deleteDir()
            }
            dir("${workspace}@2@tmp") {
                deleteDir()
            }            
        }
}

但是好像不行

这有可能吗,还是我只是遗漏了一些非常明显的东西?

将工作区的名称作为函数中的参数传递将解决您的问题。以下脚本有效。

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post{
        always{
            echo "In : ${env.WORKSPACE}"
            test(env.WORKSPACE)
        }
    }
}

void test(workspace){
    echo "In test : " + workspace
    deleteDir()
    dir("${workspace}@tmp") {
        deleteDir()
    }
}

此外,如果您只调用一次 deleteDir(),而不是为多个 tmp 目录调用 deleteDir(),那么它将删除工作区和 tmp 目录

我们在特定阶段后清理工作区而不尝试猜测文件夹名称的方法是让您的 post 函数处于阶段:

pipeline {
    agent any

    stages {
        stage('1') {
            steps {
                echo 'Hello World'
            }
            post {
                cleanup {
                    script {
                        // Workspace Cleanup plugin
                        cleanWs deleteDirs: true, 
                            notFailBuild: true, 
                            cleanWhenAborted: true, 
                            cleanWhenFailure: true, 
                            cleanWhenSuccess: true

                    }
                }
            }
        }
    }
}

我们使用WorkspaceCleanup plugin.