bc3aa31289
- auth/members/messages: 新增超级管理员登录、成员权限和密码消息流程 - agent-config/agent: 支持服务端保存 Agent 配置并取消未配置 mock 成功结果 - projects/deploy-runs/settings: 按当前用户权限保护真实接口 - prisma: 新增用户、项目权限和平台消息表结构
164 lines
4.0 KiB
JavaScript
164 lines
4.0 KiB
JavaScript
/**
|
|
* 将代码内的纳管项目清单同步到数据库,保持项目、环境和 Jenkins Job 可重复初始化。
|
|
*/
|
|
const {
|
|
EnvironmentKind,
|
|
PrismaClient,
|
|
ProjectStatus,
|
|
UserRole,
|
|
UserStatus,
|
|
} = require('@prisma/client');
|
|
const {
|
|
LOCAL_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;
|
|
}
|
|
|
|
if (process.env.NODE_ENV === 'production') {
|
|
throw new Error(
|
|
'Missing SUPER_ADMIN_INITIAL_PASSWORD in production seed run',
|
|
);
|
|
}
|
|
|
|
return LOCAL_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);
|
|
});
|