1

至少这就是 capistrano 失败的地方。它在部署过程中一直到最后。这是输出。

* executing `deploy:create_symlink'
* executing "rm -f ~/xxx.xx.xx/test/current && ln -s ~/xxx.xx.xx/test/releases/20120525193307 ~/xxx.xx.xx/test/current"
servers: ["test.xxx.xx.xx"]
["test.xxx.xx.xx"] executing command
 ** [out :: test.xxx.xx.xx] rm: cannot remove `/var/www/vhosts/xxx.xx.xx/test/current': I command finished in 460ms
*** [deploy:create_symlink] rolling back
*** no previous release to rollback to, rollback of symlink skipped
* executing "rm -rf /var/www/vhosts/xxx.xx.xx/test/releases/20120525195909; true"
servers: ["test.xxx.xx.xx"]
[test.xxx.xx.xx] executing command
command finished in 524ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell 'default' -c 'rm -f /var/www/vhosts/xxx.xx.xx/test/current && ln -s /var/www/vhosts/xxx.xx.xx/test/releases/20120525195909 /var/www/vhosts/xxx.xx.xx/test/current'" on xxx.xx.xx

该应用程序正在使用 capistrano (2.12.0) capistrano-ext (1.2.1) 显然有更多的宝石只是试图放置看起来相关的东西,如果更多信息会有所帮助,请告诉我。

这是deploy.rb

require "rvm/capistrano"
require 'bundler/capistrano'
require 'capistrano/ext/multistage'

set :stages, %w(staging production)
set :default_stage, 'staging'

set :application, 'xxx'

# trying to not use sudo on the deployment
#set :use_sudo, false

#set :copy_exclude, [".git", "spec"]

set :repository,  '~/git/xxx.git'
set :local_repository, "~/rorwork/xxx/.git"
set :scm, :git
set :user, 'xxx'
set :group, 'xxxx'
ssh_options[:forward_agent] = true
set :branch, 'master'
set :deploy_via, :remote_cache
set :scm_command, "/usr/local/bin/git"
set :local_scm_command, :default
default_run_options[:pty] = true
set :normalize_asset_timestamps, false #for asset piple

set :dbuser, 'xxx'
set :dbpass, 'xxx'

# if you want to clean up old releases on each deploy uncomment this:
# after "deploy:restart", "deploy:cleanup"

# if you're still using the script/reaper helper you will need
# these http://github.com/rails/irs_process_scripts

# If you are using Passenger mod_rails uncomment this:
 namespace :deploy do
   task :start do ; end
   task :stop do ; end
   task :restart, :roles => :app, :except => { :no_release => true } do
     run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
   end
 end

和 staging.rb

set :domain, 'test.xxx.xx.xx'

role :web, domain                          # Your HTTP server, Apache/etc
role :app, domain                          # This may be the same as your `Web` server
role :db,  domain, :primary => true        # This is where Rails migrations will run

set :deploy_to, "/var/www/vhosts/xxx.xx.xx/test"
set :rails_env, 'staging'
set :rack_env, rails_env

set :dbname, "xxx_staging"

#set :bundle_without, [:test, :development, :production]

我在部署目录中手动创建“当前”、“共享”和“发布”文件夹并分配适当的用户:组。最初是在 dirs 上获得权限问题,但已经解决了。在这里有点不知所措,许多寻找解决方案的方法目前还没有得到任何结果。非常感谢这里的任何建议或经验!

在测试中,cap staging deploy我想我会同时尝试生产以及cap production deploy保释……关于一致性的一些聪明的事情。

4

2 回答 2

6

更新:找到了

删除“当前”目录并让 capistrano 创建指向最新版本的“当前”符号链接修复了它。

我会试着把它弄清楚一点。我实际上是在创建文件夹'current' 之类的,'mkdir current' 之类的。这只会妨碍 capistrano 创建符号链接。试试看,创建一个名为“bob”的文件夹,然后在同一目录中创建一个名为“bob”的符号链接并将其指向某个位置,它可能会将符号链接“bob”放入目录“bob”中。

当我删除“当前”“共享”等目录时,capistrano 可以创建“当前”和其他必要的符号链接。因此,具体删除“当前”目录允许 capistrano 创建仅指向“发布”目录下的最新部署的“当前”符号链接。

请注意以下错误,这也是问题所在。

** [out :: test.xxx.xx.xx] rm: cannot remove `/var/www/vhosts/xxx.xx.xx/test/current': I command finished in 460ms

它失败的原因。我创建了名为“当前”的文件夹。这就是问题。它不应该是一个目录,它应该是 capistrano 创建的符号链接。

通过创建这些文件夹,它破坏了部署。删除这些文件夹允许 capistrano 创建同名的符号链接。从此一帆风顺。

于 2012-05-30T20:56:05.963 回答
0

我刚刚找到了一个类似的问题。

这是我遇到的第一个错误:

cap aborted! Errno::ECONNREFUSED: Connection refused - connect(2) for "{my-ip-address}" port {my-ssh-port}

我也会收到类似的错误:

Tasks: TOP => git:create_release (See full trace by running task with --trace) The deploy has failed with an error: #<Errno::ECONNREFUSED: Connection refused - connect(2) for "my-ip-address" port {my-port}>

事实证明这是并发 SSH 会话的问题,因为我的服务器运行 Fail2Ban。为了解决这个问题,我只是做了以下事情:

编辑包含 SSH 配置的监狱

$ sudo nano /etc/fail2ban/jail.local

查找 [SSH] 并设置启用 = false 查找 [ssh-ddos] 并设置启用 = false

请记住在更改和打开 ssh 后重新启动 Fail2Ban(如果那是您使用的)

$ sudo service fail2ban reload
$ sudo /etc/init.d/ssh reload

值得注意的是,在部署中的不同步骤(任务)会拒绝连接。例如,在重新启动和快速一切之后,bundle exec cap production deploy:check一切看起来都很好。然后我尝试部署并收到相同的错误,但在执行不同任务期间。我还使用了 UFW,我禁用并重新启用它没有问题。UFW 不是上述问题的原因。

在我解决了这个问题后,Capistrano 将无法创建从当前目录到最新版本的符号链接。错误如下:

Tasks: TOP => deploy:symlink:release The deploy has failed with an error: #<SSHKit::Command::Failed: rm exit status: 1 rm stdout: Nothing written rm stderr: Nothing written > ** Invoke deploy:failed (first_time) ** Execute deploy:failed

在大量阅读、更改 sshkit 版本、降级 capistrano、消除 gems 等之后,我导航到我的文档根目录并列出了目录内容ls -la我注意到该current目录不在部署用户组中,我删除了当前文件夹(sudo rm -rf current)和所有内容工作正常。祝你好运。

于 2014-05-18T04:27:18.827 回答