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

Posted

技术标签:

【中文标题】如何指定要从私有 github 存储库中提取的 gem?【英文标题】:How can I specify a gem to pull from a private github repository? 【发布时间】:2011-06-17 23:04:36 【问题描述】:

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

gem "mygem", :git=>"my github address" 

【问题讨论】:

【参考方案1】:

我发现部署从私人仓库中提取的 gem 的最佳方法是使用 GitHub's OAuth access。这样做:

    创建一个有权访问相关存储库的 GitHub 用户(最适合团队 - 如果您可以公开您的个人访问令牌,您可以简单地使用您自己的帐户)。

    为用户创建一个 GitHub OAuth 令牌。只需使用curl 就可以通过 GitHub API 执行此操作非常简单;更多信息请参见the OAuth API。

    将令牌添加到 Gemfile 中的 git url。示例:

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

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

【讨论】:

这对我有用。有关如何创建 OAuth 令牌的更多信息,请访问:help.github.com/articles/… 不知道为什么每个人都赞成指示您将明文密码放入版本控制的答案,然后将其部署到第三方网站而不是这个网站。 您现在可以在 GitHub 站点上创建个人 OAuth 令牌:github.com/settings/tokens/new 这应该是接受的答案@picardo。能改吗? @picardo 您能否更新问题以使用此答案而不是您选择的答案?【参考方案2】:

根据 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'

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

我读到的其他选项是set up your own gem server 或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_credentialsgithub.com/my_github_account.git",
  :ref => 'rev'

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

【讨论】:

要使用 ENV 方法,您必须启用实验室插件:heroku labs:enable user_env_compile。不幸的是,匹配 Gemfile.lock 仍然存在问题。 您也可以考虑使用 Gemfury devcenter.heroku.com/articles/gemfury github 为此推出了一项新功能:github.com/blog/… user-env-compile 和在 Gemfile 中使用 ENV 存在问题 - 您的密码/令牌仍会在 Gemfile.lock 中。有什么办法吗? 即使使用 ENV 变量,我也会在 Gemfile.lock 中看到我的密码。危险的解决方案【参考方案3】:

如果您想避免将凭据或 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'

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

export MY_OAUTH_KEY=abcd
bundle config github.com $MY_OAUTH_KEY

使用repo 范围创建oauth 密钥here。

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

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

BUNDLE_GITHUB__COM: <your_oauth_key>

【讨论】:

有些东西我没听懂。我需要在哪个文件中配置捆绑器?我需要在 Heroku 上同时设置 BUNDLE_GITHUB__COM 和 MY_OAUTH_KEY? 在 Heroku 上,您可以使用您的 oauth 密钥设置环境变量 BUNDLE_GITHUB__COM。如果需要,您也可以在本地设置此环境变量 这是最好的解决方案它应该被接受的答案【参考方案4】:

我发现如果我可以从我的终端访问 github (by uploading an ssh key to github),我可以这样做:

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

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

【讨论】:

@KhoaNguyen 它不会开箱即用,因为 Heroku 服务器会尝试直接访问 git 存储库。我认为可以将您的 Heroku 服务器的 ssh 密钥添加到您的 github 存储库,从而允许这种访问 - 但我不确定它是否可能 @gardenofwine,如果您在 Heroku 上有一个或两个服务器,这种方法可能会起作用。在更大范围内,您无法将所有服务器的密钥添加到 Github。【参考方案5】: 创建ssh keys 确保~/.ssh目录下的那些键 将~/.ssh/id_rsa.pub的内容复制到https://github.com/MY_COMPANY/MY_GEM/settings/keys 在您的Gemfile 中使用:gem 'mygem', github: 'MY_COMPANY/MY_GEM' 运行bundle install

【讨论】:

【参考方案6】:

除了@seth-bro 的回答,我们还可以使用bundle config 来配置使用bundler 的凭证,这样我们就不需要在Gemfile 上暴露oAuth 令牌。

语法:bundle config github.com &lt;your_github_oauth_token&gt;

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

【讨论】:

【参考方案7】:

希望在 2015 年仍然有用,您可以将 https://github.com/siassaj/heroku-buildpack-git-deploy-keys 与来自 github 的部署密钥一起使用。

这样你就可以避免把用户名和传递给 Gemfile,它最终会在 Gemfile.lock 中以纯文本的形式出现

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于如何指定要从私有 github 存储库中提取的 gem?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GitHub REST API 通过我的个人访问令牌访问组织拥有的私有存储库中的文件数据?

ElasticBeanstalk - 无法从私有 Docker Hub 存储库中提取 docker 映像

使用 docker-compose 从私有仓库拉取镜像

在 github 存储库中托管私有 maven 工件

Jupyter Notebook ipynb 中的图像未显示在 GitHub 私有存储库中,但相同的代码适用于公共存储库

pip:从远程 git 存储库中提取更新