diff --git a/src/deploy-runs/deploy-runs.service.spec.ts b/src/deploy-runs/deploy-runs.service.spec.ts index 829a173..3fa4f77 100644 --- a/src/deploy-runs/deploy-runs.service.spec.ts +++ b/src/deploy-runs/deploy-runs.service.spec.ts @@ -382,7 +382,13 @@ describe('DeployRunsService', () => { }); it('retries a deploy run with retry trigger', async () => { - const { repository, service } = createService(); + const failedRun: DeployRunSummary = { + ...baseRun, + status: 'failed', + }; + const { repository, service } = createService({ + runs: [failedRun], + }); const run = await service.retryRun(baseRun.id); @@ -396,6 +402,15 @@ describe('DeployRunsService', () => { ); }); + it('rejects non-terminal retry requests before creating a new run', async () => { + const { repository, service } = createService(); + + await expect(service.retryRun(baseRun.id)).rejects.toBeInstanceOf( + AppError, + ); + expect(repository.create).not.toHaveBeenCalled(); + }); + it('syncs all queued or running Jenkins runs with queue/build identifiers', async () => { const queuedRun: DeployRunSummary = { ...baseRun, diff --git a/src/deploy-runs/deploy-runs.service.ts b/src/deploy-runs/deploy-runs.service.ts index 461c9fc..066a986 100644 --- a/src/deploy-runs/deploy-runs.service.ts +++ b/src/deploy-runs/deploy-runs.service.ts @@ -111,6 +111,7 @@ export class DeployRunsService { projectKey: input.projectKey, environment: input.environment, ref: input.ref, + trigger: input.trigger ?? 'manual', remark: input.remark, }, }); @@ -182,6 +183,18 @@ export class DeployRunsService { ): Promise { const source = await this.getRun(id, user); + if (!['failed', 'canceled'].includes(source.status)) { + throw new AppError( + 'VALIDATION_FAILED', + `发布记录 ${id} 当前状态为 ${source.status},只能重试失败或已取消的发布单`, + 400, + { + id, + status: source.status, + }, + ); + } + return this.createRun( { projectKey: source.projectKey,