批量更新Jenkins项目的最佳方法是什么?

Jir*_* Hu 13 jenkins

我们有数百个Jenkins项目(主要是从几个模板创建的),通常需要对所有项目进行相同的更改.例如,今天我需要添加一个构建后的步骤来删除最后的工作区.接下来,我需要更改将构建结果复制到Nexus存储库的共享驱动器的步骤.

将这种批量更改应用于Jenkins项目的最佳方法是什么?

The*_*lis 7

到目前为止,Groovy是批量更新作业的最佳方式.您可能需要对jenkins/plugin api进行一些挖掘以找出api调用的内容,但是脚本控制台(http:// yourJenkinsUrl/script)提供了一种简单的方法来使用代码直到获得它对.

为了帮助您入门,您可以通过调用getPublishersList()作业上的方法然后调用添加/删除方法来添加/删除构建后步骤.

def publishersList = Jenkins.instance.getJob("JobName").getPublishersList()
publishersList.removeAll { it.class == whatever.plugin.class }
publishersList.add(new PluginConstructor())
Run Code Online (Sandbox Code Playgroud)

如果您不确定删除工作区所需的发布者类,我建议您手动将所需的配置添加到一个作业,然后getPublishersList()从该作业的脚本控制台运行.您将在列表中看到您正在使用的类,然后您可以查看api以了解构建它所需的内容.

然后,您可以遍历所有作业并添加发布者执行以下操作:

Jenkins.instance.getView("All Jobs").items.each { job ->
    //Maybe some logic here to filter out specific jobs

    job.getPublishersList().add(new PluginConstructor())
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Jenkins CLI api或REST api,但是为了更新构建后操作,您必须修改项目配置xml文件(这不是通过编程方式配置),然后使用它来覆盖作业配置.新配置文件.


vlp*_*vlp 7

REST API是相当强大的。以下顺序对我有用:

循环显示所有相关项目(可通过例如来获得项目列表/api/xml?tree=jobs[name]):

  • config.xml通过下载/job/{name}/config.xml
  • 使用您最喜欢的脚本xml编辑器进行编辑(我的是xmlstarlet
  • config xml通过上传新/job/{name}/config.xml

一些随机注释:

  • 做任何事情之前先做* BACKUP *
  • 如果有人感兴趣,我可能会发布一些bash脚本示例

祝好运!

编辑> bash脚本示例:

#!/bin/bash

jenkinsUrlBase='http://user:token@jenkins'

callJenkins() { # funcPath
    curl --silent --show-error -g "${jenkinsUrlBase}${1}"
}

postJenkinsFile() { # funcPath fileName
    curl --silent --show-error -g -d "@${2}" "${jenkinsUrlBase}${1}"
}

callJenkins '/api/xml?tree=jobs[name]' | xmlstarlet sel -t -v '//hudson/job/name' | while read projectName ; do

    echo "Processing ${projectName}..."
    origFile="${projectName}_old.xml"
    newFile="${projectName}_new.xml"
    callJenkins "/job/${projectName}/config.xml" > "$origFile"

    echo " - Updating artifactory url..."
    cat "$origFile" \
        | xmlstarlet ed -P -u '//maven2-moduleset/publishers/org.jfrog.hudson.ArtifactoryRedeployPublisher/details/artifactoryUrl' -v "http://newServer/artifactory" \
    > "${newFile}"

    if false ; then
        echo " - Commiting new config file..."
        postJenkinsFile "/job/${projectName}/config.xml" "$newFile"
    else
        echo " - Dry run: not commiting new config file"
    fi

done
Run Code Online (Sandbox Code Playgroud)


R. *_*olt 7

您可以使用旨在执行此操作的配置切片插件.

它支持许多配置选项.


gue*_*tli 6

您可以config.xml使用自己喜欢的文本工具(vi,python,...)编辑文件,然后重新加载jenkins配置.

在我的设置中,作业存储在~/.jenkins/jobs/*/config.xml.

请参阅:https://wiki.jenkins-ci.org/display/JENKINS/Administering+Jenkins

这里是一个小例子来更新foobar:

    </com.cwctravel.hudson.plugins.extended__choice__parameter.ExtendedChoiceParameterDefinition>
        <hudson.model.StringParameterDefinition>
          <name>additional_requirements</name>
          <description>foo</description>
...
Run Code Online (Sandbox Code Playgroud)

脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals, print_function

import sys
from lxml import etree
from collections import defaultdict


def change_parameter_description(config_xml_path, parameter_name, new_description):
    tree=etree.parse(config_xml_path)

    for tag in tree.findall('.//hudson.model.StringParameterDefinition'):
        name_tag=tag.find('./name')
        if not name_tag.text==parameter_name:
            continue
        description=tag.find('./description')
        description.text=new_description
    tree.write(config_xml_path)


for config_xml_path in sys.argv[1:]:
    change_parameter_description(config_xml_path, 'additional_requirements', 'bar')
Run Code Online (Sandbox Code Playgroud)

在这个小例子中,正则表达式可以工作,但如果事情跨越多行,最好使用xml工具:-)