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

时间:2016-05-25 15:29:48

标签: jenkins

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

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

5 个答案:

答案 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
  • 使用您最喜欢的脚本化xml编辑器进行编辑(我的是xmlstarlet
  • 通过config xml
  • 上传新的/job/{name}/config.xml

一些随机记录:

  • 在做任何事之前做* BACKUP *
  • 如果有人有兴趣,我可能会发布一些bash脚本示例
祝你好运!

编辑&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中即可。作业被视为代码,并具有适当的发布过程。