使用github action发布npm package

frontend

初始目的是看看github ci怎么用也学一下怎么发布npm包。我自己本身是有gitlab ci和azure devops的使用经验的。流程follow下来发现几乎和gitlab ci一样,其实azure devops给我感觉也如此,考虑到gitlab这一套东西是开源的,严重怀疑这两内核上可能都是在gitlab上改的,因为前公司有类似基于gitlab的产品。

CI/CD简单来说就是编译,测试,打包,发布流程自动化,做到问题早发现早治疗。这3个产品在workflow的定义上都是基于yml文件,定义不同的job,每个job划分不同的stage,然后会有一些通用的plugin,比如执行shell command,下载或上传某个东西等等,也能选择执行环境(gitlab runner),支持secrets配置,一些非常通用的功能。

下面是我在写这个npm publish workflow时学到的几点:

  1. on定义了什么时候workflow会被trigger。比如release的时候,或者push到master的时候,都可以作为一个event。其中workflow_dispatch非常特殊,支持手动运行workflow,这也是我用来测试workflow的方法。不用通过push或release等手段来触发workflow运行。
  2. GITHUB_TOKEN. 这个secret会被自动inject到你的workflow中,在yml中可以直接使用。但是你需要定义permissions说明这个token可以用来做什么。比如说我想把npm发布到github packages,就需要packages write权限。
  3. 发布到GitHub packages的npm包必须带有scope,默认scope是repo owner名,而发布带有scope的包到官方的npm仓库中必须是付费账户才行。
  4. 我是用yarn publish来发布的,但过程中却发现setup-node这个action定义的registry-url和scope对于yarn并不会生效。看了下源码,发现这些配置会被写入.npmrc文件,而现在yarn并不会读.npmrc文件。 解决方法为在publish命令后加上—-regsitry参数且在package.json的name字段中加入scope,另或直接添加一个.yarnrc配置。可以参考我的workflow写法。