自动化发布#

如果你的项目遵循语义版本控制,自动化发布所需步骤可能是一个好主意。下面的秘方将提升项目版本,提交更改到 git 并创建新的 GitHub 发布。

要发布 GitHub 版本,你需要创建一个个人访问令牌并将其添加到你的项目中。但是,我们不想提交它,因此我们将使用dotenv从 git 忽略的 .env 文件中加载它

GH_TOKEN=ff34885...

不要忘记将 .env 添加到你的 .gitignore 中。

接下来,安装此秘方所需的所有依赖项

npm install --save-dev conventional-recommended-bump conventional-changelog-cli conventional-github-releaser dotenv execa

根据您的环境、设置和偏好,您的发布工作流可能类似于以下内容

const gulp = require('gulp');
const conventionalRecommendedBump = require('conventional-recommended-bump');
const conventionalGithubReleaser = require('conventional-github-releaser');
const execa = require('execa');
const fs = require('fs');
const { promisify } = require('util');
const dotenv = require('dotenv');
// 加载环境变量
const result = dotenv.config();
如果 (结果.错误) {
抛出 结果.错误;
}
// 传统变更日志预设
常量 预设 = 'angular';
// 将命令的输出打印到终端
常量 stdio = 'inherit';
异步 函数 bumpVersion() {
// 根据提交获取建议的版本升级
const { releaseType } = await promisify(conventionalRecommendedBump)({ preset });
// 提升版本而不提交和标记
await execa('npm', ['version', releaseType, '--no-git-tag-version'], {
stdio,
});
}
async function changelog() {
await execa(
'npx',
[
'conventional-changelog',
'--preset',
preset,
'--infile',
'CHANGELOG.md',
'--same-file',
],
{ stdio
);
}
async function commitTagPush() {
// 即使在这种情况下我们可以使用“require”,我们也会采取安全的途径
// 因为 "require" 会缓存值,所以如果我们碰巧在其他地方再次使用 "require"
// 我们将不会获得当前值,而是我们上次调用 "require" 时的值
const { version } = JSON.parse(await promisify(fs.readFile)('package.json'));
const commitMsg = `chore: release ${version}`;
await execa('git', ['add', '.'], { stdio });
await execa('git', ['commit', '--message', commitMsg], { stdio });
await execa('git', ['tag', `v${version}`], { stdio });
await execa('git', ['push', '--follow-tags'], { stdio });
}
函数 githubRelease(完成) {
conventionalGithubReleaser(
{ 类型: 'oauth', 令牌: 进程.env.GH_TOKEN },
{ 预设 },
完成
);
}
导出.发布 =gulp.系列(
bumpVersion,
changelog,
commitTagPush,
githubRelease
);