Как я могу обновить работу jenkins, используя api

Мне нужно создать/обновить задание jenkins, используя его api, потому что все мои задания используют параметры, которые также используются другими скриптами, и я пытаюсь централизовать скрипты, поэтому, когда я меняю его в одном месте, изменение отражает в целом.

В настоящее время, если кто-то изменяет script, они также должны вручную отредактировать параметры задания jenkins.

Я увидел пример Remote API для создания заданий и смог успешно создать тестовые задания, но как я могу редактировать существующее задание, кроме удаления его и создания его снова (что не является вариантом, поскольку я должен поддерживать историю сборки).

Ответы

Ответ 1

если кто-то еще ищет тот же ответ,

Похоже, решение намного проще, все, что вам нужно сделать, это обновить файл config.xml и отправить обновленный файл config.xml обратно в jenkins, и ваше задание будет обновлено.

Ответ 2

Вы можете использовать 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)

Ответ 3

Вы также можете POST обновить config.xml к URL-адресу, который может получить config.xml, чтобы программно обновить конфигурацию задания.

Рисунок url: $JENKINS_SERVER/job/$JOB_NAME/config.xml

подробный образец документа: $JENKINS_SERVER/job/$JOB_NAME/api

example: https://ci.jenkins-ci.org/job/infra_atlassian-base/api/

Ответ 4

http://asheepapart.blogspot.ca/2014/03/use-jenkins-rest-api-to-update-job.html

Этот немного скриптов выглядит так, как вы ищите. Использует 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

Ответ 5

Для тех, кто использует RestSharp, я обнаружил, что мне нужно убедиться, что:

  • Идентификатор пользователя, выполняющий обновление, имел разрешение сделать это в разделе Управление > Глобальная безопасность > Матрица авторизации
  • У меня был токен Jenkins Crumb, необходимый после того, как включен CSRF (также под управлением > Безопасность).
  • Отправьте обновленный XML с помощью параметра объекта Request со значением [ParameterType.RequestBody] (link) 1 для аргумент типа.

    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;
    }