Files
devops-platform-api/prisma/seed.js
T

158 lines
3.8 KiB
JavaScript

/**
* 将代码内的纳管项目清单同步到数据库,保持项目、环境和 Jenkins Job 可重复初始化。
*/
const {
EnvironmentKind,
PrismaClient,
ProjectStatus,
UserRole,
UserStatus,
} = require('@prisma/client');
const {
SUPER_ADMIN_INITIAL_PASSWORD,
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;
}
return 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);
});