如何在 GitHub Actions 中绑定安装私有 gem?

18

我希望能够通过 Github Actions 在一个叫做 priv_gem_a 的 gem 上运行 rspec。

priv_gem_a 依赖于另一个在私有仓库中的 gem(叫做 priv_gem_b)。然而,由于权限无效,我无法进行 priv_gem_b 的 bundle install。

错误:

Fetching gem metadata from https://rubygems.org/..........
Fetching git@github.com:myorg/priv_gem_b
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Host key verification failed.
Retrying `git clone 'git@github.com:myorg/priv_gem_b' "/opt/hostedtoolcache/Ruby/2.6.3/x64/lib/ruby/gems/2.6.0/cache/bundler/git/priv_gem_b-886cdb130fe04681e92ab5365f7a1c690be8e62b" --bare --no-hardlinks --quiet` due to error (2/4): Bundler::Source::Git::GitCommandError Git error: command `git clone 'git@github.com:myorg/priv_gem_b' "/opt/hostedtoolcache/Ruby/2.6.3/x64/lib/ruby/gems/2.6.0/cache/bundler/git/priv_gem_b-886cdb130fe04681e92ab5365f7a1c690be8e62b" --bare --no-hardlinks --quiet` in directory /home/runner/work/priv_gem_a/priv_gem_a has failed.

我认为这与在同一组织中的不同私有存储库无法访问有关。

因此,我尝试将环境变量添加到我的工作流文件中,包括 GITHUB_TOKEN,但并没有起作用:

name: Test Code

on:
   push:
     branches:
     - master

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up Ruby 2.6
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 2.6.x
    - name: Install dependencies
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        BUNDLE_GITHUB__COM: ${{ secrets.GITHUB_TOKEN }}:x-oauth-basic
      run: |
        gem install bundler
        gem update bundler
        bundle install --without development --jobs 4 --retry 3
    - name: Test with RSpec
      run: |
        bundle exec rspec

这只是来自Gemfile的一个片段:

gem 'priv_gem_b', '>= 7.0.1', '< 8', git: 'git@github.com:my_org/priv_gem_b', branch: :master

2个回答

15

我相当确定仓库中默认的 GITHUB_TOKEN 只限于该仓库使用,无法用于访问其他仓库。

尝试使用一个具有repo范围的令牌。在https://github.com/settings/tokens处创建一个,并将其添加为工作流所运行的仓库的秘密。 它将在https://github.com/[username]/[repo]/settings/secrets下。

在您的工作流程中,请使用该机密而不是 GITHUB_TOKEN

BUNDLE_GITHUB__COM: ${{ secrets.REPO_SCOPED_TOKEN }}:x-oauth-basic

或者,使用x-access-token方法,我认为这是更可取的。

BUNDLE_GITHUB__COM: x-access-token:${{ secrets.REPO_SCOPED_TOKEN }}

此外,我认为您需要更改对私有gem的引用方式,以便使用HTTPS。 您现在引用它的方式意味着它将尝试使用SSH密钥,而不是BUNDLE_GITHUB__COM中定义的令牌。

gem 'my_private_repo', git: 'https://github.com/username/my_private_repo.git'

嘿@peterevans,感谢您对GITHUB_TOKEN的澄清,现在我明白了!但是,我尝试了这种方法,但似乎没有获取到我的令牌(.../tokens旁边的新令牌显示为“从未使用”)。错误仍然相同。有什么想法吗? - Stefan Collier
@StefanJCollier 你是否也在托管工作流的代码库中创建了包含令牌的密钥? - peterevans
是的,我确实这样做了。有没有可能打印出密钥(只是为了证明它被使用了)?我假设如果你使用${{ secrets.THIS_DOES_NOT_EXIST }},它不会失败,因为它没有定义。 - Stefan Collier
你使用密钥的方式对我来说是正确的。我相信我现在知道问题出在哪里了。我已经更新了答案并添加了一个额外的步骤。尝试更改宝石引用以使用HTTPS。 - peterevans
@StefanJCollier 你试过我建议的更新了吗? - peterevans

4

我的项目包含一个私有的 gem,它被使用 SSH 密钥访问。 我们不想改变 Gemfile 并通过 https 访问它,因为那将涉及到修改部署过程。

我们使用了这个操作:ssh-key-action。我们将私有的 SSH 密钥添加到了 GitHub secrets 中的 SSH_KEY

- name: Install SSH keys
  uses: shimataro/ssh-key-action@v2
  with:
    key: ${{ secrets.SSH_KEY }}
    known_hosts: "Add known public keys of github here"

- name: Install gems # usual step to install the gems.
  run: |
    bundle config path vendor/bundle 
    bundle install --jobs 4 --retry 3

它运行得非常流畅。

注意 - 确保不要给定硬编码的私钥作为key参数。这种方式不起作用。


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