我们有数百个Jenkins项目(主要是从几个模板创建的),通常需要对所有项目进行相同的更改。例如今天我需要添加一个post-build步骤来删除最后的工作区。接下来,我需要更改将构建结果复制到Nexus存储库的共享驱动器的步骤。
将这种批量更改应用于Jenkins项目的最佳方式是什么?
答案 0 :(得分: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())
如果您不确定删除工作区所需的发布者类,我建议您手动将所需的配置添加到一个作业,然后从该作业的脚本控制台运行getPublishersList()
。您将在列表中看到您正在使用的类,然后您可以查看api以了解构建它所需的内容。
然后,您可以遍历所有作业并添加发布商执行以下操作:
Jenkins.instance.getView("All Jobs").items.each { job ->
//Maybe some logic here to filter out specific jobs
job.getPublishersList().add(new PluginConstructor())
}
或者,您可以使用Jenkins CLI api或REST api,但是为了更新构建后的操作,您必须修改项目配置xml文件(这不是简单的编程配置),然后使用新配置文件覆盖作业配置。
答案 1 :(得分:7)
您可以使用旨在执行此操作的http://en.cppreference.com/w/cpp/thread/future/~future。
它支持许多配置选项。
答案 2 :(得分:6)
您可以使用自己喜欢的文本工具(vi,python,...)编辑config.xml
文件,然后重新加载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>
...
脚本:
#!/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_descrption(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_descrption(config_xml_path, 'additional_requirements', 'bar')
在这个小例子中,正则表达式可以工作,但如果事情跨越多行,最好使用xml工具: - )
答案 3 :(得分:4)
REST API非常强大。以下顺序对我有用:
所有相关项目的循环(项目列表可通过例如/api/xml?tree=jobs[name]
获得):
config.xml
/job/{name}/config.xml
config xml
/job/{name}/config.xml
一些随机记录:
编辑&gt;示例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
答案 4 :(得分:0)
其他答案也不错,但是如果您使用管道,建议您使用Pipeline Shared Libraries。
我们所有的工作都在git存储库中。要开发一项新功能,我们可以在一个分支中进行尝试,因为可以将一个作业指向一个特定分支。当我们需要更新它们时,只需合并到master中即可。作业被视为代码,并具有适当的发布过程。