/** * 将代码内的纳管项目清单同步到数据库,保持项目、环境和 Jenkins Job 可重复初始化。 */ const { EnvironmentKind, PrismaClient, ProjectStatus, UserRole, UserStatus, } = require('@prisma/client'); const { SUPER_ADMIN_SEED } = require('../dist/auth/auth.constants'); const { PasswordService } = require('../dist/auth/password.service'); const { seedProjects } = require('../dist/projects/project.seed'); const prisma = new PrismaClient(); const passwordService = new PasswordService(); 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); } } await upsertSuperAdmin(); } async function upsertSuperAdmin() { const passwordHash = await passwordService.hashPassword( resolveSuperAdminInitialPassword(), ); await prisma.user.upsert({ where: { account: SUPER_ADMIN_SEED.account, }, create: { id: SUPER_ADMIN_SEED.id, account: SUPER_ADMIN_SEED.account, displayName: SUPER_ADMIN_SEED.displayName, role: UserRole.SUPER_ADMIN, status: UserStatus.ACTIVE, passwordHash, mustChangePassword: false, }, update: { displayName: SUPER_ADMIN_SEED.displayName, role: UserRole.SUPER_ADMIN, status: UserStatus.ACTIVE, mustChangePassword: false, }, }); } function resolveSuperAdminInitialPassword() { if (process.env.SUPER_ADMIN_INITIAL_PASSWORD) { return process.env.SUPER_ADMIN_INITIAL_PASSWORD; } throw new Error('缺少 SUPER_ADMIN_INITIAL_PASSWORD,不能初始化超级管理员'); } 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); });