0

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 存储库中包含了 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路径在我的机器上是本地的,repository并且deploy_to路径在远程服务器上是本地的。

4

2 回答 2

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上将使用默认密钥 from。

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

可以在此处找到有关 SSH 代理转发的更多信息

于 2012-06-26T13:24:34.630 回答
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 克隆它,

于 2012-06-26T13:50:12.833 回答