Hi my new friend!

2023年,还在手动发布 npm 包?

  • Home
  • npm_publish_package
Scroll down
距离上次更新已经 1131 天了, 文章内容可能已经过时。

还在手动 npm publish 发布 npm ? 还在手动更新版本创建发布 Github Release ?还在手动添加 Changelog?是时候利用 CI/CD 解放双手啦。常见的 CI/CD 有很多,比如 Jenkins、GitLab CI、CircleCI 、Github Actions 等。本文主要是通过 Github Actions 来自动化处理 npm 包管理。

Github Actions ​

GitHub Actions 距离推出已经好几年了,相信小伙伴们没用过,也听说过。GitHub Actions 不仅仅是能自动执行生成、测试和部署操作,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。而且 GitHub 提供 Linux、Windows 和 macOS 多种虚拟机来运行工作流程,可以更具项目选择合适的虚拟机环境。

GitHub Actions 其实主要步骤只有两个,event (事件触发时机)、jobs(工作流程)。如果还不熟悉 GitHub Actions,可以参考文档对其大致使用有个了解。

发布 Npm ​

在本地发布 npm 包都是本地打包成组件后,登录 npm 账号运行 npm publish 发布。使用 GitHub Actions 来发布 npm 可以使用 Npm Access Tokens,可以更据需要分配 Tokens 权限,不需要使用账号密码登录。

Github Actions 发布 Npm ​

首先需要确定你工作流触发时机,这个需要根据你个人习惯决定。

举例:

yaml
on:
  push:
    tags:
      - "v*"
yaml
on:
  push:
    branches: [master]
yaml
# 仅在 master 推送时,且 docs 下文件修改时触发,更多可以[参考文档](https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows)
on:
  push:
    branches: [master]
    paths:
      - 'docs/**'

本文就以为推送 Tag 触发为例:

在你项目下添加 .github\workflows\publish.yml 文件,内容如下

yaml
name: NPM Publish
on:
  push:
    tags:
      - "v*"

代码拉取和Node配置 ​

在 jobs 添加一个名为 build 的 job,配置 build 的环境和拉取代码。runs-on: ubuntu-latest 配置虚拟机为 ubuntu,使用官方提取代码拉取和 配置 Node 的 Actions,更多 官方提供 Actions

yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2   # 拉取代码
      - uses: actions/setup-node@v3 # 设置 Node 版本
        with:
          node-version: 16
          registry-url: 'https://registry.npmjs.org'
          cache: yarn

配置环境密钥 ​

添加环境变量,在你项目 => Settings => Secrets and variables => Actions 中 添加你的密钥,名称随意取,密钥值为你上面生成的 Npm Access Tokens。

例如: Name => NPM_TOKEN Secret => 你的 Npm Access Tokens

发布 Npm ​

build 的 job 中,添加发布 Npm 操作,利用 NPM_TOKEN 发布 npm 包

yaml
    steps:
      - name: Npm Publish
        run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

到此时,当你推送一个以 v开头 tag 到仓库时,就会执行这个 publish.yml,这个 Action 会将当前仓库发布到 Npm 了。

当然你的包可能还需要执行一些构建操作等等,你可以在 run 里执行多条命令

yaml
run: |
    npm run build
    #...更多操作
    npm publish

区分 Beta 和 latest ​

默认情况下 npm publish 发布时正式包,如果需要测试包需要执行 npm publish --tag beta。利用 git tag 我们可以将 v1.0.2 格式发为正式包,将 v1.0.2-beta.1 格式发布测试包。

修改 publish 流程,Github Action 支持 if 操作,并不支持 else,只能通过如下模拟 if else 操作。

yaml
    steps:
      - name: Beta Publish
        if: ${{ contains(github.ref,'beta') }}
        run: npm publish --tag beta
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Publish
        if: ${{ !contains(github.ref,'beta') }}
        run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

根据 Tag 更新版本号 ​

为例避免每次修改 package.json 中版本,我们可以根据 tag 来修改 package.json 中版本,因为上面配置 node 环境,可以直接执行 node 代码,我们直接添加一个 publish.js 文件,去修改 package.json 中 version 。

js
const fs = require('fs')
const path = require('path')

if (process.env.RELEASE_VERSION) {
    const version = process.env.RELEASE_VERSION.split('/').reverse()[0]
    console.log('当前版本:', version);
    const pkg = require('./package.json')
    pkg.version = version.replace('v', '')
    fs.writeFileSync(path.resolve(__dirname, './package.json'), JSON.stringify(pkg, null, 4), 'utf-8')
}

修改 publish 流程,在发布前修改版本,并将 github.ref 添加环境变量 RELEASE_VERSION

yaml
    steps:
      - name: Build
        run: node ./publish
        env:
          RELEASE_VERSION: ${{ github.ref }}

创建发布 Github Release ​

官方 actions/create-release 不在维护,推荐如下 Actions,可以结合需要选择,你也可以去前往 marketplace 选择更多 Actions。

很多创建 Release 的 Actions,并不会将你的提交自动生成发版说明,所以我编写了一个发布 Release 的 Actions,具体实现参考 MaLuns/add-release 以满足我的需求。Github 为我们提供 actions/toolkit 帮助我们简化了很多操作。

简单描述如何实现:

从当前位置开始分页获取提交记录获取所有 tags循环读取记录是否是 tag 处是否此页记录是否循环完成是处理两个 tag 间提交记录存储这条记录循环当页提交记录否是否还有下页是否根据规则,将记录生成 MD

编写完自定义 Actions 后,使用自定义 Actions。

yaml
    steps:
      - name: Release
        uses: MaLuns/add-release@指定版本
        with:
          files: Demo.zip
          generate_by_commit: true

效果图:

效果图

到此,一个根据 Git tag 自动发布 Npm 和 Release 的工作流编写完成了。你还可以在结合 Github Pages、Vercel 等同时自动化部署你的 Npm 包的文档和示例站点等。

  • 本文作者:白云苍狗
  • 本文链接:
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
其他文章
cover
hexo 在线编辑器
  • 23-04-06
  • 13:48
  • 创作类
cover
小程序 swiper 性能优化
  • 22-12-28
  • 05:22
  • 记录类
本站已加入BLOGS·CN