我们有数百个Jenkins项目(主要是从几个模板创建的),通常需要对所有项目进行相同的更改.例如,今天我需要添加一个构建后的步骤来删除最后的工作区.接下来,我需要更改将构建结果复制到Nexus存储库的共享驱动器的步骤.
将这种批量更改应用于Jenkins项目的最佳方法是什么?
到目前为止,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文件(这不是通过编程方式配置),然后使用它来覆盖作业配置.新配置文件.
该REST API是相当强大的。以下顺序对我有用:
循环显示所有相关项目(可通过例如来获得项目列表/api/xml?tree=jobs[name]):
config.xml通过下载/job/{name}/config.xmlconfig xml通过上传新/job/{name}/config.xml一些随机注释:
祝好运!
编辑> 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)
您可以config.xml使用自己喜欢的文本工具(vi,python,...)编辑文件,然后重新加载jenkins配置.
在我的设置中,作业存储在~/.jenkins/jobs/*/config.xml.
请参阅:https://wiki.jenkins-ci.org/display/JENKINS/Administering+Jenkins
这里是一个小例子来更新foo到bar:
</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工具:-)
| 归档时间: |
|
| 查看次数: |
11530 次 |
| 最近记录: |