Capistrano本地git存储库克隆到远程请求密码,尽管SSH密钥

时间:2012-06-26 12:28:15

标签: ruby-on-rails git capistrano

对卡皮斯特拉诺来说很新。

我有一个本地git存储库,我想发布到我的远程服务器。我在这里已经按照其他答案提出了这个配置:

require 'bundler/capistrano'

set :application, "app_name"
set :repository, '~/Dropbox/app/.git'
set :user, 'user_name'
set :deploy_to, 'ssh://remote_host/~/railsApps/app_name'
set :scm_verbose, true
set :deploy_via, :copy

default_run_options[:pty] = true

server "remote_server", :web, :app, :db, :primary => true

set :scm, :git
set :branch, "master"

ssh_options[:keys] = %w(~/.ssh/id_rsa)

after "deploy:restart", "deploy:cleanup"

这不再要求远程服务器的密码,但总是失败并出现以下错误:

The --deployment flag requires a Gemfile.lock. Please make sure you have checked your Gemfile.lock into version control before deploying.

我肯定在我的git repo中包含了Gemfile.lock文件。

如果我将Capistrano配置更改为从我推送的远程git文件夹(在同一服务器中)克隆,那么我不会收到错误,但每次尝试连接时都会询问我的密码。

请帮助。

注意,当从CLI用于常规SSH连接时,SSH密钥配对工作正常。

解决方案

感谢Tigraine,我能够解决它。希望这有助于其他人,这就是最终的诀窍:

Tigraine是正确的,因为路径是远程服务器的本地路径,但是在尝试使用本地路径时遇到错误,Capistrano一直在我的本地机器上搜索,并在无法找到这些路径时抛出错误。

我必须做的是将local_repository添加到配置中,然后一切正常。所以我改变的位是这些:

set :local_repository, '~/Dropbox/app_name/.git'
set :repository, '~/railsApps/app_name.git'
set :deploy_to, '~/railsApps/app_name'

local_repository路径是我的计算机的本地路径,repositorydeploy_to路径是远程服务器的本地路径。

2 个答案:

答案 0 :(得分:1)

首先:Capistrano始终在您正在部署的远程服务器上执行 命令。 这意味着您在set :deploy_to中使用的所有路径都是服务器上的本地路径。

在我的情况下,配置看起来像这样:

set :scm, 'git'
set :repository,  "<repo url>"
set :branch, 'master'
set :git_shallow_clone, 1
set :scm_verbose, true

set :deploy_to, '/var/www/app'
set :deploy_via, :remote_cache

这里的重要部分是:deploy_to,它是服务器上的本地路径而不是SSH路径这是您的配置错误的地方

如果你看一下capistrano然后运行的命令,这就变得更加重要。例如,它通常会执行bash cd /var/www/app && bundle instal ...之类的操作。 如果路径不是本地路径,则命令很可能会失败。

其次这也意味着Capistrano将从您的远程服务器部署到您的Git服务器,因此您必须确保远程服务器可以访问Git服务器。 因此ssh_options[:keys]指定用于连接到该remote_server的本地SSH密钥,而在服务器上将使用~/.ssh/id_rsa.pub的默认密钥。

您可以通过包含ssh_options[:forward_agent] = true来使用SSH代理转发来避免在服务器上设置SSH密钥。这只会将您的本地SSH代理套接字转发到服务器并使用它(很好,因为您的密钥永远不会离开您的机器)

有关SSH代理转发的更多信息,请访问here

答案 1 :(得分:0)

要检查:

在远程服务器中检查.ssh文件夹,并确保将ssh密钥(id_rsa.pub)添加到授权密钥中,且不附加空格。

从您运行cap脚本的本地文件夹中执行ssh-add。

检查远程的.ssh文件夹的权限,它应该是700,文件里面有600权限。

If I change the Capistrano configuration to clone from the remote git folder to which I push (which is in that same server) then I don't get an error but it asks for my password every time I try to connect.

现在从git克隆它,