获取jenkins中的构建数据

背景

搭建效能看板,需要获取jenkins中一些job的数据作为数据源输入。

使用node配合jenkins库进行数据获取,jenkins库为:https://www.npmjs.com/package/jenkins

安装:npm i jenkins

准备工作

使用Jenkins获取数据需要知道Jenkins的URL,以及用户名和apiToken。

Jenkins中每个用于构建和测试代码的项目被称为Job,它是 Jenkins 的基本执行单元。

想要同时获取多个job中的数据,可以通过View将Job分类。Jenkins View 是一个逻辑分组工具,用于对 Job 进行分类和管理。随着 Jenkins 中 Job 数量的增加,View 可以帮助用户更清晰地组织和查找任务。

这里我们将需要统计的Job都放到View1中。

代码

javascript 复制代码
const jenkinsApi = require('jenkins');
const moment = require('moment');

async function getJobBuildHistory({
    jenkinsUrl,
    viewName,
    username,
    apiToken,
    startTime,
    endTime
}) {

    const jenkins = new jenkinsApi({ baseUrl: `http://${username}:${apiToken}@${jenkinsUrl}`, crumbIssuer: true });

    const end = endTime ? moment(endTime) : moment();
    const start = startTime ? moment(startTime) : end.clone().subtract(1, 'days');
    const startTs = start.valueOf();
    const endTs = end.valueOf();

    try {
        const view = await jenkins.view.get(viewName);
        const jobs = view.jobs.map(job => job.name);

        const buildHistory = [];

        for (const jobName of jobs) {

            try {
                const builds = await jenkins.job.get(jobName, { depth: 1 });

                for (const build of builds.builds) {
                    const buildInfo = await jenkins.build.get(jobName, build.number);
                    const buildTs = moment(buildInfo.timestamp).valueOf();

                    if (buildTs < startTs) {
                        break;
                    }
                    if (buildTs > endTs) continue;

                    buildHistory.push({
                        jobName,
                        buildNumber: build.number,
                        startTime: moment(buildInfo.timestamp).format('YYYY/MM/DD-HH:mm:ss'),
                        duration: Math.round(buildInfo.duration / 1000),
                        status: buildInfo.result || 'RUNNING',
                        triggeredBy: buildInfo.actions.find(a => a?.causes)?.causes[0]?.shortDescription?.replace('Started by ', '') || 'UNKNOWN'
                    });
                }
            } catch (e) {
                console.error(`  Job processing failed: ${e.message}`);
            }
        }
        return buildHistory;
    } catch (e) {
        throw new Error(`View error: ${e.message}`);
    }
}

exports.getCiData = async (req, res) => {
    const { startTime, endTime } = req.body;
    try {
        const history = await getJobBuildHistory({
            jenkinsUrl: 'your jenkins url,
            viewName: 'View1',
            username: 'your username',
            apiToken: 'your token',
            startTime,
            endTime
        });

        return res.success(history, 200, '查询成功');
    } catch (error) {
        return res.server_error(error);
    }
};
相关推荐
天若有情6733 分钟前
Node.js 是什么?npm 是什么? Vue 为什么需要他们?
vue.js·npm·node.js
爱敲代码的小冰1 小时前
npm 切换 node 版本 和npm的源
前端·npm·node.js
甜瓜看代码11 小时前
1.
react.js·node.js·angular.js
伍哥的传说11 小时前
React 实现五子棋人机对战小游戏
前端·javascript·react.js·前端框架·node.js·ecmascript·js
01传说12 小时前
vue3 配置安装 pnpm 报错 已解决
java·前端·vue.js·前端框架·npm·node.js
摘星小杨15 小时前
如何卸载本机的node.js
node.js
Q_Q5110082851 天前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
摘星小杨2 天前
安装nvm管理node.js,详细安装使用教程和详细命令
node.js·nvm
灋✘逞_兇2 天前
Node.Js是什么?
服务器·javascript·node.js
归于尽2 天前
回调函数在Node.js中是怎么执行的?
前端·javascript·node.js