【问题标题】:Capistrano local git repository cloning to remote asks for password despite SSH keysCapistrano 本地 git 存储库克隆到远程请求密码,尽管 SSH 密钥
【发布时间】:2012-06-26 12:28:15
【问题描述】:

对 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.

我肯定将 Gemfile.lock 文件包含在我的 git 存储库中。

如果我将 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 路径在远程服务器上是本地的。

【问题讨论】:

    标签: ruby-on-rails git capistrano


    【解决方案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 &amp;&amp; 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

    【讨论】:

    • 我确实尝试了 SSH 转发,但没有任何区别。但请注意,它实际上似乎按照现在的配置工作,只是我收到 Gemfile.lock 文件不存在的错误。
    • 您是否尝试在本地运行 bundler 以查看 Gemfile.lock 是否是最新的?
    • 是的,同样的问题。如果我能弄清楚该怎么做,我愿意重写配置,以便它从服务器本身的 repo 文件夹中部署。哪个是首选?
    • 没关系。尝试使用 SSH 登录到您的服务器并运行捆绑安装,可能有一些与您的开发机器不同的 gem 依赖项? .. 如果 Gemfile.lock 真的存在,还要查看服务器 .. 也许它在错误的路径中?
    • 事实上,我认为从服务器上的 repo 部署是首选,因为它比上传压缩的 tmp 文件花费的时间要少得多。但是,如果我尝试对存储库使用本地路径,它会给我一个错误。如果我使用带有ssh:// 的路径,那么它会要求输入密码。
    【解决方案2】:

    要检查的东西:

    在远程服务器中检查 .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 克隆它,

    【讨论】:

    • ssh 密钥配对工作正常,我可以使用 CLI 中的标准 SSH 毫无问题地登录。抱歉 -1 我试图摆脱意外的 +1,我应该在我的原始帖子中解释 SSH 密钥配对工作正常的事实。
    • 只需检查是否有任何 config/deploy/staging.rb 或 production.rb 或 development.rb 文件覆盖部署脚本凭据。
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2019-05-10
    • 2016-11-11
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多