2016-06-16 17 views
7

Sto cercando di utilizzare Node.js per creare in modo programmatico i lavori Jenkins che prendono i parametri Git.Jenkins Git Plugin non riceve i parametri registrati

Sto inviando i parametri come dati post, come mostrato di seguito. Tuttavia, indipendentemente dal valore assegnato a ref, Jenkins esegue la generazione con il valore del parametro predefinito (specificato nella configurazione del lavoro). Ho provato a passare i parametri come stringhe di query nell'URL, ma anche questo non ha funzionato.

Sto usando Jenkins v1.651.1 e Nodo v6.2.0.

var jobOptions = { 
    url: requestedJobObject.url + 'build', 
    method: 'POST', 
    port: 8080 
}; 

// parameters = { "name": "ref", "value": "origin/master" } 
if (!_.isEmpty(parameters)) { 

    var jsonParametersString = JSON.stringify({"parameter": parameters}); 
    var parameterParam = encodeURIComponent(jsonParametersString); 
    parameters.json = parameterParam; 

    jobOptions.headers = { 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'Content-Length': querystring.stringify(parameters).length 
    }; 

    jobOptions.url += 'WithParameters'; 

    postData = querystring.stringify(parameters); 
} 

// jobOptions contains auth field & separates url into hostname and path 
// makes an http request to jobOptions and calls req.write(postData) 
makeRequest(jobOptions, callback, responseCB, postData) 

makeRequest effettua una richiesta http:

function makeRequest (object, callback, responseCB, postData) { 
    var accumulator = ''; 

    var parsedUrl = u.parse('//' + object.url, true, true); 

    var options = { 
     hostname: parsedUrl.hostname, 
     port: object.port || 8080, 
     path: parsedUrl.path, 
     method: object.method || 'GET', 
     auth: getAuthByHost(parsedUrl.hostname) 
    }; 

    if (object.headers) { 
     options.headers = object.headers; 
    } 

    var response = null; 
    var req = http.request(options, function(res) { 
     response = res; 

     res.on('data', function (data) { 
      accumulator = accumulator + data.toString(); 
      res.resume(); 
     }); 

     res.on('close', function() { 
      // first assume accumulator is JSON object 
      var responseContent; 
      try { 
       responseContent = JSON.parse(accumulator); 
      } 
      // if not object, use accumulator as string 
      catch (err) { 
       responseContent = accumulator; 
      } 

      callback(responseContent, response.statusCode); 


      if (responseCB) { 
       responseCB(res); 
      } 

     }); 
    }); 

    req.on('close', function() { 

     // first assume accumulator is JSON object 
     var responseContent; 
     try { 
      responseContent = JSON.parse(accumulator); 
     } 
     catch (err) { 
      responseContent = accumulator; 
     } 

     callback(responseContent, response.statusCode); 

     if (responseCB) { 
      responseCB(response); 
     } 

    }); 

    if (postData) { 
     req.write(postData); 
    } 

    req.end(); 
} 
+0

puoi condividere il tuo metodo makeRequest? –

+0

@Tizkiko ha aggiornato la domanda per contenere la funzione makeRequest –

risposta

4

provare questo, per me funziona:

var auth = 'Basic yourUserToken'; 
var jobOptions = { 
    url:'jenkinsHostName:8080/jenkins/job/jobName/' +'build', 
    method: 'POST', 
    port: 8080 
}; 

var parameter = {"parameter": [{"name":"ref", "value":"origin/master"}]}; 
var postData; 
if (!_.isEmpty(parameter)) { 

    var jsonParametersString = JSON.stringify(parameter); 
    jobOptions.headers = { 
     'Authorization':auth, 
     'Content-Type': 'application/x-www-form-urlencoded', 
    }; 

    jobOptions.url += '?token=jobRemoteTriggerToken'; 
    postData = "json="+jsonParametersString; 

    console.log("postData = " + postData); 
} 
var callback; 
var responseCB; 
makeRequest(jobOptions, callback, responseCB, postData) ; 

Si basa sul codice. Ho rimosso la querystring - sembra che abbia restituito una stringa vuota quando eseguita sull'oggetto parameters. Ho modificato/buildWithParameters in/build - non ha funzionato nell'altro modo.

Inoltre, verificare che quando si passa il 'Content-Length' nell'intestazione, non viene troncato l'oggetto parametri json (l'ho rimosso).

nota anche che ho utilizzato il token dell'API utente, che è possibile ottenere a http://yourJenkinsUrl/me/configure e fare clic sul pulsante "Token dell'API mostrato". enter image description here

+0

Quanto sopra ha funzionato per i parametri git? Quando eseguo il precedente (con parametro hardcoded e jobRemoteTriggerToken), Jenkins non sta ancora registrando che sto passando dei parametri git a tutti. Una differenza è che sto usando l'autenticazione Github con Jenkins invece del token API utente –

+0

Update: quando eseguo il codice precedente con un parametro stringa, Jenkins registra che sto provando a passare un parametro, ma non registro il valore che Passo. Sul client web, la casella dei parametri dice KEY (il nome del parametro), con una casella vuota accanto ad essa (campo del valore vuoto). –

+0

@JanetC. hai ancora quel problema? hai rimosso la lunghezza del contenuto? notare anche che ho usato/build e non/buildWithParameters –

2

Non sono sicuro di questo, come io non lo so Node.js - ma forse questo si inserisce: il Jenkins remote access API indica che il parametro entità nel La richiesta json deve indicare un array , anche se è necessario definire un solo parametro.

La modifica in basso risolve il problema (notare le parentesi angolari intorno a parameters)?

[...] 
var jsonParametersString = JSON.stringify({"parameter": [parameters]}); 
[...] 
Problemi correlati