首页 > 解决方案 > 使用 Javascript 启动 Jenkins 作业

问题描述

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

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

标签: javascriptjenkinsjenkins-api

解决方案


您可以使用jenkinsnpm 库使用特定用户对 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);

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

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

在下面的代码中,我定义了两个名为convertQueueIdToBuildId和的函数waitForJobToFinish

convertQueueIdToBuildId

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

waitForJobToFinish

这将获得永久jobId并每 5 秒检查一次作业的状态。如果它是SUCCESS,我们可以解决这个承诺,如果我们得到一个ABORTEDor FAILURE,我们会错误地表示某些事情进展不顺利。我们可以根据使用情况来处理使 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));
}

推荐阅读