jenkins 如何将公共数据导入jobDSL groovy脚本?

igetnqfo  于 5个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(33)

我正在使用jobDSL插件来允许我和我的团队在我们的Jenkins设置中使用基础设施即代码原则。我们在脚本中定义了一堆作业,但其中大部分共享一些元数据,例如,几乎所有的作业都包含我们的开发团队可以部署的可用环境列表,例如:

environments = [
    'Development',
    'Test',
    'Production'
]

字符串
我希望能够定义这个列表一次,然后将其导入到每个jobDSL脚本中,这样我们就不会重复20多次,每次有变化时都要修改20多次列表。我希望我可以使用我们的jenkins共享库来做到这一点,在文件的顶部设置@Library('our-shared-library') _,但当我运行我们的种子作业时,我得到了一个unable to resolve class Library , unable to find class for annotation错误,所以看起来共享库不能导入到jobDSL脚本文件中。
有没有其他方法可以将数据或类放在一个集中的位置/存储库中,并导入到所有的jobDSL脚本文件中?
我认为最理想的方法是将共享的元数据存储在存储所有jobDSL文件的repo中的文件中,但是如果它们需要存储在其他地方并导入,我也很乐意使用这种方法。
编辑1:有关jobDSL插件是什么以及它如何在Jenkins中启用IaC原则的更多信息,您可以将this question视为品尝者。我有大量作业,其中许多作业使用相同的数据,例如,我们的团队可以部署到的环境列表。我想定义这个列表1次,然后以某种方式将其拉到我的pipelineJob定义中。我试图导入我们的jenkins-共享库使用@Library('ourLibrary')注解,但我认为这是不可能的。
Here is the Github page for the plugin.
编辑2:我将尝试重新措辞这个问题,现在我已经喝了早上的咖啡,只是写得更好。我正在使用jobDSL插件以IaC格式定义我的Jenkins作业。我现在有20多个作业,一些数据在多个作业中重复,例如,我有一些工作需要一个环境列表作为参数供用户选择。我想定义这个列表一次,只定义一次,然后将该列表导入到需要该列表的文件中。
这里是一个示例jobDSL脚本(这是我有20多个文件,有一些差异)

def SERVICES = [
    'Service-1',
    'Service-2
]

def ENVIRONMENTS = [
    'Development',
    'Testing',
    'Production'
]

for (SVC in SERVICES) {

    SVC_NAME = SVC.replaceAll('-', ' ')
    SVC_PATH = SVC.replaceAll('-', '_')

    pipelineJob("DEPLOY/${SVC_NAME}") {

        displayName("DEPLOY ${SVC_NAME.toUpperCase()}")

        parameters {
            choiceParam('ENVIRONMENT', ENVIRONMENTS, 'Select the environment to deploy to')
        }

        logRotator {
            numToKeep(30)
        }
        
        definition {
            cpsScm {
                scm {
                    git {
                        remote {
                        ...
                    }
                }
                scriptPath('deploy/Jenkinsfile_deploy_services.groovy')
            }
        }
    }
}


现在我想在某个地方定义ENVIRONMENTS列表,然后将其导入到我所有的20多个文件中,而不是在每个文件的顶部定义它,使我的repo更加干净和可维护。

snvhrwxg

snvhrwxg1#

对我来说,这也是很难找到任何方式导入符号到我的工作,我想出了以下(对我来说仍然不满意)的方法:
想象一下,在你的脚本管道中导入任何一个带有所有符号的库,其中一个符号是exg.:“globals”(vars/globals.groovy)。此外,每个人都知道jobDSL语句,它可以在任何脚本管道中使用:

@Library('[email protected]') _
node() {
    //first clone your job-dsl.groovy file and once its available:
    jobDsl targets: [job-dsl.groovy].join('\n'),
           removedJobAction: 'IGNORE',
           removedViewAction: 'IGNORE',
           lookupStrategy: 'JENKINS_ROOT',
           additionalParameters: [prm: [PL_CRONTAB: "H ****", ...], globals: globals]
}

字符串
你可以在这里发现globals是通过addtionalParameters传递的,现在看看globals和prm是如何在job-tool.groovy中使用的:

pipelineJob(prm.PL_JOBNAME) {
    properties {
        pipelineTriggers {
            triggers {
                cron {
                    spec(prm.PL_CRONTAB ?: '@daily')
                }
            }
        }
    }
    parameters {
        prm.each{ key, value ->
            stringParam(key, value, '')
        }
    }
    definition {
        cpsScm {
            scm {
                git {
                    remote {
                        url('https://github.com/your-org/jenkinsfile.git')
                        credentials(globals.bdc_github_credentials_id)
                    }
                    branch(prm.PL_JENKINSFILE_VERSION ?: "master")
                    extensions {
                        submoduleOptions {
                            parentCredentials()
                            recursive()
                        }
                    }
                }
            }
            scriptPath(prm.PL_JENKINSFILE)
        }
    }
}

相关问题