在 GitHub Actions 工作流程中未使用语义发布-monorepo 找到存储库

Posted

技术标签:

【中文标题】在 GitHub Actions 工作流程中未使用语义发布-monorepo 找到存储库【英文标题】:Repo not found using semantic-release-monorepo in GitHub Actions workflow 【发布时间】:2021-08-28 16:17:15 【问题描述】:

我正在创建一个 GitHub Actions 工作流来构建 npm 包并将其发布到 GitHub 包。 repo 是一个带有多个包的 monorepo,所以我使用了 semantic-release-monorepo 工具。但是,发布步骤失败了,我不知道为什么。

我的 GitHub Actions 工作流文件如下(略删)

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    env:
      GH_TOKEN: $ secrets.MY_PAT 

    steps:
      - name: Checkout repo
        uses: actions/checkout@v2

        run: |
          yarn install
          yarn build

      - name: Setup node for publishing to Github packages
        uses: actions/setup-node@v2
        env:
          NODE_AUTH_TOKEN: $ secrets.GITHUB_TOKEN 
        with:
          node-version: "12.x"
          registry-url: "https://npm.pkg.github.com"

      - name: Yarn publish packages
        env:
          GITHUB_TOKEN: $ secrets.GITHUB_TOKEN  
        run: |
          yarn publish-packages

yarn publish-packages 运行一个脚本,该脚本执行 lerna 命令以进行语义释放

lerna exec --concurrency 1 -- npx --no-install semantic-release -e semantic-release-monorepo

我已确保每个包的 repo package.json 和 package.json 都具有正确的存储库 URL,https://github.com/owner/repo.git。我的个人访问令牌有权回购、写入和删除包。

无论我更改什么配置,该步骤都会失败并显示以下消息:

命令“git push --dry-run --no-verify https://[安全]@github.com/xxx/xxx.git HEAD:develop" 失败并显示错误消息远程:找不到存储库。 26 致命: 未找到存储库“https://github.com/xxx/xxx.git/”。

第二条消息是

EGITNOPERMISSION: 'semantic-release 无法将版本标签推送到 带有 URL 的远程 Git 存储库上的分支 develop https://[secure]@github.com/xxx/xxx.git

我尝试过的其他事情:

在阅读 GH docs 后将 scope="@xxx" 添加到 setup-node 步骤,上面写着“GitHub Packages 仅支持范围内的 npm 包” 根据semantic-release docs,我尝试将GH_TOKEN、GITHUB_TOKEN 和NPM_TOKEN 设置为我的PAT 或秘密中的GITHUB_TOKEN 的每个组合。我相信文档说只支持 PAT。此外,不需要 NPM_TOKEN,因为在 setup-node 操作中使用 registry-url 会创建一个默认使用 NODE_AUTH_TOKEN 的 .npmrc 文件。 有一个几乎类似的问题here,但将.git 添加到他的存储库网址似乎已经为他解决了这个问题 Github docs 说我应该能够使用 PAT 或 GITHUB_TOKEN 作为 .npmrc 文件中的身份验证令牌,所以这不应该是问题

我浏览了有关语义发布、语义发布-monorepo、GitHub Actions 和 GitHub Packages 的文档。如果我需要提供任何其他信息,请告诉我。

【问题讨论】:

【参考方案1】:

经过更多的尝试和错误,我发现了原因。如果我的理解是正确的,Github 工作流将在使用actions/checkout 签出 repo 的步骤中自动使用可用的 GITHUB_TOKEN 密码向 Github 进行身份验证。然后它会保留此步骤中的凭据并在发布包的步骤中重复使用它们,即使我将个人访问令牌作为环境变量注入到该步骤。

最后,解决方法是像这样在第一步中使用persist-credentials 选项

steps:
  - name: Checkout repo
    uses: actions/checkout@v2
    with:
      persist-credentials: false

然后在最后一步使用个人访问令牌向 GitHub 进行身份验证,就像我指出的那样,我认为在我的问题中应该是正确的方法,因为语义发布文档声明仅支持 PAT 身份验证。

【讨论】:

以上是关于在 GitHub Actions 工作流程中未使用语义发布-monorepo 找到存储库的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地运行 GitHub Actions 工作流程?

如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?

使用 GitHub Actions 创建标签而不是发布

仅使用 GitHub Actions 在特定分支上运行作业

在 GitHub Actions 中添加基于日期的标签

环境变量并不总是在 GitHub Actions 工作流文件中展开