基于Jenkins CasC实现通配符批量拉取Pipeline Job的咨询
问题描述
我正在用Jenkins CasC构建Jenkins Pipeline,对Groovy和Pipeline相关技术不太熟,不确定术语怎么用。我的目标是从仓库https://gitlab.domain.com/<repo>/project.git的<repo>/jobs路径下拉取所有Job,已经在Jenkins CasC的YAML里配置了:
jobs: - script: > folder('App') - file: /var/jenkins_home/pipelines/pull_jobs_wildcard
现有脚本能正常拉取单个Job,代码如下:
pipelineJob("App/App Server Stop") { definition { cpsScm { scm { git { remote { url("https://gitlab.domain.com/repo/project.git") credentials("<git_creds_id>") } branch('develop') } } scriptPath("jobs/app_server_stop") } } triggers { scm('H/15 * * * *') } }
我想改成用通配符拉取jobs/*下的所有Pipeline Job,试了下面的写法,不知道行不行?
pipelineJob("App/*") { definition { cpsScm { scm { git { remote { url("https://gitlab.domain.com/repo/project.git") credentials("<git_creds_id>") } branch('develop') } } scriptPath("jobs/*") } } triggers { scm('H/15 * * * *') } }
解答
你试的写法不可行,原因有两个:
- Jenkins Job DSL的
pipelineJob()方法不支持用App/*这种通配符作为Job名称,它需要明确的Job名称。 scriptPath也不能直接用jobs/*,因为每个Pipeline Job对应一个具体的脚本文件,通配符无法让Jenkins识别要绑定哪个脚本到哪个Job。
不过可以通过小幅修改现有脚本实现批量拉取,核心是用Groovy的文件遍历功能,先拉取Git仓库到临时目录,然后遍历jobs目录下的所有文件,再逐个创建对应的Pipeline Job。修改后的脚本如下:
// 定义Git仓库基础配置 def gitUrl = "https://gitlab.domain.com/repo/project.git" def gitCreds = "<git_creds_id>" def gitBranch = "develop" def targetFolder = "App" // 创建临时目录用于克隆仓库 def tempDir = File.createTempDir() try { // 克隆Git仓库到临时目录 git url: gitUrl, credentialsId: gitCreds, branch: gitBranch, dir: tempDir.path // 遍历jobs目录下的所有脚本文件 new File("${tempDir.path}/jobs").eachFile { jobScriptFile -> // 用脚本文件名(去掉后缀)作为Job名称 def jobName = "${targetFolder}/${jobScriptFile.name.take(jobScriptFile.name.lastIndexOf('.'))}" pipelineJob(jobName) { definition { cpsScm { scm { git { remote { url(gitUrl) credentials(gitCreds) } branch(gitBranch) } } // 指定当前遍历到的脚本路径 scriptPath("jobs/${jobScriptFile.name}") } } triggers { scm('H/15 * * * *') } } } } finally { // 清理临时目录 tempDir.deleteDir() }
注意事项
- 确保Jenkins服务器能访问临时目录,且有足够权限创建、删除文件。
- 假设
jobs目录下的每个文件都是独立的Pipeline脚本(比如app_server_stop.groovy),脚本文件名会直接作为Job名称(去掉后缀)。 - 新增或删除
jobs目录下的脚本文件后,下次CasC刷新时,Jenkins会对应创建或删除Job。
内容的提问来源于stack exchange,提问作者New2Python
相关产品推荐
相关产品推荐

