【问题标题】:Triggering a Jenkins build using node js使用节点 js 触发 Jenkins 构建
【发布时间】:2018-07-22 15:31:26
【问题描述】:

我有一个将文件作为输入的詹金斯工作。作业读取输入文件,然后处理作业。

我正在尝试从节点 js 脚本运行 jenkins 作业。我可以使用 jenkins api for npm 运行特定的作业。

我的问题是我无法通过传递所需的文件来运行作业。

在 Jenkins 中,我必须找到特定的工作,然后迁移到它,然后单击“使用参数构建”,然后选择文件并构建。

我试图通过一个将文件作为输入并将其提交给节点 js 脚本的反应 UI 来简化这一点。现在该脚本必须将文件上传到 Jenkins,然后构建作业。

节点js代码是,

var file0 = '/Users/m0a00pf/Documents/react-js/asda/src/files/APA.csv';
exports.buildJenkinsJob = function buildJenkinsJob(){
    jenkins.job.build({"name":"Create a job",
                    "parameters":
                        {
                             "name": "\\src\\main\\resources\\com\\asda\\qa\\data\\APA\\APA.csv", "file": file0
                        }
                    }
                    ,function(err, data){
        if(err)
            throw err;
        else
            console.log(data);
    });
}

参数部分不起作用。当我跑步时。

jenkins.job.build({"Create a job"});

这很好用。

【问题讨论】:

  • 将文件推送到 Jenkins 服务器听起来很不寻常。我认为让 Jenkins 从某个地方提取所需文件更为常见。你的情况有可能吗?
  • 您的问题仍然缺少步骤。列出问题,然后分享相关代码。除了"How to ask" 建议之外,您还需要首先以一种关注您的研究之后仍然存在的差距的方式来陈述问题。然后描述您迄今为止的策略、代码设置 + 条件以及错误/问题。还要说明您已经知道的“明显”上下文,以便人们了解您的尝试。另见12

标签: javascript node.js file jenkins build


【解决方案1】:

将选项更改为,

    var options = {
      method: 'POST',
      url: 'http://localhost/job/JobName/buildWithParameters?delay=0sec&Jenkins-Crumb=asdf345672das',
      auth : {
           username : jenkins.username,
           password : jenkins.password
      },
      headers:
       {
        'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
       },
      body:
       {
        'fileParameterName' :
                    { value: fs.createReadStream(absoluteFilePath), options: { filename: FileName, contentType: null } },
         'param': 'value'
       }

    };

【讨论】:

    【解决方案2】:

    有一种简单的 JS 方法可以做到这一点,只有流行的库,如 Axios 和 form-data

    var axios = require('axios');
    var FormData = require('form-data');
    var fs = require('fs');
    var data = new FormData();
    
    const jenkinsUrl = 'http://example_jenkins_server_url.com/job/<JOB_NAME>/build';
    // notice the URL has build not buildWithParameters if the job has file parameters. ^
    const userName = 'example_user';
    const password = 'example_pass'
    
    const params = {"parameter": [
      // file0 here is the field name we are appending to data object, 
      // this informs Jenkins which file maps to which job parameter, so even multiple file uploads can be done using this approach!
      {"name":"<Name Of file parameter in Job>", "file":"file0"}
      // incase you have additional string parameters you need to pass add it here. 
      {"name": "StringParam1", "value": "value"}
    ]}
    
    data.append('file0', fs.createReadStream(<full file path>));
    data.append('json', JSON.stringify(params));
    
    var config = {
      method: 'post',
      url: jenkinsUrl,
      headers: { 
        Authorization: `Basic ${Buffer.from(`${userName}:${password}`).toString('base64')}`,
        ...data.getHeaders()
      },
      data : data
    };
    
    axios(config)
    .then(function (response) {
      console.log(JSON.stringify(response.data));
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2021-01-18
      • 2013-04-24
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多