如何在 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”