由于capistrano是用ruby语言开发的,所以使用capistrano前,需要在部署项目的源服务器上(部署的目标服务器不需要)安装ruby及capistrano。
安装rbenv
git clone https://github.com/rbenv/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc type rbenv git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
安装ruby
rbenv install 2.3.0 rbenv global 2.3.0
(若安装失败,可手动下载后,复制到/tmp/ruby-build.xxxx.xxx目录,然后再执行rbenv install 2.3.0即可下载地址:https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.bz2)
安装bundler
gem install bundler
安装capistrano
在项目的根目录中添加Gemfilesource 'https://rubygems.org' gem 'capistrano', '~> 2' gem 'cap_crontab'
初始化capistrano项目
前提是该项目未添加capistrano的配置文件,Capfile、config等。
在项目根目录执行如下命令,capistrano就会自动在项目下创建配置文件:
capify .
若使用capistrano3.x,则使用cap install命令
编辑生成的config/deploy.rb文件
以下为我们的deploy脚本,可参考ruby语法,由于需要适用于不同stage的部署,故提取了一些变量,可通过不同stage的配置文件进行设置。
由于capistrano自带从scm上获取代码,编译打包,然后部署的流程,而我们将代码的编译打包工作交给了jenkins,只适用capistrano的自动部署和回滚功能,故需要重写deploy:update_code任务。
require 'capistrano/ext/multistage' set :stages, %w{staging production} // 支持的stage,对应config/deploy/下的配置文件 set :default_stage, "staging" set :application, "p4j-service" // 仅仅是后面需要使用的一个变量 set :deploy_to, "/tmp/work/#{application}" // 部署到目标服务器的路径 set :keep_releases, 5 // 目标服务器上报存的版本数量,超过数量则会将旧的版本删除 set :use_sudo, false default_run_options[:pty] = true default_run_options[:shell] = "/bin/bash" after :deploy, "deploy:cleanup" namespace :deploy do desc "override update_code" task :update_code do release_path="#{deploy_to}/releases/"+Time.now.strftime("%Y%m%d%H%M%S") run "mkdir -p #{release_path} " Dir["./target/#{application}*.tar.gz"].each {|file| top.upload file, "#{release_path}/#{application}.tar.gz" } end desc "Start service" task :start do run "cd #{current_path} && if [ `ls | grep #{application} | grep -v tar.gz | wc -l` -lt 1 ] ; then tar -zxvf #{application}.tar.gz; fi && cd `ls | grep #{application} | grep -v tar.gz`/bin && chmod +x serviced.sh && ./serviced.sh start", pty: false end desc "Stop service" task :stop, :on_error => :continue do run "cd #{current_path}/#{application}/bin && ./serviced.sh stop" end desc "Restart service" task :restart do stop sleep 5 start end end
添加不同stage的配置文件
如果有其他的stage,则参考此文件添加即可,添加到项目根目录下的config/deploy/目录下,文件名为stage名称,扩展名为.rb。(如production.rb)
set :env, 'production' // stage set :user, 'dm' // 部署使用的用户 server "10.118.28.14", :app // 部署的目标服务器IP server "10.118.28.16", :app
至此,我们的项目已经可以使用capistrano自动部署了。
部署和回滚命令
在需要自动部署的项目的根目录(自动部署的源服务器上),使用如下命令进行自动部署和自动回滚
cap production deploy cap production deploy:rollback