Capistrano deploy.rb 无法访问阶段文件中定义的任务
Capistrano deploy.rb can't access task defined in stage file
我正在尝试为我的应用程序整理一个 capistrano 配方,它基本上在本地克隆 git 存储库,进行一些构建处理,然后 rsync 到远程服务器。
我有 2 个环境 - 开发和生产:
deploy.rb
deploy/dev.rb
deploy/prod.rb
我收到这个错误:
$ cap dev deploy
(Backtrace restricted to imported tasks)
cap aborted!
Don't know how to build task 'stop_server'
Tasks: TOP => dev
(See full trace by running task with --trace)
如果部署在 dev.rb
中的同一命名空间(部署)中,为什么部署不知道如何构建任务 stop_server
?
Capfile
# Load DSL and set up stages
require 'capistrano/setup'
# Include default deployment tasks
#require 'capistrano/deploy' # COMMENTED OUT B/C I'M TRYING TO BUILD LOCALLY INSTEAD OF DOING A GIT CLONE ON THE REMOTE SERVER
# Load custom tasks from `lib/capistrano/tasks' if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
deploy.rb
# config valid only for current version of Capistrano
lock '3.3.5'
set :repo_url, 'mygiturl'
# Default value for :pty is false
set :pty, true
set :deploy_dir, Dir.pwd
set :tmp_dir, "#{fetch(:deploy_dir)}/tmp"
set :output_dir, "#{fetch(:deploy_dir)}/output"
namespace :deploy do
desc 'Kick off the deploy'
task :init do
invoke 'deploy:create_tmp_dir'
end
... other tasks...
after :create_tmp_dir, :fetch_code
after :fetch_code, :build
after :build, :move_output
after :move_output, :stop_server
end
desc 'Deploy a new release'
task :deploy do
invoke 'deploy:init'
end
dev.rb
role :app, fetch(:application)
role :web, fetch(:application)
role :db, fetch(:application)
set :application, 'myapp'
set :env, 'dev'
set :ip, '123.456.78.901'
set :user, 'myuser'
set :deploy_to, '/var/www/myapp'
set :ssh_options, {
user: fetch(:user),
keys: %w(~/.ssh/id_rsa),
forward_agent: true,
auth_methods: %w(publickey),
port: 22
}
namespace :deploy do
desc "Stops the node forever server"
task :stop_server do
on roles(:app) do
puts '**** STOPPING THE NODE SERVER *****'
execute 'sudo /etc/init.d/myapp stop; true' # The "; true" ignores any error that may occur if there is no forever process running
end
end
desc "Restarts the forever server"
task :start_server do
on roles(:app) do
puts '**** STARTING THE NODE SERVER *****'
execute 'sudo /etc/init.d/myapp start'
end
end
end
问题是 Capistrano 通过先加载 deploy.rb
进行初始化;然后加载 dev.rb
.
Capistrano 解析这一行时:
after :move_output, :stop_server
它不知道 :stop_server
指的是什么(因为它还没有加载 dev.rb
)。因此,您看到的错误消息是:
Don't know how to build task 'stop_server'
一个简单的解决方法是在 deploy.rb
.
中声明一个空的 :stop_server
任务
namespace :deploy do
# "stub" the task, to be defined later in dev.rb
task :stop_server
after : move_output, :stop_server
end
然后当 Capistrano 稍后加载 dev.rb
时,:stop_server
的真正实现将被插入。
现在当你 运行 cap dev deploy
你应该得到想要的结果。
我正在尝试为我的应用程序整理一个 capistrano 配方,它基本上在本地克隆 git 存储库,进行一些构建处理,然后 rsync 到远程服务器。
我有 2 个环境 - 开发和生产:
deploy.rb
deploy/dev.rb
deploy/prod.rb
我收到这个错误:
$ cap dev deploy
(Backtrace restricted to imported tasks)
cap aborted!
Don't know how to build task 'stop_server'
Tasks: TOP => dev
(See full trace by running task with --trace)
如果部署在 dev.rb
中的同一命名空间(部署)中,为什么部署不知道如何构建任务 stop_server
?
Capfile
# Load DSL and set up stages
require 'capistrano/setup'
# Include default deployment tasks
#require 'capistrano/deploy' # COMMENTED OUT B/C I'M TRYING TO BUILD LOCALLY INSTEAD OF DOING A GIT CLONE ON THE REMOTE SERVER
# Load custom tasks from `lib/capistrano/tasks' if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
deploy.rb
# config valid only for current version of Capistrano
lock '3.3.5'
set :repo_url, 'mygiturl'
# Default value for :pty is false
set :pty, true
set :deploy_dir, Dir.pwd
set :tmp_dir, "#{fetch(:deploy_dir)}/tmp"
set :output_dir, "#{fetch(:deploy_dir)}/output"
namespace :deploy do
desc 'Kick off the deploy'
task :init do
invoke 'deploy:create_tmp_dir'
end
... other tasks...
after :create_tmp_dir, :fetch_code
after :fetch_code, :build
after :build, :move_output
after :move_output, :stop_server
end
desc 'Deploy a new release'
task :deploy do
invoke 'deploy:init'
end
dev.rb
role :app, fetch(:application)
role :web, fetch(:application)
role :db, fetch(:application)
set :application, 'myapp'
set :env, 'dev'
set :ip, '123.456.78.901'
set :user, 'myuser'
set :deploy_to, '/var/www/myapp'
set :ssh_options, {
user: fetch(:user),
keys: %w(~/.ssh/id_rsa),
forward_agent: true,
auth_methods: %w(publickey),
port: 22
}
namespace :deploy do
desc "Stops the node forever server"
task :stop_server do
on roles(:app) do
puts '**** STOPPING THE NODE SERVER *****'
execute 'sudo /etc/init.d/myapp stop; true' # The "; true" ignores any error that may occur if there is no forever process running
end
end
desc "Restarts the forever server"
task :start_server do
on roles(:app) do
puts '**** STARTING THE NODE SERVER *****'
execute 'sudo /etc/init.d/myapp start'
end
end
end
问题是 Capistrano 通过先加载 deploy.rb
进行初始化;然后加载 dev.rb
.
Capistrano 解析这一行时:
after :move_output, :stop_server
它不知道 :stop_server
指的是什么(因为它还没有加载 dev.rb
)。因此,您看到的错误消息是:
Don't know how to build task 'stop_server'
一个简单的解决方法是在 deploy.rb
.
:stop_server
任务
namespace :deploy do
# "stub" the task, to be defined later in dev.rb
task :stop_server
after : move_output, :stop_server
end
然后当 Capistrano 稍后加载 dev.rb
时,:stop_server
的真正实现将被插入。
现在当你 运行 cap dev deploy
你应该得到想要的结果。