之前通过使用npm发布自己的第一个包我们已经知道如何布自己的一个 npm 包,以及通过使用rollup打包自己的npm包来使得我们的包真正在生产环境可用。
不过目前还有几个问题,就是每次发布前都需要执行打包命令,发布包时都需要登录npm
账号,修改 package.json
的版本号,然后再通过npm login
,虽然开启了2FA
之后发布包已经足够方便,但是仍然不够最简,有没有办法可以解决上述问题呢?
答案当然是有的,那就是使用GitHub Actions
来自动发布 npm 包,为了实现这个功能,我们需要做以下四个步操作:
- 使用
github
来管理项目 - 创建
npm Access Token
- 将
npm Token
添加到GitHub Secrets
- 项目开启
GitHub Actions
,配置workflows
使用 github 来管理项目
这里就不过多赘述,大致流程如下:
- 注册 github 账号,创建一个新的仓库
- 本地项目初始化 git, 并关联远程 github 仓库地址
这样我们就又有了一个有远程仓库托管的项目,下面就开始进行第二步
创建npm Access Token
为什么要创建 npm Access Token
就像我们在本地执行npm publish
发布包到npm
上需要经过2FA
认证来鉴定我们的身份,那么我们在使用GitHub Actions
来帮我们自动化将包发布到npm
上,同样是需要经过认证鉴定身份的,也就是Git Hub
需要有访问我们npm
账号的权限,而这个访问权限就是通过npm Access Token
来实现
创建npm Access Token
步骤
登录自己的npm
账号,点击头像选择Account
,进入到账号信息管理页面,选择左侧的Access Tokens
,这里可以看到已经又了 4 个 Tokens
,这是开启2FA
认证后系统给加的。
我们选择Generate New Token
来生成新的token
,选择下拉列表的第一个选项Granular Access Token
,点击后需要执行一次 2FA 验证,然后进入到Token
创建页面:
依次说需要填写的信息:
- Token name:必填项,npm toke 的唯一标识
- Description:我们的这个 npm token 是用来干嘛的
- Expiration:过期时间,这里没有永久的选项,我直接拉到了 2099 年
- Allowed IP ranges:ip 白名单,可选的,按需配置
- Packages Permissions:这里选择下拉的
Read and write
,表示我们创建的npm token
是有访问 npm 的读写权限的。范围默认为账号下的全部包,当然也可以选择只限定某一个包的读写访问。 - Organizations Permissions:组织的权限,因为我没创建组织,所以这里就不选择。
点击底部的生成 token 按钮,就会看到我们的NPM_TOKEN
就生成了:
这个 token
只会展示一次,妥善保存,复制下来,进入到第三步。
将 npm Token 添加到 GitHub Secrets
首先进入项目,选择settings
标签,再选择左侧的Secrets and variables
菜单的Actions
子菜单:
点击New repository secret
,进入到Action secrets
创建页面,名称用和npm token
一样的,复制刚刚的npm token
值到Secret
内,然后点击Add secret
按钮,这样我们就为仓库生成了一个Action secret
,这个secret
就是github
访问npm
的密钥。
下面进入到第四步,项目开启GitHub Actions,配置workflows
项目开启GitHub Actions,配置workflows
选择项目的Actions
菜单,选择Publish Node.js Package
的Configure
进入到action workflow
配置页面。
github 默认已经帮我们生成了一个yml
文件:
这里我们需要根据我们的需求来修改workflow
,具体修改点如下:
修改workflow
的触发时机
因为我希望将本地代码推送到远程仓库时来执行workflow
,所以增加一个触发条件
yaml
on:
release:
types: [created] # 仅当创建 Release 时触发
push:
branches:
- main #仅当 push 到 main 分支时触发
这里的branches
也可以配置为其它你想要的分支,如master
、release
,我就用的默认的main
分支,所以只监听main
分支的push
操作。
修改NODE_AUTH_TOKEN
的值
github
帮我们默认创建的 workflow
,NODE_AUTH_TOKEN
使用的是secrets.npm_token
,这里需要改为我们自己创建的NPM_TOKEN
:
bash
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
增加 npm 打包命令
因为我使用了rollup
来打包,并且配置了npm run build
命令来执行rollup -c
,所以我们需要在workflow
内也执行这一套命令:
yaml
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: npm install
run: npm install
- name: Rollup build
run: npm run build
- name: Publish to npm
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
自动修改版本号
因为 npm
不允许发布同版本的包。如果 package.json
中的 version
没有更新,npm publish
会失败。所以我们需要在 npm publish
之前检查版本号,并根据需要自动更新版本号。添加如下命令:
arduino
- run: npm version patch
需要注意的是,这个命令会帮我们修改package.json
内version
的值,产生一条提交记录,而默认情况下Actions
是没有写仓库权限的,所以需要进行如下修改:
修改 Actions
读写仓库权限
点击settings
选择 左侧Actions
目录,点击general
目录,下拉找到workflow permissions
配置,勾选Read and write permissions
:
这样我们的workflow
就有了写仓库的权限,但是因为涉及到代码的提交,所以还需要在workflow
中添加 git
账户的信息以告诉github
是谁提交的,并且再手动做一次代码的提交操作,完整的脚本如下:
arduino
- name: Set up Git user
run: |
git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
- name: Bump version (optional)
run: npm version patch # 自动更新版本号
- name: Commit changes
run: |
git add .
git commit -m "Bump version" || echo "No changes to commit"
git push origin main
最后附上完整的workflow
配置文件:
yaml
name: Node.js Package
on:
release:
types: [created] # 仅当创建 Release 时触发
push:
branches:
- main #仅当 push 到 main 分支时触发
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 20
registry-url: 'https://registry.npmjs.org'
- name: Set up Git user
run: |
git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
- name: Bump version (optional)
run: npm version patch # 自动更新版本号
- name: Commit changes (if needed)
run: |
git add .
git commit -m "Bump version" || echo "No changes to commit"
git push origin main
- name: npm install
run: npm install
- name: Rollup build
run: npm run build
- name: Publish to npm
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
我们执行⌘+s
保存workflow
修改,然后就可以看到actions
在运行了:
可以看到运行成功,然后我们再看 npm 包,版本也变成了1.0.12
,这样就完成了一个使用Github Actions
自动发布npm
包的过程。
⚠️ 有点需要注意,因为
github actions
帮我们修改了版本号做了一次代码提交,所以每次本地代码提交到远程前记得先拉一下远程仓库的代码。
总结
通过使用Github Actions
自动发布npm
包,以后妈妈再也不用担心我们发布npm
包了,每次本地修改代码后,直接提交到远程代码仓库,就可以自动化的同步完成npm
的发包,真正做到了无感发包。