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

pic*_*rdo 59 github heroku ruby-on-rails-3

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

gem "mygem", :git=>"my github address" 
Run Code Online (Sandbox Code Playgroud)

Set*_*Bro 116

我发现部署从私人仓库中提取的宝石的最好方法是使用GitHub的OAuth访问权限.为此:

  1. 创建一个GitHub用户,可以访问有问题的仓库(最适合团队 - 如果您可以公开您的个人访问权限,则可以使用自己的帐户).

  2. 为用户创建GitHub OAuth令牌.使用GitHub API执行此操作非常简单curl; 有关更多信息,请参阅OAuth API.

  3. 将令牌添加到gitGemfile中的url.例:

gem 'mygem', git: 'https://xxx123abc:x-oauth-basic@github.com/user_or_team/mygem.git'
Run Code Online (Sandbox Code Playgroud)

我目前正在Heroku上使用这种方法,效果很好.美妙之处在于您不必暴露自己的个人信息,并且如果某些内容受到损害,您可以随时撤销或重新生成令牌.

  • 不确定为什么每个人都在提出答案,指示您将明文密码置于版本控制中,然后将其部署到第三方网站而不是第三方网站. (13认同)
  • 这对我有用.有关如何创建OAuth令牌的更多信息,请访问:https://help.github.com/articles/creating-an-oauth-token-for-command-line-use (3认同)
  • 您现在可以在GitHub站点上创建个人OAuth令牌:https://github.com/settings/tokens/new (3认同)

Wol*_*old 45

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

gem 'my_gem', :git => 'https://my_username:my_password@github.com/my_github_account/my_repo.git', :ref => 'revision_no'
Run Code Online (Sandbox Code Playgroud)

这对我们有用.由于我们不得不在Gemfile中输入密码,所以仍然有点不满意.我们通过添加一个新的github用户帐户并将该帐户添加为gem项目的协作者来解决这个问题.安全性仍然不是万无一失,但影响更为狭窄.

我读到的其他选项是设置自己的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'
Run Code Online (Sandbox Code Playgroud)

这是Heroku的标准,以避免将密码,API密钥和任何凭据放入代码中.对于本地开发/测试,您可以设置这些环境变量.或者,假设您的开发机器设置为对github进行SSH访问,则您不需要本地开发的凭据(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'
Run Code Online (Sandbox Code Playgroud)

我没有测试过最后一部分.请提供反馈.

  • 要使ENV方法起作用,您必须启用实验室插件:`heroku labs:enable user_env_compile`.不幸的是,匹配Gemfile.lock仍然存在问题. (5认同)
  • github为此推出了一项新功能:https://github.com/blog/1270-easier-builds-and-deployments-using-git-over-https-and-oauth (4认同)
  • 您也可以考虑使用Gemfury https://devcenter.heroku.com/articles/gemfury (3认同)
  • 用户env编译和在Gemfile中使用ENV有一个问题 - 你的密码/令牌仍然在Gemfile.lock任何出路? (3认同)
  • 即使使用ENV变量,我也会在Gemfile.lock中看到我的密码.危险的解决方案 (3认同)

coo*_*sse 6

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

请不要这样做:

gem 'my_private_gem', git: 'https://my_username:my_password@github.com/my_github_account/my_private_gem.git'
Run Code Online (Sandbox Code Playgroud)

或者

gem 'my_private_gem', git: 'https://xxx123abc:x-oauth-basic@github.com/my_github_account/my_private_gem.git'
Run Code Online (Sandbox Code Playgroud)

即使将它们作为环境变量移动,它们仍然会在您的 Gemfile.lock 中

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

gem 'my_private_gem', git: 'https://github.com/my_github_account/my_private_gem.git'
Run Code Online (Sandbox Code Playgroud)

并通过以下方式配置 bundler 以使用您的 oauth 密钥:

export MY_OAUTH_KEY=abcd
bundle config github.com $MY_OAUTH_KEY
Run Code Online (Sandbox Code Playgroud)

使用范围在此处创建 oauth 密钥repo

您现在可以MY_OAUTH_KEY在您的机器、CI 和 Heroku 上设置 env 变量,以便他们都可以下载 gem。

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

BUNDLE_GITHUB__COM: <your_oauth_key>
Run Code Online (Sandbox Code Playgroud)


gar*_*ine 5

我发现如果我可以从终端访问 github(通过将 ssh 密钥上传到 github),我可以简单地执行以下操作:

gem 'my_gem', :git => 'git@github.com:my_user/my_repo.git', :ref => 'revision_no'
Run Code Online (Sandbox Code Playgroud)

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