【问题标题】:Starting a Jenkins Job using Javascript [closed]使用 Javascript 启动 Jenkins 作业 [关闭]
【发布时间】:2019-05-19 02:31:25
【问题描述】:

有没有人有使用 auth 开始 jenkins 工作并在 Java Script 中参数化的示例?

它就像一个 curl 帖子,但我不确定如何准确地做到这一点,我找不到任何传递用户名和令牌以及参数的示例。

【问题讨论】:

    标签: javascript jenkins jenkins-api


    【解决方案1】:

    您可以使用jenkins npm library 使用特定用户对 npm 执行操作:

    import Jenkins = require('jenkins');
    
    const jenkins
    
    Jenkins({ baseUrl: `https://${ username }:${ password }@${ urlToJenkinsInstance }`, crumbIssuer: true })
          .then((_jenkins) => {
            jenkins = _jenkins;
    
            return new Promise((resolve, reject) => {
              // start building a job
              jenkins.job.build({
                name: jobName,
                // put all the parameters here:
                parameters: {
                  PARAM1: 'hello',
                  PARAM2: 'world'
                }
              }, function (err, data) {
                if (err) { return reject(err); }
    
                resolve(data);
              });
            });
          })
          .then((queueId) => {
            console.log('job queueId: ', queueId);
          })
          .catch(printErrorAndExit);
    

    如果您需要继续监控流程,在将作业添加到队列后,您需要等待作业开始,这将使用jenkins.queue.item(queueId, callback)jobId 添加到队列项中。

    然后,您可以监控实际作业并检查它何时完成。

    在下面的代码中,我定义了两个函数convertQueueIdToBuildIdwaitForJobToFinish

    convertQueueIdToBuildId

    这将等待队列项目获得永久 ID 以启动并检查作业状态。我定义了每隔 5 秒检查一次的时间间隔。

    waitForJobToFinish

    这将获得永久的jobId 并每 5 秒检查一次作业的状态。如果是SUCCESS,我们可以解决这个promise,如果我们得到ABORTEDFAILURE,我们会错误的promise 表明有些事情进展不顺利。我们可以根据使用情况来处理使 promise 失败或解决的原因。

    // continuing the previous promise chain:
      .then((queueId) => convertQueueIdToBuildId(jenkins, jobName, queueId, 5000))
      .then((buildId) => waitForJobToFinish(jenkins, jobName, buildId, 5000))
      .catch(printErrorAndExit);
    
    function convertQueueIdToBuildId(jenkins, jobName, queueId, interval, spinner) {
      return convertQueueIdToBuildIdInner(queueId)
        .then((data) => {
          if (isNumber(data)) {
            return data;
          }
    
          return waitFor(interval)
            .then(() => convertQueueIdToBuildId(jenkins, jobName, queueId, interval, spinner));
        });
    
      function convertQueueIdToBuildIdInner(queueId) {
        return new Promise((resolve, reject) => {
          jenkins.queue.item(queueId, (err, data) => {
            if (err) {
              return reject(err);
            }
    
            resolve(data && data.executable && data.executable.number);
          });
        });
      }
    }
    
    function waitForJobToFinish(jenkins, jobName, buildId, interval) {
      return waitForJobToFinishInner(jobName)
        .then((data) => {
          if ('SUCCESS' === data.result) {
            return data;
          }
    
          if (['ABORTED', 'FAILURE'].indexOf(data.result) > -1) {
            const errorMessage = `JENKINS[${ jobName }:${ buildId }] job ${ data.result }`;
            throw new Error(errorMessage);
          }
    
          return waitFor(interval)
            .then(() => waitForJobToFinish(jenkins, jobName, buildId, interval));
        });
    
      function waitForJobToFinishInner(jobName) {
        return new Promise((resolve, reject) => {
          jenkins.build.get(jobName, buildId, function (err, data) {
            if (err) {
              return reject(err);
            }
    
            resolve(data);
          });
        });
      }
    }
    
    function waitFor(interval) {
      return new Promise((resolve) => setTimeout(() => resolve(), interval));
    }
    

    【讨论】:

    • 这不能通过简单的javascript curl方法而不是使用npm来完成吗?
    • @Jason 如果你想这样做的话,你可以在没有额外库的情况下完全做到这一点。基本上,this 是您在节点中执行 HTTP 请求的方式,here 您可以找到每个 Jenkins 路径是什么(您应该使用与我在答案中使用的等效路径)。在我看来,不使用一些你可以检查他们的代码是否有问题的开源库需要做很多额外的工作,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多