在 Github Action 中通过 Yarn 从 Github 包注册表下载私有模块?发布工作,但安装遇到“401 Unauthorized”

Posted

技术标签:

【中文标题】在 Github Action 中通过 Yarn 从 Github 包注册表下载私有模块?发布工作,但安装遇到“401 Unauthorized”【英文标题】:Download private module from Github Package Registry via Yarn within a Github Action? Publishing works, but installing is met with '401 Unauthorized' 【发布时间】:2020-03-17 09:37:11 【问题描述】:

由于各种原因,我们一直在使用 yarn 管理我们的包,因此我们不能依赖 package-lock.json 来使用带有 github 操作的 npm。

我们无法让 Yarn 作为 github 操作的一部分进行身份验证。 我们已经将我们的 repo npmrc 配置为:

@COMPANY:registry=https://npm.pkg.github.com
registry=https://registry.npmjs.org/

我们正在使用this action for yarn.

这是一个基本设置,我们只是尝试安装模块——仅此而已。

name: CI
on: [push]
jobs:
  build:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: borales/actions-yarn@v2.1.0
        with:
          auth-token: $ secrets.GITHUB_TOKEN 
          registry-url: "https://npm.pkg.github.com"
          scope: tlabs
          cmd: version
        env:
          NODE_AUTH_TOKEN: $ secrets.GITHUB_TOKEN 
          NPM_REGISTRY_URL: https://npm.pkg.github.com
      - name: Create NPMRC
        run: |
          echo "//npm.pkg.github.com/:_authToken=$ secrets.GITHUB_TOKEN " > ~/.npmrc
      - name: Install
        run: |
           yarn install --verbose

默认情况下,此操作将尝试运行 install 以绕过我在“版本”中提供了一个基本命令,因此它只显示纱线版本,仅此而已。

运行 yarn install 将适用于所有其他包,但当它到达我们的私有模块时,它会尝试从正确的注册表 (github) 获取它们,但会遇到 401。

完全错误:

verbose 7.614802156 Error: https://npm.pkg.github.com/download/@tlabs/utils/1.0.1/afe9eaa6f9565f95c31563cbecfe617d7970f44077302cbe9ca8ee3223550469: Request failed "401 Unauthorized"
    at ResponseError.ExtendableBuiltin (/usr/share/yarn/lib/cli.js:696:66)
    at new ResponseError (/usr/share/yarn/lib/cli.js:802:124)
    at Request.<anonymous> (/usr/share/yarn/lib/cli.js:66996:16)
    at Request.emit (events.js:210:5)
    at Request.module.exports.Request.onRequestResponse (/usr/share/yarn/lib/cli.js:141441:10)
    at ClientRequest.emit (events.js:210:5)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:583:27)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:115:17)
    at TLSSocket.socketOnData (_http_client.js:456:22)
    at TLSSocket.emit (events.js:210:5)
error An unexpected error occurred: "https://npm.pkg.github.com/download/@tlabs/utils/1.0.1/afe9eaa6f9565f95c31563cbecfe617d7970f44077302cbe9ca8ee3223550469: Request failed \"401 Unauthorized\"".

【问题讨论】:

默认GITHUB_TOKEN 仅适用于当前存储库。您是否尝试过使用read:packagesrepo 作用域Personal Access Token 而不是GITHUB_TOKEN 啊。有没有办法改变这种情况,还是我只是坚持使用 PAT 进行所有操作? @peterevans aaah,它适用于 PAT——我想我会很高兴它这样做并继续前进。如果您将其发布为答案,我会将其标记为解决方案。 据我所知,没有其他选择。这是对GITHUB_TOKEN 的故意限制,它仅适用于当前存储库。 【参考方案1】:

默认GITHUB_TOKEN 仅适用于当前存储库。您不能使用它来访问另一个存储库中的包。使用read:packagesrepo 作用域Personal Access Token 而不是GITHUB_TOKEN

【讨论】:

我在使用我的 PAT 时仅具有上述权限,但在 GitHub 操作中仍然出现 401 错误。 也在使用我的 PAT 并且在 Github 操作中仍然出现 401 错误。在这里创建了一个新的更深入的问题:***.com/questions/64124831/…【参考方案2】:

我正在创建一个文件 .npmrc 和 .yarnrc。 类型:

name: Test

on: push
jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [12.x]

    steps:
      - uses: actions/checkout@v2
      - name: Node $ matrix.node-version 
        uses: actions/setup-node@v1
        with:
          node-version: $ matrix.node-version 
      - name: Create NPMRC
        run: |
            echo "//npm.pkg.github.com/:_authToken=$ secrets.PACKAGES_TOKEN " >> ~/.npmrc
            echo "@you-scope:registry=https://npm.pkg.github.com" >> ~/.npmrc
            echo 'registry "https://registry.yarnpkg.com"' >> ~/.yarnrc
      - run: yarn install

LowerCase 中为您的 github 用户或您的组织在 github 中替换 @you-scope。 为此存储库创建一个 PACKAGES_TOKEN 脚本。

【讨论】:

【参考方案3】:

在项目的根目录中有一个 .npmrc 文件。

.npmrc 的内容:

registry=https://registry.npmjs.org/
@scope:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=********** (Token generated from github)

@scope 是您的组织名称或用户名。它区分大小写。 此外,要访问 github 注册表中的私有和公共包,您需要有一个令牌。

参考:You need an access token to publish, install, and delete packages.

【讨论】:

以上是关于在 Github Action 中通过 Yarn 从 Github 包注册表下载私有模块?发布工作,但安装遇到“401 Unauthorized”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Odoo 11 中通过 do_action() java-script 方法显示 action_id

如何在 Rasa 的 action.py 中通过 Facebook Messenger 从用户那里获取图像

不借助工具在浏览器中通过Web API执行Dynamics 365操作(Action)实例

在 PySpark 中通过 JDBC 实现 SQL Server

如何在 github 操作工作流 ci 中通过 npm 安装私有 github 存储库

Cognos11中通过URL访问report的设置