如何使用api更新jenkins作业

如何使用api更新jenkins作业,api,jenkins,Api,Jenkins,我必须使用其api创建/更新jenkins作业,因为我的所有作业都使用其他脚本也使用的参数,我正在尝试集中脚本,因此当我在一个地方更改它时,更改将反映在所有地方 目前,如果有人更改脚本,他们还必须手动编辑jenkins作业的参数 我看到了用于创建作业的远程API示例,并且能够成功创建测试作业,但是除了删除现有作业并再次创建它(这不是一个选项,因为我必须维护构建历史记录)之外,我如何编辑现有作业。如果其他人也在寻找相同的答案 看来解决方案要简单得多,您只需更新config.xml并将更新后的con

我必须使用其api创建/更新jenkins作业,因为我的所有作业都使用其他脚本也使用的参数,我正在尝试集中脚本,因此当我在一个地方更改它时,更改将反映在所有地方

目前,如果有人更改脚本,他们还必须手动编辑jenkins作业的参数


我看到了用于创建作业的远程API示例,并且能够成功创建测试作业,但是除了删除现有作业并再次创建它(这不是一个选项,因为我必须维护构建历史记录)之外,我如何编辑现有作业。

如果其他人也在寻找相同的答案

看来解决方案要简单得多,您只需更新config.xml并将更新后的config.xml发回jenkins,您的工作就会得到更新。

这一点脚本似乎就是您所需要的。使用REST API获取和设置中间的一些正则表达式S/R。 编辑:以下代码基于注释。这是直接从博客上抄来的,所以我对此不负责

# First, get the http://jenkins.example.com/job/folder-name/job/sample-job--template/configure looking like you want

read -s token
# type token from http://jenkins.example.com/user/$userName/configure

# Download the configuration XML for the template job (which will be our model template)
curl -v -u "bvanevery:$token" http://jenkins.example.com/job/folder-name/job/sample-job--template/config.xml > generic-config.xml

# My modules
declare modules=('module1' 'module2' 'module3')

# POST the updated configuration XML to Jenkins
for m in ${modules[@]}; do
   echo "module $m";
   sed "s/MODULE/$m/g" generic-config.xml > $m-config.xml; 
   curl -v -X POST --data-binary @$m-config.xml -u "bvanevery:$token" \
        -H 'Content-Type: application/xml' \
        "http://jenkins.example.com/job/folder-name/job/$m/config.xml" ;
done

您还可以将更新的config.xml发布到可以获取
config.xml
的URL,以编程方式更新作业的配置

获取url模式:
$JENKINS\u SERVER/job/$job\u NAME/config.xml

详细的文档模式:
$JENKINS\u服务器/job/$job\u名称/api


例子:

你可能想考虑使用.

你可以使用这样的Python:

from jenkinsapi.jenkins import Jenkins
jenkinsSource = 'http://10.52.123.124:8080/'
server = Jenkins(jenkinsSource, username = 'XXXXX', password = 'YYYYY')
myJob=server.get_job("__test")
myConfig=myJob.get_config()
print myConfig
new = myConfig.replace('<string>clean</string>', '<string>string bean</string>')
myJob.update_config(new)
来自jenkinsapi.jenkins导入jenkins
詹金森http://10.52.123.124:8080/'
服务器=Jenkins(jenkinsource,用户名='XXXXX',密码='YYYYY')
myJob=server.get\u作业(“\u测试”)
myConfig=myJob.get\u config()
打印myConfig
new=myConfig.replace('clean','stringbean'))
myJob.update_config(新)

对于那些使用RestSharp的人,我发现我需要确保:

  • 执行更新的用户ID有权在管理>全局安全>授权矩阵下执行更新
  • 我有一个当前的Jenkins Crump令牌,在启用CSRF(也在管理>安全性下)后需要
  • 使用类型参数值为
    [ParameterType.RequestBody]
    (link)的请求对象的参数发送更新的XML

    private XmlDocument JobConfigGet()
    {
        Uri JobConfigURI = GetJenkinsURI("job/" + _args.JobName + "/config.xml", null);
        RestClient restClient = new RestClient(JobConfigURI);
        RestRequest restRequest = new RestRequest(Method.GET);
    
        byte[] ua = Encoding.ASCII.GetBytes(Properties.Settings.Default.UserID + ":" + Properties.Settings.Default.UserPassword);
        restRequest.AddHeader("authorization", "Basic " + Convert.ToBase64String(ua));
        IRestResponse restResponse = restClient.Execute(restRequest);
    
        if (restResponse.ResponseStatus != ResponseStatus.Completed || restResponse.StatusCode != HttpStatusCode.OK)
            throw new Exception(string.Format("Unable to retrieve job config: {0}. Wrong ResponseStatus ({1}) or StatusCode ({2}) returned.\nURL: {3}", _args.JobName, restResponse.ResponseStatus.ToString(), restResponse.StatusCode.ToString(), restClient.BaseUrl.AbsoluteUri));
        if (restResponse.ContentType != "application/xml")
            throw new Exception("Unexpected data type returned for job config: " + _args.JobName + ".  Expected 'application/xml'. Got: " + restResponse.ContentType + ".\nURL: " + restClient.BaseUrl.AbsoluteUri);
    
        XmlDocument jobConfig = new XmlDocument();
        jobConfig.LoadXml(restResponse.Content);
        return jobConfig;
    }
    
    private void JobConfigUpdate(XmlDocument JobConfig, string JenkinCrumb)
    {
        // Update JobConfig XML as needed here.
        Uri JobConfigURI = GetJenkinsURI("job/" + _args.JobName + "/config.xml", null);
        RestClient restClient = new RestClient(JobConfigURI);
    
        RestRequest restRequest = new RestRequest(Method.POST);
        byte[] ua = Encoding.ASCII.GetBytes(Properties.Settings.Default.UserID + ":" + Properties.Settings.Default.UserPassword);
        restRequest.AddHeader("authorization", "Basic " + Convert.ToBase64String(ua));
    
        string[] crumbSplit = JenkinCrumb.Split(':');
        restRequest.AddHeader(crumbSplit[0], crumbSplit[1]);
        restRequest.AddParameter("text/xml", JobConfig.InnerXml, ParameterType.RequestBody);
    
        IRestResponse restResponse = restClient.Execute(restRequest);
        string resp = restResponse.Content;
    }
    

  • 为什么不回答代码本身,博客链接可能会消失最终发现这个真正有用的配方,如何更新config.xml^这个链接是完美的。但是,如果jenkins在POST请求中向您提供错误“403 crumb未包含”,则“全局安全设置”中有一个选项“为代理启用兼容模式”。关闭此选项,您的POST请求应该可以工作。作业DSL插件只能用于维护该插件以前创建的作业。看起来很不方便,没有多大用处,只好摆弄了。我一直在努力解决这个问题。