詹金斯工作视图与不同的工作名称

时间:2014-06-16 16:27:04

标签: groovy jenkins jenkins-cli groovy-console jenkins-scriptler

我在詹金斯有一个要求,其中,

  1. 例如,我们在具有特定配置的ABC视图中有10个作业。
  2. 现在,我需要在Jenkins XYZ中创建一个新视图,并使用不同的名称克隆ABC中的所有作业并更改配置,例如SCM URL。
  3. 我遇到了一个可能会这样做的groovy脚本,但我并不太了解groovy

    https://wiki.jenkins-ci.org/display/JENKINS/Clone+all+projects+in+a+View

    我们为每个版本创建一个新分支(新URL)。因此,视图ABC下的作业需要复制到具有不同名称和URL更新的XYZ中。我不想浪费时间用不同的名称单独创建每个作业,然后将它们添加到视图XYZ

    任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

您可以使用Folders Plugin,然后无需更改作业名称或管理视图。

要将作业从一个文件夹复制到另一个文件夹,您可以像这样使用ssh cli界面。

ssh -l USERNAME MYjenkins:port copy-job /OLD/job1 /NEW/job1 ssh -l USERNAME MYjenkins:port copy-job /OLD/job2 /NEW/job2

注意:某些ssh客户端不支持":port"并且需要这样的命令:

ssh -l USERNAME -p PORT MYjenkins copy-job /OLD/job1 /NEW/job1

如果不使用文件夹,您可以自动从现有作业创建新作业和视图,如下所示:

ssh -l USERNAME MYjenkins:port create-view NEW-VIEW ssh -l USERNAME MYjenkins:port copy-job jobN NEW_jobN ssh -l USERNAME MYjenkins:port add-job-to-view NEW-VIEW NEW_jobN

有关如何配置用户密钥以及如何确定和配置要使用的正确端口的信息,请参阅Cloudbees CLI

您甚至可以通过检索作业的config.xml然后使用该XML创建新作业,将作业从一个Jenkins实例复制到另一个Jenkins实例,如下所示:

ssh -l USERNAME MYJenkins:port get-job AJOB > AJOB.xml ssh -l USERNAME MYOTHERJenkins:port2 create-job AJOB < AJOB.xml

最后一个提示:尝试ssh -l USERNAME MYJenkins:port helpssh -l USERNAME MYJenkins:port help create-job

获取有关语法和可用命令的一些提示。

答案 1 :(得分:1)

您可以使用jenkins job dsl,其中还包含create views

的界面

您可以使用此

迭代视图中的作业
http://<your jenkins server>:<your jenkins port if its not on 80>/view/<your view>/api/json

然后使用job命令

克隆作业
job{
  name 'new name'
  using 'original name'

  //other configuration 
}

这是在groovy中编码的,作为单独作业中的构建步骤。您甚至可以使用参数来命名视图和作业,或者将其驱逐出SCM


EDIT 一个很好的问题。我像这样实现了它

查看名为templateView的

名为templateJobA,templateJobB等的作业

def templateJobsURL = new URL("http://jenkins-server:8080/view/templateView/api/json")
def templateJobs = new groovy.json.JsonSlurper().parse(templateJobsURL.newReader())
def newJobs = []

templateJobs.jobs.each { 
    def templateName = it.name
    def newName = templateName.replaceAll('template','new')
    job {
        name newName
        using templateName
    }
    newJobs.push(newName)
    println templateName + ' ' + newName
}

view(type: ListView) {
    name('new')
    description('All jobs for project A')
    jobs {
        newJobs.each{
           names (it)
           println 'view add ' + it
        }
    }
    columns {
        status()
        weather()
        name()
        lastSuccess()
        lastFailure()
        lastDuration()
        buildButton()
    }
}