【问题标题】:Jenkins Git Plugin does not receive posted ParametersJenkins Git 插件没有收到发布的参数
【发布时间】:2016-10-18 10:32:20
【问题描述】:

我正在尝试使用 Node.js 以编程方式构建采用 Git 参数的 Jenkins 作业。

我将参数作为post数据发送,如下所示。但是,无论我为ref 分配什么值,Jenkins 都会使用默认参数值(在作业配置中指定)运行构建。我尝试在 URL 中将参数作为查询字符串传递,但这也不起作用。

我正在使用 Jenkins v1.651.1 和 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 发出一个 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();
}

【问题讨论】:

  • 你能分享你的makeRequest方法吗?
  • @Tizkiko 更新了问题以包含 makeRequest 函数
  • 看到 GitLab 插件不接受任意参数。有一个问题悬而未决:github.com/jenkinsci/gitlab-plugin/issues/912 值得投票。

标签: node.js jenkins


【解决方案1】:

试试这个,它对我有用:

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

它基于您的代码。我删除了查询字符串 - 在参数对象上执行时,它似乎返回了一个空字符串。我将 /buildWithParameters 更改为 /build - 它没有以其他方式工作。

此外,验证当您在标头中传递“Content-Length”时,它不会截断您的 json 参数对象(我删除了它)。

还请注意,我使用了用户 API 令牌,您可以通过 http://yourJenkinsUrl/me/configure 获取并单击“显示 API 令牌”按钮。

【讨论】:

  • 以上对 git 参数有效吗?当我运行上述(使用硬编码参数和 jobRemoteTriggerToken)时,Jenkins 仍然没有注册我正在传递 git 参数。一个区别是我使用 Jenkins 的 Github 身份验证而不是用户 API 令牌
  • 更新:当我使用字符串参数运行上述代码时,Jenkins 会注册我尝试传入的参数,但不会注册我传入的值。在 Web 客户端上,参数框显示 KEY(参数名称),旁边有一个空框(空值字段)。
  • @JanetC。你还有这个问题吗?您是否删除了内容长度?另请注意,我使用 /build 而不是 /buildWithParameters
  • 啊哈!将 /buildWithParameters 更改为 /build 修复了它!
  • @JanetC.great!我在答案中添加了注释
【解决方案2】:

对此不确定,因为我不知道 Node.js——但也许这适合:Jenkins remote access API 表示 json 请求中的参数实体必须指向一个 数组,即使只定义一个参数。

下面的更改是否解决了问题(注意parameters 周围的尖括号)?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-28
    • 2017-09-22
    • 1970-01-01
    • 2014-09-12
    • 2017-04-10
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多