获取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);
    }
};
相关推荐
自学也学好编程15 分钟前
【BUG】nvm无法安装低版本Node.js:The system cannot find the file specified解决方案
node.js·bug
牧码岛15 分钟前
服务端之nestJS常用异常类及封装自定义响应模块
node.js·nestjs
奕辰杰6 小时前
关于npm前端项目编译时栈溢出 Maximum call stack size exceeded的处理方案
前端·npm·node.js
yzzzzzzzzzzzzzzzzz16 小时前
node.js之Koa框架
node.js
Java陈序员17 小时前
轻松设计 Logo!一款 Pornhub 风格的 Logo 在线生成器!
vue.js·node.js·vite
gongzemin19 小时前
使用Node.js开发微信第三方平台后台
微信小程序·node.js·express
JavaDog程序狗1 天前
【软件环境】Windows安装NVM
前端·node.js
自学也学好编程1 天前
【工具】NVM完全指南:Node.js版本管理工具的安装与使用详解
node.js
Moment1 天前
调试代码,是每个前端逃不过的必修课 😏😏😏
前端·javascript·node.js
萌萌哒草头将军2 天前
Prisma ORM 又双叒叕发布新版本了!🚀🚀🚀
前端·javascript·node.js