我在Github上有一个我想要使用的私有存储库。我将我的应用程序部署到Heroku。如何在gemfile中指定私有存储库作为源?我想仅仅说
是不够的gem "mygem", :git=>"my github address"
答案 0 :(得分:113)
我发现从私人仓库中部署宝石的最佳方法是使用GitHub's OAuth access。为此:
创建一个GitHub用户,可以访问相关的repo(最适合团队 - 如果您可以公开个人访问权限,则可以使用自己的帐户)。
为用户创建GitHub OAuth令牌。仅使用curl
在GitHub API上执行此操作非常简单;有关详情,请参阅the OAuth API。
将令牌添加到Gemfile中的git
网址。例如:
gem 'mygem', git: 'https://xxx123abc:x-oauth-basic@github.com/user_or_team/mygem.git'
我目前正在Heroku上使用这种方法,效果很好。美丽的是,您不必暴露自己的个人信息,并且如果某些内容受到损害,您可以随时撤销或重新生成令牌。
答案 1 :(得分:44)
根据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密钥和任何凭据放入代码中。对于本地开发/测试,您可以设置这些环境变量。或者,假设您的开发计算机已设置为对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'
我没有测试过最后一部分。请提供反馈。
答案 2 :(得分:2)
我发现如果我可以从终端访问github(by uploading an ssh key to github),我可以这样做:
gem 'my_gem', :git => 'git@github.com:my_user/my_repo.git', :ref => 'revision_no'
不使用我的git用户名或密码来污染我的代码
答案 3 :(得分:1)
~/.ssh
目录~/.ssh/id_rsa.pub
的内容复制到https://github.com/MY_COMPANY/MY_GEM/settings/keys Gemfile
使用中:gem 'mygem', github: 'MY_COMPANY/MY_GEM'
bundle install
答案 4 :(得分:1)
除了@ seth-bro的答案,我们还可以使用$user_id = Auth::user()->id;
$suggestions = User::whereDoesntHave('followers', function ($query) use ($user_id) {
$query->where('follower_id', $user_id);
})
->whereDoesntHave('blockings', function ($query) use ($user_id) {
$query->where('block_id', $user_id);
})
->whereDoesntHave('blockers', function ($query) use ($user_id) {
$query->where('leader_id', $user_id);
})
->get();
通过捆绑程序配置凭据,因此我们无需在Gemfile上公开oAuth令牌。
语法:bundle config
参考:https://gist.github.com/sebboh/f1dfe4f096746c45f3e9ea06a09743a0 https://bundler.io/v1.16/bundle_config.html
答案 5 :(得分:0)
希望在2015年仍然相关,您可以将https://github.com/siassaj/heroku-buildpack-git-deploy-keys与来自github的部署密钥一起使用。
这样你就可以避免输入用户名并传入Gemfile,Gemfile将以Gemfile.lock中的纯文本结尾
答案 6 :(得分:0)
这个问题值得一个更好的答案,因为如果您不想将凭据或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>
答案 7 :(得分:-3)
我发现在使用env方法和heroku实验室时:启用user_env_compile然后Gemfile.lock没有问题