Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jenkins Git Plugin does not receive posted Parameters

I am trying to use Node.js to programmatically build Jenkins jobs that take Git parameters.

I am sending the parameters as post data, as shown below. However, no matter what value I assign to ref, Jenkins runs the build with the default parameter value (specified in the job's configuration). I have tried passing in the parameters as query strings in the URL, but that also did not work.

I am using Jenkins v1.651.1 and Node 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 makes an http request:

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();
}
like image 481
Janet C. Avatar asked Jun 16 '16 18:06

Janet C.


2 Answers

try this, it works for me:

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

It is based on your code. I removed the querystring - it seems that it returned an empty string when performed on the parameters object. I change /buildWithParameters to /build - it didn't work the other way.

In addition, verify that when you pass the 'Content-Length' in the header, it doesn't truncated your json parameters object (I removed it ).

also note that I used the user API token, that you can get at http://yourJenkinsUrl/me/configure and click the "Shown API Token" button. enter image description here

like image 82
Tidhar Klein Orbach Avatar answered Oct 06 '22 19:10

Tidhar Klein Orbach


Not sure about this, as I don't know Node.js -- but maybe this fits: the Jenkins remote access API indicates that the parameter entity in the json request must point to an array, even if there's just one parameter to be defined.

Does the change below fix the problem (note the angle brackets around parameters)?

[...]
var jsonParametersString = JSON.stringify({"parameter": [parameters]});
[...]
like image 36
Alex O Avatar answered Oct 06 '22 21:10

Alex O