@lcap/cli
Version:
utils for lcap
115 lines • 5.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.bumpCommand = exports.printNaslName = void 0;
const promises_1 = require("fs/promises");
const path_1 = require("path");
const rest_1 = require("@gitbeaker/rest");
const utils_1 = require("../utils");
/** 项目仓库地址 */
const projectId = 'vusion/lcap-ide';
function bumpNasl(version, opt) {
const [mainString, subString] = version.split('-');
const [major, minor, patch] = mainString.split('.').map((item) => (item && !Number.isNaN(Number(item))) ? Number(item) : 0);
const betaVersion = Number.parseInt(/beta\.(\d+)/.exec(subString ?? '')?.[1] ?? '0');
const rcVersion = Number.parseInt(/rc\.(\d+)/.exec(subString ?? '')?.[1] ?? '0');
switch (opt.type) {
case 'prerelease': {
return `${major}.${minor}.${patch}-beta.${betaVersion + 1}`;
}
case 'release': {
return `${major}.${minor}.${patch}-rc.${rcVersion + 1}`;
}
case 'patch': {
return `${major}.${minor}.${patch + 1}`;
}
case 'minor': {
return `${major}.${minor + 1}.0`;
}
default: {
throw new Error(`错误的升级选项:${opt.type}`);
}
}
}
/** 关闭匹配前缀的分支和合并请求 */
async function deleteBranchAndMr(gitlab, projectId, prefix) {
const restAutoBranch = await gitlab.Branches.all(projectId, {
search: prefix,
});
await Promise.all(restAutoBranch.map(({ name }) => gitlab.Branches.remove(projectId, name)));
const restMr = await gitlab.MergeRequests.all({
projectId,
search: prefix,
state: 'opened',
});
await Promise.all(restMr.map(({ iid }) => gitlab.MergeRequests.remove(projectId, iid)));
}
function getNaslPackages(root, opt) {
return (0, promises_1.readdir)((0, path_1.join)(root, 'packages'))
.then((list) => list.filter((item) => item.startsWith('nasl')))
.then((list) => Promise.all(list.map(async (pkg) => {
const pkgFilePath = (0, path_1.join)(root, 'packages', pkg, 'package.json');
const pkgData = JSON.parse(await (0, promises_1.readFile)(pkgFilePath, 'utf-8'));
return {
path: (0, path_1.join)('/', 'packages', pkg, 'package.json'),
data: pkgData,
};
})))
.then((list) => list.filter((pkg) => !opt.exclude.includes(pkg.data.name)));
}
function printNaslName(root, opt) {
return getNaslPackages(root, opt)
.then((data) => data.map((item) => item.data.name))
.then((data) => data.join(' '));
}
exports.printNaslName = printNaslName;
async function bumpCommand(root, opt) {
const tokenData = await (0, utils_1.getSecretByOption)(root, opt);
const mainNaslVersion = JSON.parse(await (0, promises_1.readFile)((0, path_1.join)(root, 'packages/nasl/package.json'), 'utf-8')).version;
utils_1.logger.info(`主包 @lcap/nasl 当前版本号为:${mainNaslVersion}`);
utils_1.logger.info(`升级选项为:${opt.type}`);
const updateVersion = bumpNasl(mainNaslVersion, opt);
utils_1.logger.info(`升级后版本为:${updateVersion}`);
const naslPackages = await getNaslPackages(root, opt);
const bumpBranchPrefix = `bump/nasl-${updateVersion}`;
const bumpBranch = `${bumpBranchPrefix}-${Date.now()}`;
const description = `Bump Nasl: 升级 Nasl 版本至 ${updateVersion}`;
const gitlab = new rest_1.Gitlab({
token: tokenData,
host: 'https://g.hz.netease.com',
camelize: true,
});
utils_1.logger.info(`开始删除旧的分支和合并请求...`);
await deleteBranchAndMr(gitlab, projectId, bumpBranchPrefix);
utils_1.logger.info(`开始创建新分支...`);
await gitlab.Branches.create(projectId, bumpBranch, opt.targetBranch);
utils_1.logger.info(`开始创建提交...`);
const updateFiles = naslPackages.map((data) => {
data.data.version = updateVersion;
const stringify = JSON.stringify(data.data, null, 2).trim() + '\n';
return {
action: 'update',
encoding: 'base64',
filePath: data.path,
content: Buffer.from(stringify).toString('base64'),
};
});
await gitlab.Commits.create(projectId, bumpBranch, description, updateFiles, {
authorName: 'ci-cd',
});
utils_1.logger.info(`开始创建合并请求...`);
const mrData = await gitlab.MergeRequests.create(projectId, bumpBranch, opt.targetBranch, '升级 Nasl 版本', {
description,
squash: true,
removeSourceBranch: true,
});
utils_1.logger.info(`MR 创建成功,MR 链接为:${utils_1.color.blackBright(mrData.webUrl)}`);
if (opt.output) {
utils_1.logger.info(`MR 结果写入上下文...`);
await (0, utils_1.writeContext)(root, opt.output, {
mr_url: mrData.webUrl,
nasl_version: updateVersion,
});
}
}
exports.bumpCommand = bumpCommand;
//# sourceMappingURL=api.js.map