如何指定gem从私有github仓库拉取?

68

我在Github上有一个私有仓库,我想要使用它。我将我的应用程序部署到Heroku。如何在gemfile中指定私有仓库作为源?我想简单地说是这样不够的:


source 'https://github.com/username/repo.git'
gem "mygem", :git=>"my github address" 
9个回答

121

我发现从私有存储库中获取gem并部署的最佳方法是使用GitHub的OAuth访问。如何操作:

  1. 创建一个具有访问所需存储库权限的GitHub用户(对于团队来说最佳 - 如果您愿意暴露个人访问令牌,可以直接使用您自己的帐户)。

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

  3. 将令牌添加到Gemfile中的git url。例如:

gem 'mygem', git: 'https://xxx123abc:x-oauth-basic@github.com/user_or_team/mygem.git'

我目前在Heroku上使用这种方法,它非常有效。美妙之处在于您不必暴露自己的个人信息,并且如果有什么问题,您可以随时撤销或重新生成令牌。


3
这对我很有效。有关如何创建OAuth令牌的更多信息,请访问:https://help.github.com/articles/creating-an-oauth-token-for-command-line-use - John
27
不确定为什么所有人都在点赞那个建议你将密码明文放入版本控制,然后部署到第三方网站而不是这个网站的答案。 - Brett Bender
3
您现在可以在GitHub网站上创建个人OAuth令牌:https://github.com/settings/tokens/new。 - Andy Waite
1
这应该是采纳的答案,@picardo。你能改一下吗? - Per Lundberg
@picardo,你能否更新问题,使用这个答案而不是你选择的那个? - danielsmith1789
请花些时间创建一个新的 GitHub 帐户,该帐户仅具有对 Gem 存储库的读取访问权限,并将令牌范围限定为存储库。不要使用自己帐户的访问令牌,它们将拥有您的所有访问权限。 - JuJoDi

41

根据Heroku技术支持的建议,最简单的方法是将用户名和密码放入URL中,就像基本的HTTP认证一样,例如:

gem 'my_gem', :git => 'https://my_username:my_password@github.com/my_github_account/my_repo.git', :ref => 'revision_no'

这对我们有用。但是我们不太满意,因为我们必须将密码放在Gemfile中。我们通过添加一个新的GitHub用户帐户并将该帐户添加为宝石项目的协作者来解决了这个问题。仍然不是绝对安全,但影响范围更小。

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

更新5/16/2012: 规避将密码放入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'

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


5
为了让 ENV 方法起作用,您需要启用实验室插件:heroku labs:enable user_env_compile。不幸的是,仍然存在与 Gemfile.lock 匹配的问题。 - Peter Wagenet
3
你可以考虑使用Gemfury https://devcenter.heroku.com/articles/gemfury。 - Schneems
4
GitHub推出了一个新功能:https://github.com/blog/1270-easier-builds-and-deployments-using-git-over-https-and-oauth。 - kanzure
3
用户环境编译(user-env-compile)和在Gemfile中使用ENV存在问题 - 你的密码/令牌仍会出现在Gemfile.lock中。有什么解决方法吗? - pcv
3
即便使用了环境变量,我仍能在Gemfile.lock文件中看到我的密码。这是一个危险的解决方案。 - James Lin
显示剩余5条评论

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

请不要这样做:
gem 'my_private_gem', git: 'https://my_username:my_password@github.com/my_github_account/my_private_gem.git'

或者
gem 'my_private_gem', git: 'https://xxx123abc:x-oauth-basic@github.com/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'

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

export MY_OAUTH_KEY=abcd
bundle config github.com $MY_OAUTH_KEY

在此创建OAuth密钥,并将其作用范围设置为repo

现在,您可以在本地机器上,CI以及Heroku上设置环境变量MY_OAUTH_KEY,以便它们都可以下载gem包。

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

BUNDLE_GITHUB__COM: <your_oauth_key>

我不理解一些事情。我需要在哪个文件中配置bundler? 我需要在Heroku上设置BUNDLE_GITHUB__COM和MY_OAUTH_KEY两个吗? - Wes Guirra
在 Heroku 上,您可以使用您的 OAuth 密钥设置环境变量 BUNDLE_GITHUB__COM。如果需要,您也可以在本地设置此环境变量。 - coorasse
这是最好的稳定解决方案,应该被接受为答案。 - Asnad Atta
这是最安全的答案。export MY_OAUTH_KEY=abcd是否存在任何安全问题,执行bundle config后是否应该取消设置$MY_OAUTH_KEY - Obromios
对于任何试图使用GitHub的新细粒度个人访问令牌的人,我通过添加内容只读存储库权限使其工作,并且您需要像这里所描述的那样在令牌前加上oauth2: - Jeff Manian

8

我发现如果我在终端中可以访问Github(通过上传ssh密钥到Github),那么我只需要执行以下命令:

gem 'my_gem', :git => 'git@github.com:my_user/my_repo.git', :ref => 'revision_no'

不用在我的代码中暴露我的git用户名和密码


@KhoaNguyen它不能直接使用,因为Heroku服务器会尝试直接访问git仓库。我认为可能可以将你的Heroku服务器的SSH密钥添加到你的github仓库中,从而允许此访问 - 但我不确定是否可能。 - gardenofwine
@gardenofwine,如果你在Heroku上只有一两个服务器,这种方法可能有效。但是在更大的规模上,你不能将所有服务器的密钥添加到Github上。 - Virtual

4

2

1

最安全的方法是按照以下方式配置github个人令牌。在按照他们的官方文档创建github个人访问令牌后,执行以下操作:

  1. 在本地机器上执行:

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

  1. 在heroku中设置BUNDLE_GITHUB__COM环境变量:

BUNDLE_GITHUB__COM = YOUR_GITHUB_PERSONAL_TOKEN

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

heroku config:set BUNDLE_GITHUB__COM=YOUR_GITHUB_PERSONAL_TOKEN


0

-3
我发现当使用环境方法和Heroku labs:enable user_env_compile时,Gemfile.lock没有任何问题。

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