/** * 将代码内的纳管项目清单同步到数据库,保持项目、环境和 Jenkins Job 可重复初始化。 */ const { EnvironmentKind, PrismaClient, ProjectStatus } = require('@prisma/client'); const { seedProjects } = require('../dist/projects/project.seed'); const prisma = new PrismaClient(); async function main() { 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, environment) { 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) { return environment === 'test' ? EnvironmentKind.TEST : EnvironmentKind.PRODUCTION; } main() .then(async () => { await prisma.$disconnect(); }) .catch(async (error) => { console.error(error); await prisma.$disconnect(); process.exit(1); });