我在 Github 上有一个我想使用的私人仓库。我将我的应用程序部署到 Heroku。如何在我的 gemfile 上指定一个私有存储库作为源?我想仅仅说是不够的
gem "mygem", :git=>"my github address"
我发现部署从私人仓库中提取的 gem 的最佳方法是使用 GitHub 的 OAuth 访问。为此:
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).
为用户创建一个 GitHub OAuth 令牌。只需使用
curl
通过 GitHub API 执行此操作非常简单;有关更多信息,请参见OAuth API将令牌添加到 Gemfile 中的
git
url。例子:gem 'mygem', git: 'https://xxx123abc:[email protected]/user_or_team/mygem.git'
我目前在 Heroku 上使用这种方法,效果很好。美妙之处在于您不必暴露自己的个人信息,如果有什么东西被泄露,您可以随时撤销或重新生成令牌。
根据 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'
我没有测试这最后一部分。请提供反馈。
如果您想避免将凭据或 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>
通过上传一个 ssh 密钥到 github),我可以简单地做:
gem 'my_gem', :git => '[email protected]:my_user/my_repo.git', :ref => 'revision_no'
不会用我的 git 用户名或密码污染我的代码
https://github.com/siassaj/heroku-buildpack-git-deploy-keys 和来自 github 的部署密钥。
这样你就可以避免将用户名传递给 Gemfile,这将在 Gemfile.lock 中以纯文本形式结束
官方文档创建您的 github 个人访问令牌后,请执行以下操作:
bundle config github.com YOUR_GITHUB_PERSONAL_TOKEN:x-oauth-basic
BUNDLE_GITHUB__COM
ENV变量:
您也可以通过以下方式从您的终端执行此操作:
BUNDLE_GITHUB__COM = YOUR_GITHUB_PERSONAL_TOKEN
heroku config:set BUNDLE_GITHUB__COM=YOUR_GITHUB_PERSONAL_TOKEN