diff --git a/AGENTS.md b/AGENTS.md index 47cc02099..8f10f807e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -70,6 +70,8 @@ Certd 是可私有化部署的 SSL/TLS 证书自动化管理平台,提供 Web - 先读本文,再按任务读取具体代码或技能文件。 - PowerShell 读取中文、Markdown、locale、文档类文件时使用 `Get-Content -Raw -Encoding UTF8`;仍乱码时先执行 `[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()`。 - PowerShell 中用 `rg` 搜索含引号、括号、反斜杠的 pattern 时,优先用单引号包裹整个 pattern,例如 `rg 'await import\("tencentcloud-sdk-nodejs' packages/ui/certd-server/src -g '*.ts'`。 +- 手工编辑或创建文件时优先使用 `apply_patch`。单个文件内有多处不连续改动时,拆成多个独立的 `*** Update File` 块,每块只改一处附近上下文;不要在同一个 update hunk 里强塞多个 `@@`。 +- 只有真正机械化的大批量替换、格式化或生成任务才考虑脚本/工具。若必须使用临时脚本,应放在临时目录并在同一个受控步骤内完成创建、执行、删除;不要把临时脚本落在仓库里跨多步工具调用执行。 - 不要主动运行 `pnpm install`;缺依赖、TTY、网络导致安装或测试失败时,停止尝试并说明环境问题。 - 优先沿用现有模块、插件、service、页面模式;不要为形式上的复用制造过度抽象。 - 代码可读性优先于短写法。复杂条件、三元表达式、链式调用、内联对象和多层 helper 调用要拆成命名清晰的中间变量或小方法。 @@ -210,8 +212,8 @@ Certd 是可私有化部署的 SSL/TLS 证书自动化管理平台,提供 Web - 后端业务数据、接口、实体、权限、迁移:改 `packages/ui/certd-server/src/modules` 与 `src/controller`。 - 表单、列表、插件配置 UI:改 `packages/ui/certd-client/src/views/certd` 及对应 `src/api`。 -## 注意事项 +## 其他注意事项 ### 旧版数据兼容 -- 新增插件参数时,必须要考虑旧版数据兼容,比如新增一个deployType参数,有两种值:`default`和`custom`,需要在使用时判空,走旧版逻辑。 \ No newline at end of file +- 新增插件参数时,必须要考虑旧版数据兼容,比如新增一个deployType参数,有两种值:`default`和`custom`,需要在使用时判空,走旧版逻辑。 diff --git a/CHANGELOG.md b/CHANGELOG.md index e9a5b57a3..f1540c10d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +### Bug Fixes + +* 修复正常批量删除流水线报权限不足的bug ([5b50083](https://github.com/certd/certd/commit/5b500830a122c6c42dab054e57fed509050f94da)) + +### Performance Improvements + +* 优化动态加载依赖镜像地址,多次重试 ([5f53b81](https://github.com/certd/certd/commit/5f53b81c75dd242b4260ac08cae14c6d1a08a883)) + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/docs/guide/changelogs/CHANGELOG.md b/docs/guide/changelogs/CHANGELOG.md index e9a5b57a3..f1540c10d 100644 --- a/docs/guide/changelogs/CHANGELOG.md +++ b/docs/guide/changelogs/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +### Bug Fixes + +* 修复正常批量删除流水线报权限不足的bug ([5b50083](https://github.com/certd/certd/commit/5b500830a122c6c42dab054e57fed509050f94da)) + +### Performance Improvements + +* 优化动态加载依赖镜像地址,多次重试 ([5f53b81](https://github.com/certd/certd/commit/5f53b81c75dd242b4260ac08cae14c6d1a08a883)) + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 99c74acca..08426f9ad 100644 --- a/lerna.json +++ b/lerna.json @@ -9,5 +9,5 @@ } }, "npmClient": "pnpm", - "version": "1.42.5" + "version": "1.42.6" } diff --git a/packages/core/acme-client/CHANGELOG.md b/packages/core/acme-client/CHANGELOG.md index 0583e7eb8..eef4fbcd5 100644 --- a/packages/core/acme-client/CHANGELOG.md +++ b/packages/core/acme-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/publishlab/node-acme-client/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/acme-client + ## [1.42.5](https://github.com/publishlab/node-acme-client/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/acme-client diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index a974def44..c03e5710c 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -3,7 +3,7 @@ "description": "Simple and unopinionated ACME client", "private": false, "author": "nmorsman", - "version": "1.42.5", + "version": "1.42.6", "type": "module", "module": "./dist/index.js", "main": "./dist/index.js", @@ -18,7 +18,7 @@ "types" ], "dependencies": { - "@certd/basic": "^1.42.5", + "@certd/basic": "^1.42.6", "@peculiar/x509": "^1.11.0", "asn1js": "^3.0.5", "axios": "^1.9.0", @@ -75,5 +75,5 @@ "bugs": { "url": "https://github.com/publishlab/node-acme-client/issues" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/core/basic/CHANGELOG.md b/packages/core/basic/CHANGELOG.md index 7e26ded27..5e2ab94f8 100644 --- a/packages/core/basic/CHANGELOG.md +++ b/packages/core/basic/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/basic + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/basic diff --git a/packages/core/basic/build.md b/packages/core/basic/build.md index e2c91fe7d..0b4a3bfd5 100644 --- a/packages/core/basic/build.md +++ b/packages/core/basic/build.md @@ -1 +1 @@ -23:31 +01:12 diff --git a/packages/core/basic/package.json b/packages/core/basic/package.json index 8a0adb355..7e460b2b4 100644 --- a/packages/core/basic/package.json +++ b/packages/core/basic/package.json @@ -1,7 +1,7 @@ { "name": "@certd/basic", "private": false, - "version": "1.42.5", + "version": "1.42.6", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -54,5 +54,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/core/pipeline/CHANGELOG.md b/packages/core/pipeline/CHANGELOG.md index 023e40e68..b1f5d2b7d 100644 --- a/packages/core/pipeline/CHANGELOG.md +++ b/packages/core/pipeline/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +### Performance Improvements + +* 优化动态加载依赖镜像地址,多次重试 ([5f53b81](https://github.com/certd/certd/commit/5f53b81c75dd242b4260ac08cae14c6d1a08a883)) + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index 6eaf3f489..ecc01e70e 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -1,7 +1,7 @@ { "name": "@certd/pipeline", "private": false, - "version": "1.42.5", + "version": "1.42.6", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -21,8 +21,8 @@ "lint": "eslint --fix" }, "dependencies": { - "@certd/basic": "^1.42.5", - "@certd/plus-core": "^1.42.5", + "@certd/basic": "^1.42.6", + "@certd/plus-core": "^1.42.6", "dayjs": "^1.11.7", "lodash-es": "^4.17.21", "reflect-metadata": "^0.2.2" @@ -51,5 +51,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/core/pipeline/src/service/runtime.test.ts b/packages/core/pipeline/src/service/runtime.test.ts index 1947840a3..84ce4dc75 100644 --- a/packages/core/pipeline/src/service/runtime.test.ts +++ b/packages/core/pipeline/src/service/runtime.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert from "assert"; import fs from "fs"; import path from "path"; import os from "os"; @@ -34,6 +34,9 @@ describe("RuntimeDepsService", () => { async resolve() { return "https://registry.npmmirror.com"; }, + async resolveOrdered() { + return ["https://registry.npmmirror.com"]; + }, } as any; service.commandRunner = { async run(command: string, args: string[]) { @@ -60,6 +63,9 @@ describe("RuntimeDepsService", () => { async resolve() { return ""; }, + async resolveOrdered() { + return [""]; + }, } as any; service.commandRunner = { async run(command: string, args: string[]) { @@ -100,6 +106,9 @@ describe("RuntimeDepsService", () => { async resolve() { return ""; }, + async resolveOrdered() { + return [""]; + }, } as any; service.commandRunner = { async run(command: string, args: string[]) { @@ -127,6 +136,9 @@ describe("RuntimeDepsService", () => { async resolve() { return ""; }, + async resolveOrdered() { + return [""]; + }, } as any; service.commandRunner = { async run(command: string, args: string[]) { @@ -167,6 +179,9 @@ describe("RuntimeDepsService", () => { async resolve() { return ""; }, + async resolveOrdered() { + return [""]; + }, } as any; service.commandRunner = { async run(command: string, args: string[]) { @@ -211,6 +226,9 @@ describe("RuntimeDepsService", () => { async resolve() { return ""; }, + async resolveOrdered() { + return [""]; + }, } as any; service.commandRunner = { async run(command: string, args: string[]) { @@ -279,6 +297,9 @@ describe("RuntimeDepsService", () => { async resolve() { return ""; }, + async resolveOrdered() { + return [""]; + }, } as any; service.commandRunner = { async run(command: string, args: string[], options: { env?: NodeJS.ProcessEnv }) { @@ -315,7 +336,7 @@ describe("RuntimeDepsService", () => { }); describe("NpmRegistryResolver", () => { - it("chooses the fastest successful registry in auto mode", async () => { + it("returns the fastest successful registry via resolve()", async () => { const resolver = new NpmRegistryResolver({ mode: "auto", candidates: ["https://slow.example.com", "https://fast.example.com"], @@ -341,4 +362,60 @@ describe("NpmRegistryResolver", () => { const result = await resolver.resolve(); assert.equal(result, "https://registry.example.com"); }); + it("returns ordered list via resolveOrdered (fastest first)", async () => { + const resolver = new NpmRegistryResolver({ + mode: "auto", + candidates: ["https://slow.example.com", "https://fast.example.com"], + probeTimeoutMs: 100, + cacheTtlMs: 1000, + }); + resolver.probe = async (registryUrl: string) => ({ + registryUrl, + ok: true, + elapsedMs: registryUrl.includes("fast") ? 10 : 50, + }); + const result = await resolver.resolveOrdered(); + assert.deepEqual(result, ["https://fast.example.com", "https://slow.example.com"]); + }); + it("includes failed registries at the end of resolveOrdered", async () => { + const resolver = new NpmRegistryResolver({ + mode: "auto", + candidates: ["https://good.example.com", "https://bad.example.com"], + probeTimeoutMs: 100, + cacheTtlMs: 1000, + }); + resolver.probe = async (registryUrl: string) => { + if (registryUrl.includes("bad")) { + return { registryUrl, ok: false, elapsedMs: 200 }; + } + return { registryUrl, ok: true, elapsedMs: 30 }; + }; + const result = await resolver.resolveOrdered(); + assert.deepEqual(result, ["https://good.example.com", "https://bad.example.com"]); + }); + it("returns empty ordered list when no candidates", async () => { + const resolver = new NpmRegistryResolver({ mode: "auto", candidates: [] }); + const result = await resolver.resolveOrdered(); + assert.deepEqual(result, []); + const single = await resolver.resolve(); + assert.equal(single, ""); + }); + it("re-validates cached URL on resolveOrdered call", async () => { + let probeCount = 0; + const resolver = new NpmRegistryResolver({ + mode: "auto", + candidates: ["https://mirror.example.com"], + cacheTtlMs: 60000, + }); + resolver.probe = async (registryUrl: string) => { + probeCount++; + return { registryUrl, ok: true, elapsedMs: 10 }; + }; + const first = await resolver.resolveOrdered(); + assert.deepEqual(first, ["https://mirror.example.com"]); + assert.equal(probeCount, 1); + const second = await resolver.resolveOrdered(); + assert.deepEqual(second, ["https://mirror.example.com"]); + assert.equal(probeCount, 2); + }); }); diff --git a/packages/core/pipeline/src/service/runtime.ts b/packages/core/pipeline/src/service/runtime.ts index 8c7ea7a4c..29dd9416e 100644 --- a/packages/core/pipeline/src/service/runtime.ts +++ b/packages/core/pipeline/src/service/runtime.ts @@ -1,4 +1,4 @@ -import fs from "fs"; +import fs from "fs"; import path from "path"; import { spawn } from "child_process"; import crypto from "crypto"; @@ -89,7 +89,7 @@ export type RegistryProbeResult = { export class NpmRegistryResolver { config: NpmRegistryResolverConfig; - private cache?: { registryUrl: string; expiresAt: number }; + private cache?: { orderedUrls: string[]; expiresAt: number }; constructor(config?: NpmRegistryResolverConfig) { this.config = config || {}; @@ -105,21 +105,67 @@ export class NpmRegistryResolver { } const cached = this.cache; if (cached && cached.expiresAt > Date.now()) { - return cached.registryUrl; + const fastUrl = cached.orderedUrls[0]; + if (fastUrl) { + const probeResult = await this.probe(fastUrl); + if (probeResult.ok) { + return cached.orderedUrls[0] || ""; + } + } + this.cache = undefined; } const candidates = (config?.candidates || []).filter(Boolean); if (candidates.length === 0) { return ""; } - const probes = await Promise.allSettled(candidates.map(registryUrl => this.probe(registryUrl))); - const okList = probes.map(item => (item.status === "fulfilled" ? item.value : null)).filter((item): item is RegistryProbeResult => !!item && item.ok); - if (okList.length > 0) { - okList.sort((a, b) => a.elapsedMs - b.elapsedMs); - const best = okList[0].registryUrl; - this.cache = { registryUrl: best, expiresAt: Date.now() + (config?.cacheTtlMs || 6 * 60 * 60 * 1000) }; - return best; + const orderedUrls = await this.internalProbeAll(candidates); + this.cache = { orderedUrls, expiresAt: Date.now() + (config?.cacheTtlMs ?? 300_000) }; + return orderedUrls[0] || ""; + } + + async resolveOrdered(): Promise { + const config = this.config; + if (config?.mode === "fixed" && config.fixedUrl) { + return [config.fixedUrl]; } - return ""; + if (config?.mode === "system") { + return []; + } + const cached = this.cache; + if (cached && cached.expiresAt > Date.now()) { + const fastUrl = cached.orderedUrls[0]; + if (fastUrl) { + const probeResult = await this.probe(fastUrl); + if (probeResult.ok) { + return cached.orderedUrls; + } + } + this.cache = undefined; + } + const candidates = (config?.candidates || []).filter(Boolean); + if (candidates.length === 0) { + return []; + } + const orderedUrls = await this.internalProbeAll(candidates); + this.cache = { orderedUrls, expiresAt: Date.now() + (config?.cacheTtlMs ?? 300_000) }; + return orderedUrls; + } + + private async internalProbeAll(candidates: string[]): Promise { + const probes = await Promise.allSettled(candidates.map(registryUrl => this.probe(registryUrl))); + const okList: RegistryProbeResult[] = []; + const failList: RegistryProbeResult[] = []; + for (const item of probes) { + const result = item.status === "fulfilled" ? item.value : null; + if (result && result.ok) { + okList.push(result); + } else if (result) { + failList.push(result); + } + } + okList.sort((a, b) => a.elapsedMs - b.elapsedMs); + failList.sort((a, b) => a.elapsedMs - b.elapsedMs); + return [...okList.map(r => r.registryUrl), ...failList.map(r => r.registryUrl)]; } async probe(registryUrl: string): Promise { @@ -368,6 +414,7 @@ export class RuntimeDepsService { await this.ensureLazyDependency(packageName, logger); return this.resolveRuntimeSpecifier(specifier).resolved; } catch (lazyError: any) { + logger?.error?.(`动态依赖安装失败: ${lazyError.message}`); return this.resolveProjectSpecifier(specifier, lazyError).resolved; } } @@ -508,30 +555,37 @@ export class RuntimeDepsService { const env = this.buildChildEnv(registryUrl); const command = this.getPnpmCommand(); const pnpmVersion = await this.getPnpmVersion(command, env); - const args = ["install", "--prod", "--ignore-scripts", "--ignore-workspace", "--no-frozen-lockfile", "--reporter=append-only"]; - if (registryUrl) { - args.push(`--registry=${registryUrl}`); + const allRegistryUrls = await this.registryResolver.resolveOrdered(); + const urlsToTry = allRegistryUrls.length > 0 ? allRegistryUrls : [""]; + let lastError: string | undefined; + for (const tryUrl of urlsToTry) { + const args = ["install", "--prod", "--ignore-scripts", "--ignore-workspace", "--no-frozen-lockfile", "--reporter=append-only"]; + if (tryUrl) { + args.push(`--registry=${tryUrl}`); + } + const tryEnv = tryUrl ? this.buildChildEnv(tryUrl) : env; + log.info(`开始安装第三方依赖: ${Object.keys(dependencies).join(", ")}${tryUrl ? `,镜像: ${tryUrl}` : ""}`); + const result = await this.commandRunner.run(command, args, { cwd: rootDir, timeoutMs: this.installTimeoutMs, env: tryEnv }); + if (result.code === 0) { + this.writeInstallState(statePath, { installedAt: new Date().toISOString(), registryUrl: tryUrl, dependenciesHash, nodeVersion: process.version, pnpmVersion, lockFileExists: fs.existsSync(lockPath) }); + log.info("第三方依赖安装完成"); + return { registryUrl: tryUrl, packageJsonPath }; + } + lastError = result.stderr || result.stdout || "unknown error"; + log.warn?.(`镜像 ${tryUrl || "默认"} 安装失败${urlsToTry.length > 1 ? ",尝试下一个镜像..." : ""}`); } - log.info(`开始安装第三方依赖: ${Object.keys(dependencies).join(", ")}`); - const result = await this.commandRunner.run(command, args, { cwd: rootDir, timeoutMs: this.installTimeoutMs, env }); - if (result.code !== 0) { - const message = result.stderr || result.stdout || "unknown error"; - this.writeInstallState(statePath, { - ...currentState, - installedAt: currentState?.installedAt, - failedAt: new Date().toISOString(), - registryUrl, - dependenciesHash, - nodeVersion: process.version, - pnpmVersion, - lockFileExists: fs.existsSync(lockPath), - lastError: message, - }); - throw new Error(`动态依赖安装失败: ${message}`); - } - this.writeInstallState(statePath, { installedAt: new Date().toISOString(), registryUrl, dependenciesHash, nodeVersion: process.version, pnpmVersion, lockFileExists: fs.existsSync(lockPath) }); - log.info("第三方依赖安装完成"); - return { registryUrl, packageJsonPath }; + this.writeInstallState(statePath, { + ...currentState, + installedAt: currentState?.installedAt, + failedAt: new Date().toISOString(), + registryUrl: urlsToTry[0], + dependenciesHash, + nodeVersion: process.version, + pnpmVersion, + lockFileExists: fs.existsSync(lockPath), + lastError, + }); + throw new Error(`动态依赖安装失败: ${lastError}`); }); } diff --git a/packages/libs/lib-huawei/CHANGELOG.md b/packages/libs/lib-huawei/CHANGELOG.md index 89efeba72..35e8c2865 100644 --- a/packages/libs/lib-huawei/CHANGELOG.md +++ b/packages/libs/lib-huawei/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/lib-huawei + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/lib-huawei diff --git a/packages/libs/lib-huawei/package.json b/packages/libs/lib-huawei/package.json index e29042ee6..de95fd22a 100644 --- a/packages/libs/lib-huawei/package.json +++ b/packages/libs/lib-huawei/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-huawei", "private": false, - "version": "1.42.5", + "version": "1.42.6", "main": "./dist/bundle.js", "module": "./dist/bundle.js", "types": "./dist/d/index.d.ts", @@ -31,5 +31,5 @@ "prettier": "3.3.3", "tslib": "^2.8.1" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/libs/lib-iframe/CHANGELOG.md b/packages/libs/lib-iframe/CHANGELOG.md index 28e35d779..9db0cbcda 100644 --- a/packages/libs/lib-iframe/CHANGELOG.md +++ b/packages/libs/lib-iframe/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/lib-iframe + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/lib-iframe diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index c40afe542..85b1c01a0 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-iframe", "private": false, - "version": "1.42.5", + "version": "1.42.6", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -37,5 +37,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/libs/lib-jdcloud/CHANGELOG.md b/packages/libs/lib-jdcloud/CHANGELOG.md index dc18b8c78..2f8c2d0d8 100644 --- a/packages/libs/lib-jdcloud/CHANGELOG.md +++ b/packages/libs/lib-jdcloud/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/jdcloud + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/jdcloud diff --git a/packages/libs/lib-jdcloud/package.json b/packages/libs/lib-jdcloud/package.json index 2f5d6ba3f..da4bce87d 100644 --- a/packages/libs/lib-jdcloud/package.json +++ b/packages/libs/lib-jdcloud/package.json @@ -1,6 +1,6 @@ { "name": "@certd/jdcloud", - "version": "1.42.5", + "version": "1.42.6", "description": "jdcloud openApi sdk", "main": "./dist/bundle.js", "module": "./dist/bundle.js", @@ -63,5 +63,5 @@ "fetch" ] }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/libs/lib-k8s/CHANGELOG.md b/packages/libs/lib-k8s/CHANGELOG.md index 864a19912..bba2ae8cd 100644 --- a/packages/libs/lib-k8s/CHANGELOG.md +++ b/packages/libs/lib-k8s/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/lib-k8s + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/lib-k8s diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index d003e926a..989b7838a 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-k8s", "private": false, - "version": "1.42.5", + "version": "1.42.6", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -21,7 +21,7 @@ "lint": "eslint --fix" }, "dependencies": { - "@certd/basic": "^1.42.5", + "@certd/basic": "^1.42.6", "@kubernetes/client-node": "0.21.0" }, "devDependencies": { @@ -38,5 +38,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/libs/lib-server/CHANGELOG.md b/packages/libs/lib-server/CHANGELOG.md index a67c6677c..b66f883dd 100644 --- a/packages/libs/lib-server/CHANGELOG.md +++ b/packages/libs/lib-server/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +### Bug Fixes + +* 修复正常批量删除流水线报权限不足的bug ([5b50083](https://github.com/certd/certd/commit/5b500830a122c6c42dab054e57fed509050f94da)) + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/packages/libs/lib-server/package.json b/packages/libs/lib-server/package.json index 74cd4cfcf..34ec9ccba 100644 --- a/packages/libs/lib-server/package.json +++ b/packages/libs/lib-server/package.json @@ -1,6 +1,6 @@ { "name": "@certd/lib-server", - "version": "1.42.5", + "version": "1.42.6", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", @@ -29,11 +29,11 @@ ], "license": "AGPL", "dependencies": { - "@certd/acme-client": "^1.42.5", - "@certd/basic": "^1.42.5", - "@certd/pipeline": "^1.42.5", - "@certd/plugin-lib": "^1.42.5", - "@certd/plus-core": "^1.42.5", + "@certd/acme-client": "^1.42.6", + "@certd/basic": "^1.42.6", + "@certd/pipeline": "^1.42.6", + "@certd/plugin-lib": "^1.42.6", + "@certd/plus-core": "^1.42.6", "@midwayjs/cache": "3.14.0", "@midwayjs/core": "3.20.11", "@midwayjs/i18n": "3.20.13", @@ -69,5 +69,5 @@ "typeorm": "^0.3.20", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/libs/lib-server/src/basic/base-service.ts b/packages/libs/lib-server/src/basic/base-service.ts index 9538c4861..df9b3da21 100644 --- a/packages/libs/lib-server/src/basic/base-service.ts +++ b/packages/libs/lib-server/src/basic/base-service.ts @@ -253,7 +253,6 @@ export abstract class BaseService { if (!Array.isArray(ids)) { ids = [ids]; } - ids = this.filterIds(ids); const res = await this.getRepository().find({ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -266,7 +265,7 @@ export abstract class BaseService { }, }); if (!res || res.length === ids.length) { - return; + return ids; } throw new PermissionException("权限不足"); } @@ -280,6 +279,12 @@ export abstract class BaseService { }); } async batchDelete(ids: number[], userId: number, projectId?: number): Promise { + if (!ids || ids.length === 0) { + throw new ValidateException("ids不能为空"); + } + if (!Array.isArray(ids)) { + ids = [ids]; + } ids = this.filterIds(ids); if (userId != null) { const userProjectQuery = this.buildUserProjectQuery(userId, projectId); diff --git a/packages/libs/midway-flyway-js/CHANGELOG.md b/packages/libs/midway-flyway-js/CHANGELOG.md index 2a2505c57..0b76bb1e1 100644 --- a/packages/libs/midway-flyway-js/CHANGELOG.md +++ b/packages/libs/midway-flyway-js/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/midway-flyway-js + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Performance Improvements diff --git a/packages/libs/midway-flyway-js/package.json b/packages/libs/midway-flyway-js/package.json index a44ceab29..5433c1218 100644 --- a/packages/libs/midway-flyway-js/package.json +++ b/packages/libs/midway-flyway-js/package.json @@ -1,6 +1,6 @@ { "name": "@certd/midway-flyway-js", - "version": "1.42.5", + "version": "1.42.6", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", @@ -52,5 +52,5 @@ "typeorm": "^0.3.20", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/plugins/plugin-cert/CHANGELOG.md b/packages/plugins/plugin-cert/CHANGELOG.md index 035afaaa3..6ef5ac8f0 100644 --- a/packages/plugins/plugin-cert/CHANGELOG.md +++ b/packages/plugins/plugin-cert/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/plugin-cert + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) **Note:** Version bump only for package @certd/plugin-cert diff --git a/packages/plugins/plugin-cert/package.json b/packages/plugins/plugin-cert/package.json index e93247fab..be2217e75 100644 --- a/packages/plugins/plugin-cert/package.json +++ b/packages/plugins/plugin-cert/package.json @@ -1,7 +1,7 @@ { "name": "@certd/plugin-cert", "private": false, - "version": "1.42.5", + "version": "1.42.6", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -20,7 +20,7 @@ "lint": "eslint --fix" }, "dependencies": { - "@certd/plugin-lib": "^1.42.5" + "@certd/plugin-lib": "^1.42.6" }, "devDependencies": { "@types/chai": "^4.3.12", @@ -38,5 +38,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/plugins/plugin-lib/CHANGELOG.md b/packages/plugins/plugin-lib/CHANGELOG.md index 6f5bbe21e..f8b25d886 100644 --- a/packages/plugins/plugin-lib/CHANGELOG.md +++ b/packages/plugins/plugin-lib/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/plugin-lib + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/packages/plugins/plugin-lib/package.json b/packages/plugins/plugin-lib/package.json index 76b662484..51ad14983 100644 --- a/packages/plugins/plugin-lib/package.json +++ b/packages/plugins/plugin-lib/package.json @@ -1,7 +1,7 @@ { "name": "@certd/plugin-lib", "private": false, - "version": "1.42.5", + "version": "1.42.6", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -17,9 +17,9 @@ "lint": "eslint --fix" }, "dependencies": { - "@certd/acme-client": "^1.42.5", - "@certd/basic": "^1.42.5", - "@certd/pipeline": "^1.42.5", + "@certd/acme-client": "^1.42.6", + "@certd/basic": "^1.42.6", + "@certd/pipeline": "^1.42.6", "dayjs": "^1.11.7", "jszip": "^3.10.1", "lodash-es": "^4.17.21", @@ -45,5 +45,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "83495b32138cf831b4ea02054d12981d9787ebf0" + "gitHead": "246ee83015bf5589adc2a5fa3d1388c8d9a2a252" } diff --git a/packages/ui/certd-client/CHANGELOG.md b/packages/ui/certd-client/CHANGELOG.md index 97aa3dfc1..5f1fba9d4 100644 --- a/packages/ui/certd-client/CHANGELOG.md +++ b/packages/ui/certd-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +**Note:** Version bump only for package @certd/ui-client + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index 05d2cd75f..2851810a1 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-client", - "version": "1.42.5", + "version": "1.42.6", "private": true, "scripts": { "dev": "vite --open", @@ -104,8 +104,8 @@ "zod-defaults": "^0.1.3" }, "devDependencies": { - "@certd/lib-iframe": "^1.42.5", - "@certd/pipeline": "^1.42.5", + "@certd/lib-iframe": "^1.42.6", + "@certd/pipeline": "^1.42.6", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@types/chai": "^4.3.12", diff --git a/packages/ui/certd-server/CHANGELOG.md b/packages/ui/certd-server/CHANGELOG.md index 3feb25809..6fa88f0fc 100644 --- a/packages/ui/certd-server/CHANGELOG.md +++ b/packages/ui/certd-server/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.42.6](https://github.com/certd/certd/compare/v1.42.5...v1.42.6) (2026-07-18) + +### Bug Fixes + +* 修复正常批量删除流水线报权限不足的bug ([5b50083](https://github.com/certd/certd/commit/5b500830a122c6c42dab054e57fed509050f94da)) + ## [1.42.5](https://github.com/certd/certd/compare/v1.42.4...v1.42.5) (2026-07-15) ### Bug Fixes diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 0389ecdce..ca34f99b1 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-server", - "version": "1.42.5", + "version": "1.42.6", "description": "fast-server base midway", "private": true, "type": "module", @@ -42,20 +42,20 @@ "lint1": "eslint --fix" }, "dependencies": { - "@certd/acme-client": "^1.42.5", - "@certd/basic": "^1.42.5", - "@certd/commercial-core": "^1.42.5", + "@certd/acme-client": "^1.42.6", + "@certd/basic": "^1.42.6", + "@certd/commercial-core": "^1.42.6", "@certd/cv4pve-api-javascript": "^8.4.2", - "@certd/jdcloud": "^1.42.5", - "@certd/lib-huawei": "^1.42.5", - "@certd/lib-k8s": "^1.42.5", - "@certd/lib-server": "^1.42.5", - "@certd/midway-flyway-js": "^1.42.5", - "@certd/pipeline": "^1.42.5", - "@certd/plugin-cert": "^1.42.5", - "@certd/plugin-lib": "^1.42.5", - "@certd/plugin-plus": "^1.42.5", - "@certd/plus-core": "^1.42.5", + "@certd/jdcloud": "^1.42.6", + "@certd/lib-huawei": "^1.42.6", + "@certd/lib-k8s": "^1.42.6", + "@certd/lib-server": "^1.42.6", + "@certd/midway-flyway-js": "^1.42.6", + "@certd/pipeline": "^1.42.6", + "@certd/plugin-cert": "^1.42.6", + "@certd/plugin-lib": "^1.42.6", + "@certd/plugin-plus": "^1.42.6", + "@certd/plus-core": "^1.42.6", "@koa/cors": "^5.0.0", "@midwayjs/bootstrap": "3.20.11", "@midwayjs/cache": "3.14.0", diff --git a/packages/ui/certd-server/src/modules/monitor/service/site-info-service.ts b/packages/ui/certd-server/src/modules/monitor/service/site-info-service.ts index 39aa49c93..2648432eb 100644 --- a/packages/ui/certd-server/src/modules/monitor/service/site-info-service.ts +++ b/packages/ui/certd-server/src/modules/monitor/service/site-info-service.ts @@ -806,6 +806,8 @@ export class SiteInfoService extends BaseService { } async batchDelete(ids: number[], userId: number, projectId?: number): Promise { + + ids = this.filterIds(ids); const userProjectQuery = this.buildUserProjectQuery(userId, projectId); await this.repository.delete({ id: In(ids), diff --git a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts index 8e3acabfe..433684098 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts @@ -1,7 +1,7 @@ import { Config, Inject, Provide, Scope, ScopeEnum, sleep } from "@midwayjs/core"; import { InjectEntityModel } from "@midwayjs/typeorm"; import { In, MoreThan, Repository } from "typeorm"; -import { AccessService, BaseService, isEnterprise, NeedSuiteException, NeedVIPException, PageReq, SysPublicSettings, SysSettingsService, SysSiteInfo } from "@certd/lib-server"; +import { AccessService, BaseService, isEnterprise, NeedSuiteException, NeedVIPException, PageReq, SysPublicSettings, SysSettingsService, SysSiteInfo, ValidateException } from "@certd/lib-server"; import { PipelineEntity } from "../entity/pipeline.js"; import { PipelineDetail } from "../entity/vo/pipeline-detail.js"; import { Executor, IAccessService, ICnameProxyService, INotificationService, Notification, Pipeline, pluginRegistry, ResultType, RunHistory, RunnableCollection, SysInfo, UserInfo } from "@certd/pipeline"; @@ -966,15 +966,19 @@ export class PipelineService extends BaseService { if (!isPlus()) { throw new NeedVIPException("此功能需要升级Certd专业版"); } + if (!ids || ids.length === 0) { + throw new ValidateException("ids不能为空"); + } + ids = this.filterIds(ids); + + if (userId && userId > 0) { + await this.checkUserId(ids, userId); + } + if (projectId) { + await this.checkUserId(ids, projectId, "projectId"); + } for (const id of ids) { - if (userId && userId > 0) { - await this.checkUserId(id, userId); - } - if (projectId) { - await this.checkUserId(id, projectId, "projectId"); - } await this.delete(id); - ids.push(id); } return ids.length; } diff --git a/packages/ui/certd-server/src/modules/pipeline/service/template-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/template-service.ts index ade3e691a..e5ca65b3b 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/template-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/template-service.ts @@ -88,6 +88,7 @@ export class TemplateService extends BaseService { } async batchDelete(ids: number[], userId: number, projectId?: number): Promise { + ids = this.filterIds(ids); const where: any = { id: In(ids), }; diff --git a/trigger/build.trigger b/trigger/build.trigger index f1d0cff04..1d3b516af 100644 --- a/trigger/build.trigger +++ b/trigger/build.trigger @@ -1 +1 @@ -23:35 +01:14 diff --git a/trigger/release.trigger b/trigger/release.trigger index 6a639182c..9497b7868 100644 --- a/trigger/release.trigger +++ b/trigger/release.trigger @@ -1 +1 @@ -23:54 +01:28