如何将常用数据导入到 jobDSL Groovy 脚本中?

问题描述 投票:0回答:1

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

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

我希望能够定义这个列表一次,然后将其导入到每个 jobDSL 脚本中,这样我们就不会重复 20 多次,并且每次发生更改时都必须修改 20 多个列表。我希望我可以使用我们的 jenkins-shared-library 通过在文件顶部添加

@Library('our-shared-library') _
来完成此操作,但是当我运行种子作业时,我收到
unable to resolve class Library ,  unable to find class for annotation
错误,所以看起来共享库不能导入到 jobDSL 脚本文件中。

是否有其他方法可以将数据或类存储在集中位置/存储库中,以便将其导入到我的所有 jobDSL 脚本文件中?

我认为最理想的方法是将共享元数据存储在存储我们所有 jobDSL 文件的存储库中的文件中,但如果它们需要存储在其他地方并导入,我也会对这种方法感到满意。


编辑1:有关 jobDSL 插件是什么以及它如何在 Jenkins 中实现 IaC 原则的更多信息,您可以作为品尝者查看这个问题。我有大量的工作,其中许多工作都使用相同的数据,例如我们的团队可以部署到的环境列表。我想定义这个列表 1 次,然后以某种方式将其拉入我的 pipelineJob 定义中。我尝试使用

@Library('ourLibrary')
注释导入我们的 jenkins-shared-library,但我认为这是不可能的。

这里是该插件的 Github 页面。


编辑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 多个文件中,而不是在每个文件的顶部定义它,从而使我的存储库更加干净和可维护。我该怎么做?

jenkins shared-libraries jenkins-job-dsl
1个回答
0
投票

对我来说,也很难找到任何方法将符号导入到我的 jobdsl 中,我想出了以下(对我来说仍然不满意)的方法:

想象一下在脚本管道中导入任何包含其所有符号的库, 它的符号之一是例如:“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]
}

你可以发现全局变量是通过addtionalParameters传递的 现在看看在 job-dsl.groovy 中如何使用全局变量和 prm :

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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.