簡體   English   中英

使用節點 js 觸發 Jenkins 構建

[英]Triggering a Jenkins build using node js

我有一個 jenkins 工作,它將文件作為輸入。 作業讀取輸入文件,然后處理作業。

我正在嘗試從節點 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"});

這工作正常。

將選項更改為,

    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'
       }

    };

有一種簡單的 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));
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM