web-dev-qa-db-fra.com

Comment puis-je mettre à jour un travail Jenkins en utilisant l'API

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).

18
dsymquen

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.

10
dsymquen

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)
15
Dave

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/

5
Frank Chen

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
3
user2800006

Pour ceux qui utilisent RestSharp, j'ai découvert que je devais m'assurer que:

  1. L'ID utilisateur effectuant la mise à jour était autorisé à le faire sous Gestion> Sécurité globale> Matrice d'autorisation
  2. J'avais un jeton Jenkins Crumb actuel, requis une fois que CSRF (également sous Gestion> Sécurité) est activé.
  3. 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;
    }
    
0
Dave Michener