Je dois créer/mettre à jour un travail jenkins à l'aide de son API, car tous mes travaux utilisent des paramètres qui sont également utilisés par d'autres scripts et j'essaie de centraliser les scripts.
actuellement, si quelqu'un modifie le script, il doit également modifier manuellement les paramètres du travail jenkins.
J'ai vu l'exemple de l'API distante pour créer des tâches et j'ai réussi à créer des tâches de test, mais comment puis-je modifier une tâche existante en plus de la supprimer et de la recréer (ce qui n'est pas une option car je dois conserver l'historique de génération).
si quelqu'un d'autre cherche aussi la même réponse,
Il semble que la solution soit beaucoup plus simple. Il suffit de mettre à jour le fichier config.xml et de poster le fichier config.xml mis à jour dans jenkins pour que votre travail soit mis à jour.
Vous pouvez utiliser python comme ceci:
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)
Vous pouvez également POST un fichier config.xml mis à jour avec l'URL pouvant extraire config.xml
, pour mettre à jour par programme la configuration d'un travail.
Le modèle d'URL d'extraction: $JENKINS_SERVER/job/$JOB_NAME/config.xml
modèle de document détaillé: $JENKINS_SERVER/job/$JOB_NAME/api
exemple: https://ci.jenkins-ci.org/job/infra_atlassian-base/api/
http://asheepapart.blogspot.ca/2014/03/use-jenkins-rest-api-to-update-job.html
Ce peu de script semble être ce que vous recherchez. Utilise l’API REST pour obtenir et définir la configuration avec des regex S & R au milieu.
Edit: Code ci-dessous basé sur le commentaire. Il est copié directement du blog, je n’en prends donc aucun crédit.
# 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
Pour ceux qui utilisent RestSharp, j'ai découvert que je devais m'assurer que:
Envoyez le fichier XML mis à jour à l'aide d'un paramètre de l'objet Request avec la valeur [ParameterType.RequestBody]
(link) 1 pour l'argument de type.
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;
}