Function Jenkins后期构建步骤作为一个函数

Function Jenkins后期构建步骤作为一个函数,function,jenkins,jenkins-pipeline,jenkins-groovy,Function,Jenkins,Jenkins Pipeline,Jenkins Groovy,在詹金斯,我知道我能做到 pipeline { agent any stages { stage('Demo') { steps { MyFunction() } } } } void MyFunction() { sh 'ls /' } 在这种情况下,函数在管道中,但我可以始终将MyFunction提取到共享库中,以便跨管道重用 但有可能通过后期构

在詹金斯,我知道我能做到

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

void MyFunction() {
    sh 'ls /'
}
在这种情况下,函数在管道中,但我可以始终将
MyFunction
提取到共享库中,以便跨管道重用

但有可能通过后期构建步骤来实现这一点吗

在本例中,我希望将其转换为函数并将其提取到库中

    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目录,我们在特定阶段后清理工作区的工作方式是,在不尝试猜测文件夹名称的情况下,让您的帖子在阶段中发挥作用:

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

                    }
                }
            }
        }
    }
}

我们使用。

将${workspace}@tmp等变量作为参数传递给函数。这样的VAR是由Jenkins填充的,不在您上面所写的范围内。您完全正确。我必须多次调用
deleteDir()
的唯一原因是因为正在创建许多其他目录<代码>demo@tmp,
demo@2
demo@script
同意。尝试将工作区名称作为参数传递给函数,如解决方案中所示。这是否有效?我可能做了错误的事情,也许这不起作用。你能更新答案吗?嘿@Hammed,更新答案是什么意思?你能试试上面的答案吗?这对我有用。这也会清理tmp目录吗?出于某种原因,它不适合我,我总是留下
demo@tmp, demo@2, demo@script及demo@2@tmp
目录未清除。
@script
文件夹通常在主节点上创建。我们有一个定期的工作,如果这些文件夹在过去的几个小时内没有被修改,就会清除它们。