Ответ 1
если кто-то еще ищет тот же ответ,
Похоже, решение намного проще, все, что вам нужно сделать, это обновить файл config.xml и отправить обновленный файл config.xml обратно в jenkins, и ваше задание будет обновлено.
Мне нужно создать/обновить задание jenkins, используя его api, потому что все мои задания используют параметры, которые также используются другими скриптами, и я пытаюсь централизовать скрипты, поэтому, когда я меняю его в одном месте, изменение отражает в целом.
В настоящее время, если кто-то изменяет script, они также должны вручную отредактировать параметры задания jenkins.
Я увидел пример Remote API для создания заданий и смог успешно создать тестовые задания, но как я могу редактировать существующее задание, кроме удаления его и создания его снова (что не является вариантом, поскольку я должен поддерживать историю сборки).
если кто-то еще ищет тот же ответ,
Похоже, решение намного проще, все, что вам нужно сделать, это обновить файл config.xml и отправить обновленный файл config.xml обратно в jenkins, и ваше задание будет обновлено.
Вы можете использовать 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)
Вы также можете 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/
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
Для тех, кто использует RestSharp, я обнаружил, что мне нужно убедиться, что:
Отправьте обновленный 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;
}
Возможно, вы захотите использовать https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin.