UNPKG

long-git-cli

Version:

A CLI tool for Git tag management.

110 lines 4.12 kB
"use strict"; /** * Jenkins 部署器 * 用于触发 Jenkins 构建并监听构建状态 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.JenkinsDeployer = void 0; /** * Jenkins 部署器类 */ class JenkinsDeployer { constructor(jenkinsClient) { this.jenkinsClient = jenkinsClient; } /** * 触发部署并等待完成 * @param jobName Jenkins Job 名称 * @param parameters 构建参数 * @param options 部署选项 * @returns 最终的构建信息 */ async deploy(jobName, parameters, options = {}) { const { pollInterval = 10000, // 默认 10 秒 timeout = 30 * 60 * 1000, // 默认 30 分钟 onProgress, } = options; const startTime = Date.now(); console.log(`触发 Jenkins 部署: ${jobName}`); console.log(`参数:`, parameters); /** 触发构建 */ const queueId = await this.jenkinsClient.triggerBuild(jobName, parameters); console.log(`构建已加入队列: ${queueId}`); /** 等待构建开始(从队列中获取构建编号) */ console.log(`等待构建开始...`); const buildNumber = await this.jenkinsClient.waitForQueueToBuild(queueId, 10 * 60 * 1000 // 最多等待 10 分钟 ); console.log(`🔨 构建已开始: #${buildNumber}`); /** 轮询构建状态 */ while (true) { /** 检查超时 */ if (Date.now() - startTime > timeout) { throw new Error(`构建超时 (${timeout / 1000}秒),构建编号: #${buildNumber}`); } /** 获取构建状态 */ const buildInfo = await this.jenkinsClient.getBuildInfo(jobName, buildNumber); /** 调用进度回调 */ if (onProgress) { onProgress(buildInfo); } console.log(`构建状态: ${buildInfo.result || "BUILDING"} - ${this.getElapsedTime(startTime)}`); /** 判断是否完成 */ if (!buildInfo.building) { if (buildInfo.result === "SUCCESS") { console.log(`构建成功: #${buildNumber}`); return buildInfo; } else if (buildInfo.result === "FAILURE") { throw new Error(`构建失败: #${buildNumber}`); } else if (buildInfo.result === "ABORTED") { throw new Error(`构建已中止: #${buildNumber}`); } else if (buildInfo.result === "UNSTABLE") { console.log(`构建不稳定: #${buildNumber}`); return buildInfo; } } /** 等待下一次轮询 */ await this.sleep(pollInterval); } } /** * 触发部署(不等待完成) * @param jobName Jenkins Job 名称 * @param parameters 构建参数 * @returns 队列项 URL */ async triggerDeploy(jobName, parameters) { console.log(`触发 Jenkins 部署: ${jobName}`); console.log(`参数:`, parameters); const queueItemUrl = await this.jenkinsClient.triggerBuild(jobName, parameters); console.log(`构建已加入队列: ${queueItemUrl}`); return queueItemUrl; } /** * 获取构建状态 * @param jobName Jenkins Job 名称 * @param buildNumber 构建编号 * @returns 构建信息 */ async getBuildStatus(jobName, buildNumber) { return this.jenkinsClient.getBuildInfo(jobName, buildNumber); } /** * 获取已用时间(格式化) */ getElapsedTime(startTime) { const elapsed = Math.floor((Date.now() - startTime) / 1000); const minutes = Math.floor(elapsed / 60); const seconds = elapsed % 60; return `${minutes}${seconds}秒`; } /** * 睡眠指定毫秒数 */ sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } } exports.JenkinsDeployer = JenkinsDeployer; //# sourceMappingURL=jenkins-deployer.js.map