2016-06-16 13 views
7

Git parametrelerini alan Jenkins işlerini programsal olarak oluşturmak için Node.js'yi kullanmaya çalışıyorum.Jenkins Git Eklentisi gönderilmiş parametreleri almıyor

Parametreleri aşağıda gösterildiği gibi posta verileri olarak gönderiyorum. Bununla birlikte, ref'a hangi değeri atarım önemsiz olursa, Jenkins yapıyı varsayılan parametre değeriyle (işin yapılandırmasında belirtilir) çalıştırır. URL'de sorgu dizeleri olarak parametreler geçmeyi denedim, ancak bu da işe yaramadı.

Jenkins v1.651.1 ve Node v6.2.0 kullanıyorum. Ben node.js bilmiyorum olarak, bu konuda

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

makeRequest yönteminizi paylaşabilir misiniz? –

+0

@Tizkiko, makeRequest işlevini içeren soruyu güncelleştirdi –

cevap

4

bu deneyin, benim için çalışıyor:

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

Bu sizin koduna dayanmaktadır. Querystring'i kaldırdım - parametre nesnesinde gerçekleştirildiğinde boş bir dize döndürdüğü görülüyor. Ben/buildWithParameters değiştirmek/inşa - başka şekilde işe yaramadı. Ayrıca, üstbilgideki 'İçerik Uzunluğu'nu geçtiğinizde, json parametresi nesnesini kesmediğini doğrulayın (onu kaldırdım). Üste |

ayrıca, kullanıcı API belirtecini kullandığını, http://yourJenkinsUrl/me/configure numaralı telefonu kullanabileceğinizi ve "Gösterilen API Simgesi" düğmesini tıklattığını unutmayın. enter image description here

+0

Yukarıdaki parametreler git parametresi için mi çalıştı? Yukarıdakileri çalıştırdığımda (hardcoded parametresi ve jobRemoteTriggerToken ile) Jenkins hala git parametrelerinden hiç geçmediğimi kaydetmiyor. Bir fark, kullanıcı API belirteci yerine Jenkins ile Github kimlik doğrulaması kullanıyorum. –

+0

Güncelleştirme: Yukarıdaki kodu bir dize parametresiyle çalıştırdığımda, Jenkins bir parametrede geçmeye çalıştığımı kaydeder, ancak bu değeri kaydetmez. İçeri giriyorum. Web istemcisinde, parametreler kutusunda KEY (parametre adı), yanında boş bir kutucuk (boş değer alanı) yazıyor. –

+0

@JanetC. hala bu sorun var mı? içerik uzunluğunu kaldırdınız mı? Ayrıca/build ve not/buildWithParameters –

2

Emin değilim - ama belki bu uyuyor:

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 bir http istekte Jenkins remote access API gösterir parametre varlık json isteği, tanımlanacak tek bir parametre olsa bile dizisini işaret etmelidir.

Aşağıdaki değişiklik sorunu çözüyor mu (parameters etrafındaki köşeli parantezlere dikkat edin)?

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