UNPKG

@lcap/cli

Version:

utils for lcap

115 lines 5.03 kB
"use strict"; 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