使用GitHub Actions自动发布npm包

之前通过使用npm发布自己的第一个包我们已经知道如何布自己的一个 npm 包,以及通过使用rollup打包自己的npm包来使得我们的包真正在生产环境可用。

不过目前还有几个问题,就是每次发布前都需要执行打包命令,发布包时都需要登录npm账号,修改 package.json 的版本号,然后再通过npm login,虽然开启了2FA之后发布包已经足够方便,但是仍然不够最简,有没有办法可以解决上述问题呢?

答案当然是有的,那就是使用GitHub Actions来自动发布 npm 包,为了实现这个功能,我们需要做以下四个步操作:

  1. 使用 github 来管理项目
  2. 创建npm Access Token
  3. npm Token 添加到 GitHub Secrets
  4. 项目开启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 PackageConfigure进入到action workflow配置页面。

github 默认已经帮我们生成了一个yml文件:

这里我们需要根据我们的需求来修改workflow,具体修改点如下:

修改workflow的触发时机

因为我希望将本地代码推送到远程仓库时来执行workflow,所以增加一个触发条件

yaml 复制代码
on:
  release:
    types: [created] # 仅当创建 Release 时触发
  push:
    branches:
      - main         #仅当 push 到 main 分支时触发

这里的branches也可以配置为其它你想要的分支,如masterrelease,我就用的默认的main分支,所以只监听main分支的push操作。

修改NODE_AUTH_TOKEN的值

github 帮我们默认创建的 workflowNODE_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.jsonversion的值,产生一条提交记录,而默认情况下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的发包,真正做到了无感发包。

相关推荐
AlienZHOU2 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
CSDN官方博客2 小时前
GitHub Copilot 新手极速上手指南
github·copilot
Captaincc5 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师6 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen7 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒7 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
用户5784429228627 小时前
GraphRAG 与 LightRAG
github
峰向AI7 小时前
别再花几万块搭 Agent 了,[微软开源] 3500 行框架让 AI 自己练级
github
前端snow7 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林8187 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器