前端于我
npm / shelljs / 自动发布

记写一个自动发布脚本

最近在搞一个公司内部的UI框架,开发完之后整体发布流程比较复杂,因为是发布到私库的,所以在发布前需要经历“打包,npm换源,登录,发布,打tag,git提交” 好几步,并且很不规范,所以抽出了一点时间做了一些优化,让整个流程更智能自动。

自动输入账号密码

这个流程遇到比较头疼的是自动输入账号密码这里,一开始想的是使用shell脚本执行npm login,然后输入对应的账号密码,然后进行发布。但是后面发现使用shell脚本输入账号密码需要比较麻烦的配置(expect)。不符合我的轻量,低配的要求。

后面发现shelljs可以实现这个功能。实例代码如下:

const shell = require('shelljs');

new Promise((resolve, reject) => {
    const userName = '';
    const password = '';
    const email = '';
    const registry = '你的私库地址';
    const inputArray = [
        userName + "\n",
        password + "\n",
        email + "\n",
    ];
    const child = shell.exec(`cnpm adduser -registry ${registry}`, { async: true });

    child.stdout.on('data', () => {
        const cmd = inputArray.shift();
        if (cmd) {
            shell.echo("input " + cmd);
            child.stdin.write(cmd);
        } else {
            child.stdin.end();
            shell.exec('cnpm publish');
            shell.echo('发布成功!\n');
            resolve();
        }
    });
    child.stderr.on('data', (error) => {
      reject(error);
    });
  });

上面的例子是我自动登录发布私库的代码。至于为什么不配置全局的私库名,是因为使用alias命令配置的变量名无法持久保存,再重开一个终端或者重启电脑之后注册的变量将会丢失,至少在window上是这样。但是也不是不可以配置一个持久的变量名,但是那会比较麻烦,每个人的电脑环境可能都会存在些许差异,且私包的发布属于比较少的场景,不如写个脚本来发布,起码这样还能将打包、版本升级、打tag、push代码、发布整个流程集成起来。

发布前检查

这里主要是基于前端私库包发布的基础上写的脚本,所以一些场景也是在此基础上的,比如发布前检查。

发布前主要需要检查两件事情,第一是本地环境代码是否都提交了、第二是本地分支是否是master分支。当然根据个人需要也可以加一些其他的限制,比如检查发布者,只允许指定人员发布。

基于shelljs,这两个检查也比较简单,直接通过git status命令拿到本地仓库的状态字符串,然后通过检查字符的方式判断是否符合要求就可以了。

const child = shell.exec('git status');
/*
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
*/
if (!/nothing to commit, working tree clean/g.test(child.stdout) || /publish your local commits/g.test(child.stdout)) {
  console.log(chalk.red('请先将本地变更提交到仓库!'));
  shell.exit(1);
}
if (!/origin\/master/g.test(child.stdout)) {
  console.log(chalk.red('只允许在master分支上进行发布,请合并到master分支!'));
  shell.exit(1);
}

更新依赖包版本

这里涉及一个小知识,我们可以通过npm version xxx命令来升级我们的版本。它对应的升级命令有:

npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]
'npm [-v | --version]' to print npm version
'npm view <pkg> version' to view a package's published version
'npm ls' to inspect current package/dependency versions

更多详细的内容可以查看npm的官方文档: https://docs.npmjs.com/cli/v7/commands

这里我们只选择使用命令来升级小版本,也就是使用命令npm version patch, 它可以将0.0.1升级到0.0.2, 而对于中间版本和大版本的升级则由升级者主动修改package.json里面的版本号来进行升级,这样能比较大限度的避免版本错误升级的情况。

版本升级对应的代码也比较简单:

shell.exec('npm version patch');

当然如果私库涉及到打包之类的操作也可以直接在升级之后进行打包构建, 如:

shell.exec('npm run build');
shell.cd('dist');
发表于: 2021-09-09