使用 GitHub Actions 从私有 GitHub 存储库安装 npm 模块

36

我正在尝试使用GitHub Actions运行Node.js项目的构建。作为npm install的一部分,我需要直接从私有GitHub仓库(而不是从GPR!)安装npm模块。

package.json中,我有:

"dependencies": {
  ...
  "my-module": "github:<org>/<my-module>#master",
  ...
},

然而,当运行npm install时,我遇到了以下问题:

npm ERR! git@github.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository.

该存储库是我自己组织的一部分,在本地(即从我的计算机)工作正常。如何让此代码运行?

我已经尝试设置NODE_AUTH_TOKEN环境变量,但没有改变。虽然您经常会发现这个建议,但它似乎只适用于GPR。我想避免的是将令牌硬编码到package.json文件中。对此有什么想法吗?


这个回答解决了你的问题吗?npm install private github repositories by dependency in package.json - smac89
更具体地说,是上面链接问题中的这个答案:https://dev59.com/o2Ag5IYBdhLWcg3wwtRp#40312033 - smac89
这对我没用。 - Golo Roden
我不确定哪里出了问题,但你也可以尝试更改用于仓库的url。从您收到的错误信息来看,npm似乎正在尝试使用ssh而不是http(s)解析url。在我链接的那个问题页面中,一些答案展示了使用http(s) url的不同语法,这可能有助于确保使用github令牌而不是期望ssh密钥。 - smac89
5个回答

37

这是我成功安装私有GitHub仓库中依赖包的方法。

可以按照以下方式将依赖项添加到package.json中。前缀github:是可选的。指定#branch#tag也是可选的。

    "dependencies": {
        ...
        "myrepo": "username/myrepo#master",
        "myotherrepo": "github:username/myotherrepo"
    },

这是一个工作流程示例。PAT 是一个 repo 作用域下的个人访问令牌。重要的是在actions/checkout上禁用持久化凭证,否则它们将覆盖你的PAT。请注意,git config更改在步骤之间持续存在,因此您每个作业只需要运行一次。

      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions/setup-node@v1
        with:
          node-version: 12.x
      - run: git config --global url."https://${{ secrets.PAT }}@github.com/".insteadOf ssh://git@github.com/
      - run: npm ci
      ...

2
非常好用,这对于一个项目有多个模块但源代码是 GitHub 私有仓库而不是 NPM 的情况非常有用。 - Allloush
谢谢!这个方法非常好用,包括 github: 前缀。我还要提醒大家需要在仓库的 secrets 中创建 PAT 密钥。 - Assaf Sapir
@peterevans 祝福你,老兄。 我的软件包文件已经使用了私有仓库的HTTPS URL,所以我在答案中将ssh://git@github.com/更改为https://github.com,结果非常顺利。 - Safeer Raees
1
我按照这个步骤操作,但是出现了 npm ERR! remote: Support for password authentication was removed on August 13, 2021. 的错误提示。 - Himakar Reddy
1
git config --global url."https://github-actions:${{ secrets.TOKEN }}@github.com/".insteadOf ssh://git@github.com/ 这对我有用。 - Himakar Reddy
显示剩余2条评论

9

一种非常简单的解决方案,只需要对仓库进行只读访问权限。使用GitHub的Deploy Keys和以下操作:https://github.com/webfactory/ssh-agent

1. 在以下格式中的package.json提供一个私有仓库:

"dependencies": {
    "repo": "git+ssh://git@github.com:user/private_repo.git",
}

2. 在本地生成部署密钥。使用空白密码

ssh-keygen -f my_key

3. 通过 GitHub UI 创建部署密钥(建议设置为只读)。使用 my_key.pub 的内容。

Deploy keys

4. 通过 GitHub UI 为目标仓库创建名为 REPO_SSH_KEY 的 GitHub Actions 秘钥,该秘钥将用于运行 GitHub Actions。请使用 my_key 的内容,它是一个私有密钥。

SSH secret

5. 更新 GitHub Actions 工作流文件如下

# ...
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Add SSH key to chekout a private repo
        uses: webfactory/ssh-agent@v0.5.4
        with:
          ssh-private-key: ${{ secrets.REPO_SSH_KEY }}

      - name: Checkout code
        uses: actions/checkout@v2
      
      # ...
      # the rest of the steps, including npm install
      # that will successfully access the private repo

这就是应该如何做以及为什么首先需要部署密钥的原因。 - Jankapunkt

1

从错误和你在package.json中引入依赖的方式来看,似乎你没有传递认证凭据(token、ssh)。

请参考Git URLs as Dependencies文档了解具体信息。

可以通过https和oauth或ssh实现。

https和oauth创建一个具有“repo”范围的访问令牌,然后使用此语法

"package-name": "git+https://<github_token>:x-oauth-basic@github.com/<user>/<repo>.git"

ssh:设置ssh,然后使用以下语法:

"package-name": "git+ssh://git@github.com:<user>/<repo>.git"
(note the use of colon instead of slash before user)

1
你可以使用 x-oauth-basic 方法,但请确保在结帐操作中添加 persist-credentials: false,如上面的回复所述。 - cSn

1
在我的情况下有效的方法是,在根目录下创建一个npmrc文件,并使用来自secrets的内置GITHUB_TOKEN。
  - name: Create .npmrc
    run: echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc

我还需要使用来自私有存储库的操作通过“管理操作访问”来允许对存储库进行读取访问,以使“GITHUB_TOKEN”正常工作。据我所知,“GITHUB_TOKEN”仅适用于当前存储库。否则,您也可以将具有读取软件包权限的PAT(个人访问令牌)作为操作密钥传递。
我认为如果您使用“actions/setup-node@v3”来创建npmrc,或者将其作为环境变量传递,可能需要执行相同的操作。 访问示例

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接