我使用 jenkins jobDsl 如下:
#!groovy
node('master') {
stage('Prepare') {
deleteDir()
checkout scm
}
stage('Provision Jobs') {
jobDsl(targets: ['jenkins/commons.groovy', 'folderA/jenkins/jobA.groovy'].join('\n'),
removedJobAction: 'DELETE',
removedViewAction: 'DELETE',
sandbox: false)
}
}
我想在 jobA.groovy
中使用在 commons.groovy
上定义的函数。
目前,jobA.groovy
无法访问 commons.groovy
上定义的函数,我怎样才能允许这种行为?
附:
- jobA.groovy:
test_job("param1", "param2")
- common.groovy:
def test_job(String team, String submodule) {
pipelineJob("${team}/${submodule}/test_job") {
displayName("Test Job")
description("This is a Continuous Integration job for testing")
properties {
githubProjectUrl("githubUrl")
}
definition {
cpsScm {
scm {
git {
remote {
url('githubUrl')
credentials('credentials')
refspec('+refs/pull/*:refs/remotes/origin/pr/*')
}
branch('${sha1}')
scriptPath("scriptPath")
}
}
}
}
}
}
这个想法是能够从 jobA.groovy 调用这个方法 test_job("param1", "param2")
没有任何问题,我目前得到:
ERROR: (jobA.groovy, line 9) No signature of method: test_job() is applicable for argument types: (java.lang.String, java.lang.String)
最佳答案
JobDSL 创造就业机会。然后在运行时你希望你的工作调用你的函数。该函数必须通过共享库导入。
创建共享库
这是一个示例:https://github.com/sap-archive/jenkins-pipelayer 最重要的部分是您需要创建一个 vars/文件夹来定义您可以从管道调用的函数。将库托管在自己的存储库或孤立分支上
导入共享库
在 Jenkins 中导入 lib 库。从“管理”页面,转到“配置系统”,在“全局管道库”部分下,添加一个具有您选择的名称的新库,即“您的库名称”、默认版本主版本、现代 scm git https://urlofyoursharedlib.git 第一次运行 jobDSL 作业,然后转到“处理中脚本批准”页面并批准所有内容。
使用共享库
要在作业中导入库,您必须在文件顶部的 shebang 之后添加语句 @Library('name-of-your-lib')_
还有一个类似的声明,“library 'name-of-your-lib'”。这对于“调试和修复”共享库很有用,因为当您点击重播按钮时,您将看到管道中使用的共享库文件
最后,如果您想要创建作业模板,我建议尝试获取我共享的这个共享库正在做什么,它有助于创建声明性模板并解决您在 jobdsl 和共享管道中遇到的问题和限制
关于jenkins job dsl 插件问题,内部作业都无法访问外部作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64606842/