You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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 * * * *')
  }
}

解答

你试的写法不可行,原因有两个:

  1. Jenkins Job DSL的pipelineJob()方法不支持用App/*这种通配符作为Job名称,它需要明确的Job名称。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:47:28