feat: 支持发布单 MySQL 持久化

This commit is contained in:
湛兮
2026-06-11 22:33:50 +08:00
parent b5ee9b3648
commit d0375257ce
5 changed files with 565 additions and 112 deletions
+114
View File
@@ -0,0 +1,114 @@
/**
* 将代码内的纳管项目清单同步到数据库,保持项目、环境和 Jenkins Job 可重复初始化。
*/
import { EnvironmentKind, PrismaClient, ProjectStatus } from '@prisma/client';
import { seedProjects } from '../src/projects/project.seed';
import type { ProjectEnvironmentSummary } from '../src/projects/project.types';
const prisma = new PrismaClient();
async function main(): Promise<void> {
for (const project of seedProjects) {
const projectRecord = await prisma.project.upsert({
where: {
key: project.key,
},
create: {
id: project.id,
key: project.key,
name: project.name,
repositoryUrl: project.repositoryUrl,
defaultBranch: project.defaultBranch,
status:
project.status === 'active'
? ProjectStatus.ACTIVE
: ProjectStatus.ARCHIVED,
metadata: {
source: 'seedProjects',
},
},
update: {
name: project.name,
repositoryUrl: project.repositoryUrl,
defaultBranch: project.defaultBranch,
status:
project.status === 'active'
? ProjectStatus.ACTIVE
: ProjectStatus.ARCHIVED,
metadata: {
source: 'seedProjects',
},
},
});
for (const environment of project.environments) {
await upsertEnvironment(projectRecord.id, environment);
}
}
}
async function upsertEnvironment(
projectId: string,
environment: ProjectEnvironmentSummary,
): Promise<void> {
const environmentName = toEnvironmentKind(environment.name);
const environmentRecord = await prisma.environment.upsert({
where: {
projectId_name: {
projectId,
name: environmentName,
},
},
create: {
projectId,
name: environmentName,
displayName: environment.displayName,
},
update: {
displayName: environment.displayName,
},
});
await prisma.deployJob.upsert({
where: {
projectId_environmentId: {
projectId,
environmentId: environmentRecord.id,
},
},
create: {
projectId,
environmentId: environmentRecord.id,
jenkinsJobPath: environment.jenkinsJobPath,
jenkinsParameters: {
releasePolicy: environment.releasePolicy,
refPattern: environment.refPattern,
},
},
update: {
jenkinsJobPath: environment.jenkinsJobPath,
jenkinsParameters: {
releasePolicy: environment.releasePolicy,
refPattern: environment.refPattern,
},
},
});
}
function toEnvironmentKind(
environment: ProjectEnvironmentSummary['name'],
): EnvironmentKind {
return environment === 'test'
? EnvironmentKind.TEST
: EnvironmentKind.PRODUCTION;
}
void main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (error: unknown) => {
console.error(error);
await prisma.$disconnect();
process.exit(1);
});