wake-up-neo.net

Wie kann ich einen Jenkins-Job mit der API aktualisieren?

Ich muss einen jenkins-Job mit seiner API erstellen/aktualisieren, da alle meine Jobs Parameter verwenden, die auch von anderen Skripts verwendet werden. 

wenn jemand das Skript ändert, muss er derzeit auch die Parameter des Jenkins-Jobs manuell bearbeiten.

Ich habe das Beispiel der Remote-API zum Erstellen von Jobs gesehen und konnte erfolgreich Testjobs erstellen. Wie kann ich jedoch einen vorhandenen Job bearbeiten, außer ihn löschen und erneut erstellen (was keine Option ist, da ich den Build-Verlauf beibehalten muss).

18
dsymquen

für den Fall, dass auch jemand nach der gleichen Antwort sucht,

Es scheint, dass die Lösung viel einfacher ist. Alles, was Sie tun müssen, ist, die config.xml zu aktualisieren und die aktualisierte config.xml an jenkins zurückzusenden. Ihr Job wird aktualisiert.

10
dsymquen

Sie könnten Python so verwenden:

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

Sie können auch eine aktualisierte config.xml POST für die URL, die config.xml abrufen kann, verwenden, um die Konfiguration eines Jobs programmgesteuert zu aktualisieren.

Das Abruf-URL-Muster: $JENKINS_SERVER/job/$JOB_NAME/config.xml

detailliertes Dokumentmuster: $JENKINS_SERVER/job/$JOB_NAME/api

beispiel: 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

Dieses bisschen Scripting scheint das zu sein, wonach Sie suchen. Verwendet die API REST, um die Konfiguration mit einem regulären S & R in der Mitte abzurufen und festzulegen.

Bearbeiten: Code unten basierend auf Kommentar. Es wird direkt aus dem Blog kopiert, daher nehme ich keine Anerkennung dafü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
3
user2800006

Für diejenigen, die RestSharp verwenden, habe ich festgestellt, dass ich Folgendes sicherstellen muss:

  1. Die Benutzer-ID, die das Update durchführt, hatte die Berechtigung dazu unter Verwalten> Globale Sicherheit> Berechtigungsmatrix
  2. Ich hatte ein aktuelles Jenkins-Crumb-Token, das erforderlich ist, sobald CSRF (auch unter Verwalten> Sicherheit) aktiviert ist.
  3. Senden Sie das aktualisierte XML mit einem Parameter des Request-Objekts mit dem Wert [ParameterType.RequestBody] (link) 1 für das Typargument.

    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

Möglicherweise möchten Sie https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin verwenden.

0
Noel Yap