如何指定要从私有 github 存储库中提取的 gem?

问题描述 投票:0回答:9

我在 Github 上有一个我想使用的私人仓库。我将我的应用程序部署到 Heroku。如何在我的 gemfile 上指定一个私有存储库作为源?我想仅仅说是不够的

gem "mygem", :git=>"my github address" 
ruby-on-rails-3 github heroku
9个回答
122
投票

我发现部署从私人仓库中提取的 gem 的最佳方法是使用 GitHub 的 OAuth 访问。为此:

  1. Create a GitHub user to access to the repo (best for teams – if you are okay exposing your personal access tokens, you can simply use your own account).

  2. 为用户创建一个 GitHub OAuth 令牌。只需使用

    curl
    通过 GitHub API 执行此操作非常简单;有关更多信息,请参见OAuth API

  3. 将令牌添加到 Gemfile 中的

    git
    url。例子:

gem 'mygem', git: 'https://xxx123abc:[email protected]/user_or_team/mygem.git'

我目前在 Heroku 上使用这种方法,效果很好。美妙之处在于您不必暴露自己的个人信息,如果有什么东西被泄露,您可以随时撤销或重新生成令牌。


42
投票

根据 Heroku 技术支持的建议,最简单的方法是将用户名和密码放入 URL,如 Basic HTTP Auth,例如

gem 'my_gem', :git => 'https://my_username:[email protected]/my_github_account/my_repo.git', :ref => 'revision_no'

这对我们有用。这仍然有些令人不满意,因为我们必须将密码放入 Gemfile 中。我们通过添加一个新的 github 用户帐户并将该帐户添加为 gem 项目的合作者来处理这个问题。仍然不是万无一失的安全,但影响范围更小。

我读到的其他选项是 设置您自己的 gem 服务器vendor the gem.

2012 年 5 月 16 日更新: 另一种绕过将密码放入

Gemfile
的方法是将密码放入环境变量中;在 Heroku 上,您使用
heroku config:add VAR=value
执行此操作,然后在
Gemfile
中,您将使用此变量,例如:

gem 'my_gem',
  :git => "https://#{ENV['var_private_gem_username']}:#{ENV['var_private_gem_password']}@github.com/my_github_account.git",
  :ref => 'rev'

这是 Heroku 上的标准,以避免将密码、API 密钥和任何凭据放入代码中。对于本地开发/测试,您可以设置这些环境变量。或者,假设您的开发机器设置为可以通过 SSH 访问 github,您将不需要本地开发的凭据(SSH 凭据已经生效)。所以你可以设置一些条件逻辑:

private_repo_credentials = %w(var_private_gem_username var_private_gem_password).
  map { |var| ENV[var] }.compact.join(':')
private_repo_credentials << '@' unless private_repo_credentials.empty?
# private_repo_credentials will be "" if neither var is set
# private_repo_credentials will be "username:password@" if they are set
gem 'my_gem',
  :git => "https://#{private_repo_credentials}github.com/my_github_account.git",
  :ref => 'rev'

我没有测试这最后一部分。请提供反馈。


22
投票

如果您想避免将凭据或 oauth 令牌放入存储库,那么这个问题应该得到更好的答案,因为接受的答案和投票最多的答案都是不安全的

请不要这样做:

gem 'my_private_gem', git: 'https://my_username:[email protected]/my_github_account/my_private_gem.git'

gem 'my_private_gem', git: 'https://xxx123abc:[email protected]/my_github_account/my_private_gem.git'

即使您将它们作为环境变量移动,它们仍将写入您的 Gemfile.lock.

正确的解决方案是将以下内容放在 Gemfile 中:

gem 'my_private_gem', git: 'https://github.com/my_github_account/my_private_gem.git'
 并配置捆绑器以通过以下方式使用您的 oauth 密钥:

export MY_OAUTH_KEY=abcd bundle config github.com $MY_OAUTH_KEY

repo范围内在这里

创建oauth密钥。

您现在可以在您的机器、CI 和 Heroku 上设置环境变量

MY_OAUTH_KEY

,以便它们都可以下载 gem。

在 Heroku 上,您将设置以下环境变量:

BUNDLE_GITHUB__COM: <your_oauth_key>
    

7
投票
我发现如果我可以从我的终端访问 github(

通过上传一个 ssh 密钥到 github),我可以简单地做:

gem 'my_gem', :git => '[email protected]:my_user/my_repo.git', :ref => 'revision_no'

不会用我的 git 用户名或密码污染我的代码


4
投票
    创建一个
  • ssh密钥
  • 确保
  • ~/.ssh
    目录下的那些键
  • ~/.ssh/id_rsa.pub
    的内容复制到
    https://github.com/MY_COMPANY/MY_GEM/settings/keys
  • 在你的
  • Gemfile
    中使用:
    gem 'mygem', github: 'MY_COMPANY/MY_GEM'
    
    
  • 奔跑
  • bundle install
    
    

2
投票
除了@seth-bro 的回答,我们还可以使用

bundle config

 使用捆绑器配置凭据,这样我们就不需要在 Gemfile 上公开 oAuth 令牌。 

语法:

bundle config github.com <your_github_oauth_token>



参考:

https://gist.github.com/sebboh/f1dfe4f096746c45f3e9ea06a09743a0 https://bundler.io/v1.16/bundle_config.html


0
投票
希望在 2015 年仍然有用,您可以使用

https://github.com/siassaj/heroku-buildpack-git-deploy-keys 和来自 github 的部署密钥。

这样你就可以避免将用户名传递给 Gemfile,这将在 Gemfile.lock 中以纯文本形式结束


0
投票
最安全的方法是按照以下方式配置 github 个人令牌。在按照他们的

官方文档创建您的 github 个人访问令牌后,请执行以下操作:

    在您的本地机器上,执行:

bundle config github.com YOUR_GITHUB_PERSONAL_TOKEN:x-oauth-basic


    在heroku中,设置
  1. BUNDLE_GITHUB__COM
     ENV变量:

BUNDLE_GITHUB__COM = YOUR_GITHUB_PERSONAL_TOKEN


您也可以通过以下方式从您的终端执行此操作:

heroku config:set BUNDLE_GITHUB__COM=YOUR_GITHUB_PERSONAL_TOKEN



-3
投票
我发现当使用 env 方法和 heroku labs:enable user_env_compile 时,Gemfile.lock 没有问题

© www.soinside.com 2019 - 2024. All rights reserved.