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

qc6wkl3g  于 2023-10-19  发布在  Git
关注(0)|答案(5)|浏览(183)

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

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

但是,当运行npm install时,我得到:
npm错误!email protected(https://stackoverflow.com/cdn-cgi/l/email-protection):权限被拒绝(公钥)。npm ERR!fatal:无法从远程存储库读取。
存储库是我自己组织的一部分,在本地(即从我的机器)它工作。我该怎么办?
我已经试过设置NODE_AUTH_TOKEN环境变量,但没有什么区别。虽然你经常发现这个建议,但它似乎只针对GPR。我想避免的是必须将令牌硬编码到package.json文件中。对此有什么想法吗?

iezvtpos

iezvtpos1#

这就是我如何设法从私有GitHub存储库安装依赖项的方法。
package.json中的参数可以按如下方式添加。github:前缀是可选的。#branch#tag也是可选的。

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

下面是一个示例工作流。PAT是一个repo作用域Personal Access Token。在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://[email protected]/
      - run: npm ci
      ...
pexxcrt2

pexxcrt22#

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

1.在package.json中提供私有repo,格式如下:

"dependencies": {
    "repo": "git+ssh://[email protected]:user/private_repo.git",
}

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

ssh-keygen -f my_key

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

4.通过GitHub UI为目标存储库创建一个名为REPO_SSH_KEY的GitHub Actions secret-将运行GitHub Actions的那个。使用my_key的内容-它是一个私钥

5.更新GitHub操作工作流文件,如下所示

# ...
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Add SSH key to chekout a private repo
        uses: webfactory/[email protected]
        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
2j4z5cfb

2j4z5cfb3#

从错误和您包含依赖项的方式(在package.json中)来看,似乎您没有传递身份验证凭据(token,ssh。
请参考此文档了解Git URL作为副本的详细信息
它可以通过https和oauth或ssh完成。

https和oauth:具有“repo”作用域的create an access token,然后是use this syntax

"package-name": "git+https://<github_token>:[email protected]/<user>/<repo>.git"

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

"package-name": "git+ssh://[email protected]:<user>/<repo>.git"
(note the use of colon instead of slash before user)
pxq42qpu

pxq42qpu4#

对我有用的。在root目录下创建一个npmrc文件,使用来自secrets的内置GITHUB_TOKEN

- name: Create .npmrc
    run: echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc

我还需要允许通过Manage Actions access从私有存储库使用操作对存储库进行读访问,以便GITHUB_TOKEN工作。AFAIK GITHUB_TOKEN的作用域为当前存储库。否则,您也可以将具有读取包权限的PAT(个人访问令牌)作为操作密码传递。
我假设如果您使用actions/setup-node@v3来创建npmrc,也需要这样做。或者你把它作为一个env var传递。
Access Example

yftpprvb

yftpprvb5#

你应该编辑你的.npmrc文件。也可以使用npm config
npm config set @myco:registry http://reg.example.com
请参阅下面的线程了解更多信息:Is there any way to configure multiple registries in a single npmrc file

相关问题