Jenkins共享声明式管道

时间:2020-06-25 16:39:24

标签: jenkins jenkins-pipeline jenkins-declarative-pipeline

我有几个项目的管道非常相似,例如:

pipeline {
    agent any
    environment {
        JAVA_HOME = '...'
    }
    options {
        timeout(time: 1, unit: 'HOURS')
    }
    parameters {
        extendedChoice(
            name: 'modules',
            description: 'Modules to build',
            type: 'PT_MULTI_SELECT',
            value: 'app,common,data,ui',
            defaultValue: 'app'
        )
    }
    stages {
        stage('Build') {
            steps {
                script {
                    def modules = params.modules.split(',')

                    withGradle {
                        if ('app' in modules) {
                            sh './gradlew app:assemble'
                        }

                        // other modules...
                    }
                }

                archiveArtifacts(artifacts: '**/build/outputs/**/*.jar', allowEmptyArchive: true)
            }
        }
    }
}

我想避免将样板复制到新项目中,因此创建共享库听起来是个好方法。

但是,每个项目都有不同的模块。我希望这些可以在项目级别进行配置,例如:

// my-shared-library/vars/bootstrap.groovy
def call(body) {
    pipeline {
        agent any
        environment {
            JAVA_HOME = '...'
        }
        options {
            timeout(time: 1, unit: 'HOURS')
        }
        stages {
            stage('Build') {
                steps {
                    script {
                        // get parameters from project
                        body()

                        def modules = params.modules.split(',')

                        withGradle {
                            for (module in modules) {
                                sh "./gradlew $module:assemble"
                            }
                        }
                    }

                    archiveArtifacts(artifacts: '**/build/outputs/**/*.jar', allowEmptyArchive: true)
                }
            }
        }
    }
}

理想情况下,我可以在我的一个项目中使用上面的共享库:

library 'my-shared-library@master'

bootstrap {
    parameters {
        extendedChoice(
            name: 'modules',
            description: 'Modules to build',
            type: 'PT_MULTI_SELECT',
            value: 'app,common,data,ui',
            defaultValue: 'app'
        )
    }
}

运行此管道时,modules参数为null。我还尝试像这样在parameters块之外定义bootstrap

library 'my-shared-library@master'

properties([
    parameters([
        extendedChoice(
            name: 'Modules',
            description: 'Modules to build',
            type: 'PT_MULTI_SELECT',
            value: 'app,common,data,ui',
            defaultValue: 'app'
        )
    ])
])

bootstrap()

此管道引发以下错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 13: unexpected token: extendedChoice @ line 13, column 13.
               extendedChoice(
               ^

像这样可能吗?我正在努力查找有关该用例的文档,尤其是有关声明性管道的文档,尽管我发现了一些非常接近的示例:

0 个答案:

没有答案