基于tags账户的版本管理和自动发布npm包,简化权限控制可以在web端直接控制发送包,不依赖命令行实现对npm包版本的精准控制。有迹可查。那么如何实现npm包的自动发布呢?答案是CI/CD。在Github中配置在Github中,有许多免费的CI/CD服务可用。比如TravisCI、CircleCI等,我用的是TravisCI。安装TravisCITTravisCI为github中的开源项目提供免费的CI/CD服务,可以通过github的marketplacepage安装。安装过程可能涉及现有项目的授权。操作比较简单,travis也有相应的文档,这里略过。配置TravisCITravisCI使用.travis.yml文件进行配置。具体配置规则请参考其官方文档。先看下示例文件语言:node_jsnode_js:-'8'script:npmrunlint&&npmtestbefore_deploy:npmrunbuilddeploy:provider:npmemail:yourmail@xxx.comskip_cleanup:trueapi_key:secure:yoursecrettokenon:tags:truebranch:mastertag:latest本例文件中language:node_js表示使用nodejs的环境,node_js:8表示使用的node8版本。这两个变量的组合决定了ci进程中的travis中将使用的docker环境。也可以指定多个node版本,每个版本执行一次,因为我们要用它来发包,而且只执行一次,所以只需要设置一个合适的node版本即可。Travis中有多个执行阶段。script:npmrunlint&&npmtest是指定Travis定时运行的脚本。这一步一般用于测试。我在这里执行的操作是lint检查代码规范和测试测试。需要在package.json中预先定义对应的npm脚本,此处省略。before_deploy和deploy可以自行解释其含义,因为我的项目在发布的时候需要先构建,所以在deploy之前添加了npmrunbuild操作。这里需要注意的是,travis默认会在部署前进行清理。因此,在before_deploy中生成的文件不能直接被deploy操作使用。要保留这些文件,您需要将skip_cleanup设置为true。api_key是一个比较重要的字段,npm使用它来进行身份验证。这些数据来自npm的令牌管理,并使用travis提供的命令行工具进行加密。具体操作可以参考travis官方文档https://docs.travis-ci.com/us...。on:该选项控制触发部署的条件。我设置为master分支或者tags,也可以设置为onlytags。也就是说,只有在创建新标签时才会触发构建。这样,每当我们创建一个新标签时,npm包就会自动发布。关于自动修改版本和创建tag,请跳到本篇关于npm版本管理的文章末尾。Gitlab中的配置Gitlab是另一个常用的Git服务,很多公司选择基于gitlab实现私有代码仓库。Gitlab有自己的CI/CD服务,我们可以基于gitlab-ci实现npm包的自动发布。配置gitlab-ciGitlabCI需要先配置runner,然后写一个.gitlab-ci.yml配置文件。Gitlab有这方面的文档,所以跳过它。大概可以参考github中的操作。后面会假设已经有可用的runner和docker环境,基于它们自动发布npm包。阶段:-发布#发布到npm发布:阶段:仅发布:-标签标签:-你的跑步者标签脚本:-dockerrun--namenpm-publisher--rm-v$(pwd):/home/node/code--workdir="/home/node/code"--envNPM_TOKEN=${NPM_TOKEN}node:8-alpineshpublish.sh这个文件比较简单。其only:tags选项规定只有操作tag时才会发布publishscript,也就是npm发布的过程。这里我使用dockerrunnode:8-alpine镜像生成一个新的容器,将当前目录(即代码所在的目录)挂载到容器中的/home/node/code,这个位置可以随便写,将workdir设置为挂载目录/home/node/code,并将当前环境中的npm_token变量作为环境变量发送给容器最后执行shpublish.sh脚本,publish.sh脚本内容如下:rm-rf/tmp/publisher\&&mkdir-p/tmp/publisher\&&cp-r。/tmp/publisher\&&cd/tmp/publisher\&&npminstall\&&npmrunbuild\&&npmtest\&&echo'//registry.npmjs.org/:_authToken=${NPM_TOKEN}'>>.npmrc\&&npmpublish这里在发布之前,会将代码复制到/tmp/publisher中,主要是防止docker中生成的node_modules影响到宿主机上的代码目录,造成一些权限问题。发布操作是npminstall&&npmrunbuild&&npmtest&&npmpublish这里比较重要的是创建.npmrc文件,将token等信息写入配置文件。我们使用的是${NPM_TOKEN}这样的环境变量,它来自dockerrun命令中的--env参数提供的参数,那么dockerrun命令中的${NPM_TOKEN}是从哪里来的呢?这取决于GitlabCI中的变量设置。GitlabCI中的变量设置Gitlab可以为CI设置变量(其实Travis也可以),但是比较特殊,所以单独说一下。在项目的Settings->CI/CD中,有一个Variables部分,可以用来设置CI中使用的环境变量。注意这里有个Protected选项,它是做什么用的?(贸然打开,可能获取不到变量。)总之,受保护的变量只对受保护的分支或tag对应的CI任务有效,起到保护密码的作用。即使别人修改.gitlab-ci.yml,加上echo操作,也无法输出密码。要使用Protected功能,您需要将标记创建设置为Protected操作。可以在Settings->Repository->protectedtags中设置,如下图:这样定义的npm_token变量就可以在gitlabci中正常使用了。npm版本管理一般来说,我们会使用semver来进行版本管理。即三阶段版本,分别为major.minor.patchnpm工具提供了version命令,可以方便的修改package.json中的版本号,自动commit,并在本地创建对应的tag。当有大版本更新或者与之前版本不兼容时,应该升级主字段npmversionmajor。当有小版本更新和新增功能时,可以升级小版本npmversionminor。当有bug修复和小调整时,可以升级patch版本npmversionpatchnpmversion会同时创建一个v版本号形式的tag,并将该tag上推自动触发构建。这一步也可以简化。npm版本操作后自动推送,在package.json中添加如下代码,实现npm版本操作后自动推送代码和tag,自动触发npm发布操作。"scripts":{"postversion":"gitpush--follow-tags"}请参阅https://blog.npmjs.org/post/1...https://docs.travis-ci.com/us。..https://docs.gitlab.com/ee/ci...https://docs.gitlab.com/ee/ci...
