GitHub Actions中semantic-release未更新版本导致npm发布失败
配置错误说明
你的配置有3个核心问题,其中两个直接导致semantic-release不执行版本更新、后续npm发布失败:
- checkout浅克隆导致semantic-release无法分析提交:
actions/checkout@v3默认配置下只会拉取最近1次提交的浅克隆副本,semantic-release需要读取完整的git提交历史、对比历史tag来判断是否需要生成新版本、以及新版本的版本号等级,浅克隆下拿不到足够的git元数据,会直接跳过版本更新流程。 - 作业间文件系统完全隔离:GitHub Actions的每个
job都运行在独立的临时虚拟机实例中,release作业里semantic-release生成的版本号修改、changelog、tag等所有文件变更,都会在第一个作业结束后随临时实例销毁。第二个publish-npm作业重新执行checkout拉取的是远程仓库的原始代码,根本拿不到semantic-release处理后的代码,就算前一个作业完成了版本更新,第二个作业拿到的还是旧版本代码,发布必然失败。 - 发布逻辑重复冲突:你已经给semantic-release传入了
NPM_TOKEN,semantic-release默认携带的npm插件会在版本更新完成后自动执行npm发布,你额外拆分独立作业手动执行npm publish属于重复逻辑,会触发版本重复的报错。
修正方案
优先选择单作业方案,这也是semantic-release官方推荐的配置方式:
name: Release on: push: branches: - main jobs: release: name: Release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取完整git提交历史 - uses: actions/setup-node@v3 with: node-version: 16 registry-url: https://registry.npmjs.org/ - name: Install dependencies run: npm ci - name: Run semantic-release env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: npx semantic-release
如果你因为特殊业务逻辑必须拆分两个作业,需要先在semantic-release配置里关闭默认的npm发布能力,再通过artifact在作业间传递处理后的代码,配置参考如下:
name: Release on: push: branches: - main jobs: release: name: Release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-node@v3 with: node-version: 16 - name: Install dependencies run: npm ci - name: Run semantic-release env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} run: npx semantic-release - name: Upload processed code uses: actions/upload-artifact@v3 with: name: release-code path: ./* publish-npm: needs: release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: name: release-code path: . - uses: actions/setup-node@v3 with: node-version: 16 registry-url: https://registry.npmjs.org/ - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
内容的提问来源于stack exchange,提问作者user19024399
相关产品推荐
相关产品推荐

