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

Posted

技术标签:

【中文标题】如何在 github 操作工作流 ci 中通过 npm 安装私有 github 存储库【英文标题】:How to install private github repository via npm in github actions workflow ci 【发布时间】:2020-09-04 17:29:41 【问题描述】:

我正在尝试通过运行npm install 在 github 工作流 ci 中安装 npm 依赖项。但是我收到以下错误:

npm ERR! Error while executing:
npm ERR! /usr/bin/git ls-remote -h -t ssh://git@github.com/private-org/private-repo.git
npm ERR! 
npm ERR! Warning: Permanently added the RSA host key for IP address 'removed' to the list of known hosts.
npm ERR! git@github.com: Permission denied (publickey).
npm ERR! fatal: Could not read from remote repository.

ci.yml

name: CI

on:
  push:
    branches: [master ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js
      uses: actions/setup-node@v1
      with:
        node-version: '12.x'
    - run: node --version
    - run: npm install

package.json

  ...
  "dependencies": 
    "some-pacakage": "git+ssh://git@github.com/private-org/private-repo.gitt",
  ,
  ...

这个some-package 正在由 npm 通过 github 安装。存储库与运行工作流的组织位于同一组织内。要在本地解决此问题,您可以在与组织相关联的 github 帐户上设置 ssh 密钥。

但是我该如何解决这个问题,以便它能够通过工作流 ci 中的 github repo 安装该软件包,而我没有使用我的个人 github 帐户。

【问题讨论】:

【参考方案1】:

正在通过 ssh 安装私有存储库。如果您在管道中设置了 ssh 密钥,它将在尝试安装时使用该 ssh 密钥。

幸运的是,有一个 github 操作可以让我们这样做https://github.com/webfactory/ssh-agent

在 npm install 上方添加以下内容:

  - uses: webfactory/ssh-agent@v0.2.0
  with:
    ssh-private-key: $ secrets.SSH_PRIVATE_KEY  

设置/先决条件

https://github.com/webfactory/ssh-agent#usage

    创建具有足够访问权限的 SSH 密钥。出于安全原因,请勿使用您的个人 SSH 密钥,而是设置一个专用的 用于 GitHub 操作。如果您不确定,请参阅下面的一些提示 关于这一步。

    确保您没有在私钥上设置密码。

    在您的存储库中,转到“设置”>“机密”菜单并创建一个新机密。在本例中,我们将其命名为 SSH_PRIVATE_KEY。放在 将私有 SSH 密钥文件的内容放入内容字段。这把钥匙 应该以 -----BEGIN ... PRIVATE KEY----- 开头,由许多组成 行并以 -----END ... PRIVATE KEY-----结尾。

【讨论】:

【参考方案2】:

标准令牌没有足够的权限:

令牌的权限仅限于包含您的工作流程的存储库。如需更多信息,请参阅"Permissions for the GITHUB_TOKEN"。

您必须手动创建一个个人访问令牌来授予对包的访问权限:

如果您需要的令牌需要 GITHUB_TOKEN 中没有的权限,您可以创建个人访问令牌并将其设置为您的存储库中的机密:

    使用或创建具有该存储库适当权限的令牌。如需更多信息,请参阅"Creating a personal access token for the command line"。 将令牌作为机密添加到工作流的存储库中,并使用 $ secrets.SECRET_NAME 语法引用它。如需更多信息,请参阅"Creating and using encrypted secrets"。

来源:https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token

【讨论】:

【参考方案3】:

我在从 Travis 迁移到 GitHub Actions 时遇到了类似的问题。

您需要做的基本上是Git 如何获取您的远程存储库。在package.json 中,使用了"git+ssh://git@github.com/private-org/private-repo.gitt"。所以它试图使用 ssh 访问密钥来获取 repo。如果你不添加访问密钥,它会失败。

相反,我们要做的是重新配置 Git 以使用 HTTP 身份验证。

这是我在GitHub Actions workflow 中使用它的方式。我已在 GitHub Actions 中将我的 GitHub PAT token 作为秘密添加为 GA_TOKEN

  - name: Reconfigure git to use HTTP authentication
    run: |
      git config --global url.https://$ secrets.GA_TOKEN @github.com/.insteadOf ssh://git@github.com/
Reference

【讨论】:

【参考方案4】:

如果您使用的是 docker 容器 / docker-compose 我最近为使用 stdin 或 auth.json 文件的 npm install 编写了一个 cli 包装器

目前仅在 docker-containers 中进行测试

GitHub:https://github.com/with-shrey/gitpm-node

Npm:https://www.npmjs.com/package/gitpm-node

【讨论】:

以上是关于如何在 github 操作工作流 ci 中通过 npm 安装私有 github 存储库的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 GitHub 操作中将工作目录添加到部署

使用 GitLab CI/CD 等 GitHub 操作

如何在 cassandra 中通过更新时间获得最后 n 个结果?

在pycharm中通过VCS快速提交代码

在 Swift2 中通过 HTTP2 与 APNS 服务器通信