long-git-cli
Version:
A CLI tool for Git tag management.
110 lines • 4.12 kB
JavaScript
;
/**
* 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