以前一直使用Drupal来搭建网站,由于需要定制的代码量不是很大,所以每次修改都是直接用sftp传到服务器,再到Drupal后台清一下缓存。最近使用Symfony2进行开发,到了发布环节遇到了问题。Symfony代码的发布并不像其他CMS那么方便,因为更新代码后还需要assetic:dump,assets:install,cache:clear等一系列操作,因此每次更新往往需要登录到服务器去更新代码,运行清理cache的一系列命令。 capifony是针对Symfony开发的应用部署脚本,基于Capistrano。使用capifony只需要进行简单的配置,就可以很方便的将代码部署到不同的服务器上。
安装
gem install capifony
设置项目
在项目中生成初始化配置
cd path/to/your/project
capifony .
这会在你的项目根目录中生成一个Capfile文件,在config/(Symfony 1.x)或者app/config/(Symfony 2)目录中生成deploy.rb配置文件。
配置
首先,你需要选择你的发布方式,然后将你的服务器的连接信息填到config/deploy.rb (或者 app/config/deploy.rb)。
a) deployment → scm → production
第一种方式是通过git库来发布到产线,在这种情况下,产线服务器必须可以访问到git库并且可以运行pull;你还必须可以在发布服务器上通过ssh访问产线服务器。
# deploy.rb
set :application, "My App"
set :deploy_to, "/var/www/my-app.com"
set :domain, "my-app.com"
set :scm, :git
set :repository, "ssh-gitrepo-domain.com:/path/to/repo.git"
role :web, domain
role :app, domain, :primary => true
set :use_sudo, false
set :keep_releases, 3
在这种情况下,运行 cap deploy, capifony 会进行以下步骤:
- ssh 登录产线服务器 (my-app.com)
- 创建一个新的版本目录 (/var/www/my-app.com/releases/…)
- 从git版本库 clone 最新的项目版本 (ssh-gitrepo-domain.com)
- 复制代码。pull git 版本到新版本目录
- 运行发布钩子(cache:warmup, cc, 等。)
注意:默认情况下 capifony 不会清除旧版本,你必须设置 keep_releases 参数,并且在 deploy.rb 中添加任务来使其运行,如: after “deploy”, “deploy:cleanup” 。
如果你不想每次都 clone 整个版本库,你可以设置 :deploy_via 参数:
set :deploy_via, :remote_cache
这样,服务端会保存一个git版本库,而 Capifony 只会 fetch 上一次发布以来的修改。
b) deployment → production (通过复制)
第二种方式通过复制开发机到产线来发布。这种情况下,开发机(可能是你的本地电脑)需要有访问git版本库的权限,并且可以执行pull操作。
由于产线服务器也需要安装vendors,因此如果你的vendors使用远程的私有源,那么产线服务器也必须拥有这些源的pull权限,否则 composer 或者 bin/vendors 安装时会失败。如果你想在发布前在本地安装 vendors ,请参考下面的手册:Install vendors locally before deploy。
使用此方式时发布服务器也必须可以 ssh 访问产线服务器:
# deploy.rb
set :application, "My App"
set :deploy_to, "/var/www/my-app.com"
set :domain, "my-app.com"
set :scm, :git
set :repository, "file:///Users/deployer/sites/my-app"
set :deploy_via, :copy
role :web, domain
role :app, domain, :primary => true
set :use_sudo, false
set :keep_releases, 3
在这种情况下,运行 cap deploy, capifony 会进行以下步骤:
- ssh 登录产线服务器 (my-app.com)
- 创建一个新的版本目录 (/var/www/my-app.com/releases/…)
- 从本地git版本库 clone 最新的项目版本
- 复制代码。pull git 版本到产线服务器
- 运行发布钩子(cache:warmup, cc, 等。)
当然,每次发布都要复制整个项目,是昂贵而且缓慢的,幸好你可以通过 capistrano_rsync_with_remote_cache gem 来优化流程:
gem install capistrano_rsync_with_remote_cache
然后,在 deploy.rb 中修改发布流程:
set :deploy_via, :rsync_with_remote_cache
这样,rsync会在你的产线服务器上生成缓存,并且只提交两次发布简修改的文件。
4. 配置服务器
现在你可以开始发布了!cd 到你的本地项目目录,运行下面命令来使产线服务器设置好 Capistrano 要求的目录结构:
cap deploy:setup
( 你只需要运行这个命令一次 )
此命令会在你的服务器上创建类似的目录结构。详细的结构会根据你发布的是 symfony 1.x 还是 symfony 2 而有所不同:
`-- /var/www/my-app.com
|-- current → /var/www/my-app.com/releases/20100512131539
|-- releases
| `-- 20100512131539
| `-- 20100509150741
| `-- 20100509145325
`-- shared
|-- web
| `-- uploads
|-- log
`-- config
`-- databases.yml
release 目录下的是实际的发布代码,以时间戳来命名。以 symfony 1.x 为例,Capistrano 链接 app 中的 log 与 web/uploads 目录到一个共享目录,这样你发布一个新版本后这些内容不会被清除。
你可以使用以下命令来快速设置一个新服务器:
cap HOSTS=new.server.com deploy:setup
5. 发布
运行下面命令来发布:
cap deploy
根据配置的不同,你可能需要 ssh 登录到你的服务器来进行一些附加的配置,在第一次发布后共享文件(如 app/config/parameters.yml,如果你是使用下面的方式来发布 Symfony2 的话)。
Something went wrong???
cap deploy:rollback
Symfony2 发布
如果你需要发布 Symfony2 应用,那么此部分内容是为你而设的。本节介绍如何配置 capifony 来发布一个使用 bin/vendors 来管理 vendor 库,并且使用 app/config/parameters.yml 来进行服务器相关配置(如数据库连接信息)的应用。
首先,在 app/config/deploy.rb 添加以下内容,设置 parameters.yml 在不同的发布版本简时共享的:
set :shared_files, ["app/config/parameters.yml"]
然后,在不同发布简共享 vendor 目录,这样发布起来会快一点:
set :shared_children, [app_path + "/logs", web_path + "/uploads", "vendor"]
capifony 默认情况下依赖于 bin/verdors 来安装第三方库。然而现在默认的依赖管理工具时 Composer,你可以使用下面的配置来使用:
set :use_composer, true
如果你想升级第三方包,请配置以下参数:
set :update_vendors, true
这样它会运行 composer.phar(如果你使用Composer) 或者 bin/vendors。需要注意的时 bin/vendors 可以通过配置 :vendors_mode 参数来指定运行哪个操作(upgrade, install, 或者 reinstall)。
最后一步时配置你的 app/config/parameters.yml 文件。最好的方式是手动在服务器的共享目录中创建:
ssh your_deploy_server
mkdir -p /var/www/my-app.com/shared/app/config
vim /var/www/my-app.com/shared/app/config/parameters.yml
parameters.yml文件正确配置后,你应该可以测试你发布的应用。每次新的发布后,同一个 app/config/parameters.yml 会链接到你的应用,因此你只需要在初次发布时配置它。
有用的任务
如果你需要发布并且运行迁移命令,运行:
cap deploy:migrations
运行以下命令,在产线运行测试:
cap deploy:test_all
通过下面命令来运行任务/命令:
cap symfony
通过下面命令获取所有可用任务的信息:
cap -vT
Capifony 自动重启Apache
如果你的服务器安装了APC,你会发现每次 Deploy 完后都需要重启 Apache(php-fpm)来使新代码生效。 Capifony 提供了重启的任务,你只需要进行覆写:
# Custom(ised) tasks
namespace :deploy do
# Apache needs to be restarted to make sure that the APC cache is cleared.
# This overwrites the :restart task in the parent config which is empty.
desc "Restart Apache"
task :restart, :except => { :no_release => true }, :roles => :app do
run "sudo /etc/init.d/php5-fpm restart"
puts "--> PHP successfully restarted".green
end
end
更新:Symfony3 发布
现时(2016-05)Capifony只支持Symfony 1或者Symfony 2的发布,而由于Symfony 3的更改并不大,可以通过修改配置的方式让其兼容。
Symfony 3主要的更改在于原来位于app目录中的console,logs,cache等目录,现在变成了更加规范的结构,console在bin目录下,而其他几个可写目录则存放在独立的var目录
对 deploy.rb 配置文件进行以下修改
set :symfony_console, "bin/console"
set :cache_path, "var/cache"
set :log_path, "var/logs"
set :shared_children, ["var/logs", web_path + "/files", web_path + "/uploads", "vendor", "var/sessions", "var/cache"]
set :writable_dirs, ["var/cache", "var/logs", "var/sessions"]
以上具体的项根据项目的不同可能有所区别。