如何让Jenkins种子作业指定lookupStrategy并在同目录生成新作业?
我来帮你解决这两个Jenkins Job DSL的问题,都是实际使用中很常见的需求:
Jenkins Job DSL中的lookupStrategy用于控制DSL脚本查找现有作业的逻辑(比如是从Jenkins根目录开始找,还是从种子作业所在目录开始找)。种子作业指定自身的lookupStrategy有两种常用方式:
手动配置构建步骤:
在种子作业的「Process Job DSLs」构建步骤中,找到「Lookup strategy」下拉选项,直接选择你需要的策略(比如SEED_JOB表示从种子作业所在目录开始查找,JENKINS_ROOT表示从Jenkins根目录开始)。这种方式适合不需要动态调整的场景。通过脚本动态指定:
如果需要在运行时动态设置,可以借助Groovy脚本调用Jenkins API修改种子作业的构建步骤配置。比如在种子作业的「Execute system Groovy script」步骤中添加以下代码:def seedJob = Jenkins.instance.getItemByFullName(env.JOB_NAME) def dslStep = seedJob.getBuildersList().find { it instanceof javaposse.jobdsl.plugin.ExecuteDslScripts } if (dslStep) { dslStep.setLookupStrategy(javaposse.jobdsl.plugin.LookupStrategy.SEED_JOB) seedJob.save() }这段代码会找到种子作业中的DSL执行步骤,将其
lookupStrategy设置为SEED_JOB,并保存配置。
要实现种子作业在自身所在文件夹下生成新作业,不用手动配置构建步骤的上下文,核心思路是动态获取种子作业所在的父文件夹,然后在创建作业时指定该文件夹作为父目录。这里有两种可靠的方案:
方案1:通过Jenkins API获取父文件夹(推荐)
直接调用Jenkins API获取种子作业的父文件夹实例,然后在该文件夹下创建新作业,这种方式不受作业名称格式影响,兼容性更好:
// 获取当前种子作业实例 def seedJob = Jenkins.instance.getItemByFullName(env.JOB_NAME) // 获取种子作业所在的父文件夹 def parentFolder = seedJob.getParent() // 在父文件夹下创建新的自由风格作业 parentFolder.createProject(FreeStyleProject.class, 'my-job') { description '自动在种子作业所在文件夹生成的作业' steps { shell 'echo "Hello from auto-generated job!"' } }
方案2:通过环境变量拆分文件夹路径
利用Jenkins提供的env.JOB_NAME环境变量(它的值是种子作业的完整路径,比如my-project/seed-job),拆分出父文件夹路径,然后直接指定作业的完整路径:
// 拆分种子作业的完整路径,得到父文件夹路径 def jobPathParts = env.JOB_NAME.split('/') def folderPath = jobPathParts.size() > 1 ? jobPathParts[0..-2].join('/') : '' // 创建作业时指定完整路径 job("${folderPath}/my-job") { description '通过路径拆分生成的同文件夹作业' steps { shell 'echo "Hello from path-based generated job!"' } }
这种方式更简洁,不需要直接调用Jenkins底层API,适合大多数常规场景。
注意:如果你的Jenkins启用了文件夹权限,确保种子作业有在当前文件夹下创建作业的权限,否则会报错。
内容的提问来源于stack exchange,提问作者ThatBlairGuy

