refactor(certd-server): 优化流水线触发逻辑并新增配置

1. 新增流水线执行异常错误码和提示信息
2. 调整服务端口配置为7004/7005
3. 优化流水线状态查询逻辑,增加更新时间判断
4. 新增失败流水线重试间隔限制逻辑
5. 添加对应单元测试
This commit is contained in:
xiaojunnuo
2026-08-08 22:27:36 +08:00
parent edb249c2ad
commit 1a4f1cb07d
6 changed files with 91 additions and 6 deletions
@@ -117,6 +117,10 @@ export const Constants = {
code: 20014,
message: "域名校验方式未配置",
},
openPipelineError: {
code: 20015,
message: "流水线执行异常,请稍后重试",
},
openEmailNotFound: {
code: 20021,
message: "用户邮箱还未配置",
+2 -2
View File
@@ -93,13 +93,13 @@ export default (req: any) => {
// with options
"/api": {
//配套后端 https://github.com/fast-crud/fs-server-js
target: "http://127.0.0.1:7001",
target: "http://127.0.0.1:7004",
//忽略证书
// agent: new https.Agent({ rejectUnauthorized: false }),
},
"/certd/api": {
//配套后端 https://github.com/fast-crud/fs-server-js
target: "http://127.0.0.1:7001/api",
target: "http://127.0.0.1:7004/api",
rewrite: (path: any) => path.replace(/^\/certd\/api/, ""),
//忽略证书
// agent: new https.Agent({ rejectUnauthorized: false }),
+4 -1
View File
@@ -1,3 +1,6 @@
LEGO_VERSION=4.30.1
JKS_GO_VERSION=1.0.3
certd_plugin_loadmode=dev
certd_plugin_loadmode=dev
certd_koa_port=7004
certd_https_port=7005
@@ -0,0 +1,61 @@
import assert from "node:assert/strict";
import { CertInfoFacade } from "./cert-info-facade.js";
describe("CertInfoFacade.triggerApplyPipeline", () => {
it("returns a pipeline error when the pipeline failed within the last three hours", async () => {
const facade = new CertInfoFacade();
let triggered = false;
facade.pipelineService = {
async getStatus() {
return {
status: "error",
updateTime: new Date(Date.now() - 2 * 60 * 60 * 1000),
};
},
async trigger() {
triggered = true;
},
} as any;
facade.certInfoService = {} as any;
await assert.rejects(
() => facade.triggerApplyPipeline({ pipelineId: 1 }),
(error: any) => {
assert.equal(error.code, 20015);
return true;
}
);
assert.equal(triggered, false);
});
it("retries a pipeline that failed more than three hours ago", async function () {
this.timeout(5000);
const facade = new CertInfoFacade();
let triggered = false;
facade.pipelineService = {
async getStatus() {
return {
status: "error",
updateTime: new Date(Date.now() - 3 * 60 * 60 * 1000 - 1),
};
},
async trigger() {
triggered = true;
},
} as any;
facade.certInfoService = {
async getByPipelineId() {
return { id: 2 };
},
} as any;
await assert.rejects(
() => facade.triggerApplyPipeline({ pipelineId: 1 }),
(error: any) => {
assert.equal(error.code, 20013);
return true;
}
);
assert.equal(triggered, true);
});
});
@@ -153,7 +153,16 @@ export class CertInfoFacade {
async triggerApplyPipeline(req: { pipelineId: number }) {
//查询流水线状态
const status = await this.pipelineService.getStatus(req.pipelineId);
const pipelineStatus = await this.pipelineService.getStatus(req.pipelineId);
const status = pipelineStatus?.status;
if (status === "error" && !this.canRetryErrorPipeline(pipelineStatus?.updateTime)) {
throw new CodeException({
...Constants.res.openPipelineError,
data: {
pipelineId: req.pipelineId,
},
});
}
if (status != "running" && status != "start") {
await this.pipelineService.trigger(req.pipelineId);
await utils.sleep(2000);
@@ -167,4 +176,12 @@ export class CertInfoFacade {
},
});
}
private canRetryErrorPipeline(updateTime?: Date) {
if (!updateTime) {
return false;
}
const retryInterval = 3 * 60 * 60 * 1000;
return Date.now() - updateTime.getTime() >= retryInterval;
}
}
@@ -1390,15 +1390,15 @@ export class PipelineService extends BaseService<PipelineEntity> {
}
async getStatus(pipelineId: number) {
const res = await this.repository.findOne({
return await this.repository.findOne({
select: {
status: true,
updateTime: true,
},
where: {
id: pipelineId,
},
});
return res?.status;
}
async getPipelineUserId(pipelineId: number) {