特性
| -- | -- |
|---|---|
| 快速 | 采用了比如并发发布、ssh通道复用、缓存可用情况下使用缓存等技术加速代码部署 |
| 原子部署 | 在新发布的版本内执行所有定义的操作,诸如下载依赖、设置文件访问权限等都不会直接影响线上,只有全部成功后,最后一步设置软链才会真正替换线上代码 |
| 快速回滚 | 由于采用了原子部署,所以回滚也只是重新设置一下软链指向 |
| 并发部署 | 集群环境下,并发在所有机器上执行相同的部署流程 |
| 一致性 | 集群环境下,只有所有机器都执行成功才算成功,一台失败则全部失败 |
| 内置多个框架发布模板 | 比如Laravel、Yii、Symfony、CodeIgniter、Zend Framework等 |
| 易扩展 | 很容易可以依据自己的项目用Common模板编写发布流程 |
安装
composer global require deployer/deployer
生成部署模板
安装完成后,切换到自己的项目目录,执行dep init,按照自己项目使用的框架选择生成的部署模板:
➜ Anna dep init
Please select your project type (defaults to common):
[0] Common
[1] Laravel
[2] Symfony
[3] Yii
[4] Zend Framework
[5] CakePHP
[6] CodeIgniter
[7] Drupal
> 0
如果你的框架未使用上面列出的任何一个框架,则选择0,然后回车,就会生成通用的发布模板。
执行完这一步应该会在你的项目根目录生成一个deploy.php文件。
你所需要的做的一切就是编辑这个脚本,填写一些自己的服务器和项目配置,然后定制一些task。
下面我将用一个具体的配置文件来介绍deployer的使用,配置文件如下:
<?php
namespace Deployer;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
require 'recipe/common.php';
// Project name
set('application', 'pic.52inlove');
// Project repository
set('repository', '/web/pic.52inlove.git');
// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', true);
// Shared files/dirs between deploys
set('shared_files', []);
set('shared_dirs', []);
set('bin/symlink', 'ln -nfs');
set('composer_action', 'update');
// Writable dirs by web server
set('writable_dirs', []);
set('allow_anonymous_stats', false);
task('pic:change', function () {
run('chown -R www-data:www-data /web/www/pic.52inlove');
run('service php7.0-fpm restart');
writeln("=======================================");
});
option('v', null, InputOption::VALUE_OPTIONAL, 'version to deploy.');
task('pic:rollback', function(){
$v = input()->getOption('v');
run('cd /web/www/pic.52inlove && ln -nfs /web/www/pic.52inlove/releases/'. $v .' current');
});
// Hosts
host('pic.52inlove.com')
->user('root')
->set('writable_mode', 'chmod')// 采用哪种方式控制可写权限,有4中:chown、chgrp、chmod、acl(默认方式)
->set('writable_chmod_mode', '0755')// 当使用chmod控制可写权限的时候,赋予的可写权限值
->set('deploy_path', '/web/www/{{application}}');
// Tasks
desc('Deploy your project');
task('deploy', [
'deploy:info',
'deploy:prepare',
'deploy:lock',
'deploy:release',
'deploy:update_code',
'deploy:shared',
'deploy:writable',
'deploy:vendors',
'deploy:clear_paths',
'deploy:symlink',
'deploy:unlock',
'pic:change',
'cleanup',
'success',
]);
// [Optional] If deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
after('rollback', 'pic:change');
做完上面的事情之后,所有的准备工作就算完成了。接下来就可以进行部署测试了。
配置项查看
dep config:dump
这里面Parameter都是可配置的 ,bin/symlink 的值就是配置后改的 原来默认值是 ln -nfs --relative 总是会有错误所以改了不使用相对路径
| Parameter | Value |
|---|---|
| writable_mode | chmod |
| writable_chmod_mode | 0755 |
| deploy_path | /web/www/{{application}} |
| ssh_multiplexing | Yes |
| default_stage | |
| application | pic.52inlove |
| working_path | /web/www/pic.52inlove |
| env | [] |
| keep_releases | 5 |
| releases_list | |
| release_name | 6 |
| current_path | /web/www/pic.52inlove/releases/5 |
| release_path | /web/www/pic.52inlove/releases/5 |
| branch | master |
| bin/git | /usr/bin/git |
| git_cache | No |
| hostname | pic.52inlove.com |
| user | Anna |
| target | pic.52inlove.com |
| repository | /web/pic.52inlove.git |
| shared_dirs | [] |
| shared_files | [] |
| copy_dirs | [] |
| writable_dirs | [] |
| writable_use_sudo | No |
| writable_chmod_recursive | Yes |
| http_user | No |
| http_group | No |
| clear_paths | [] |
| clear_use_sudo | No |
| cleanup_use_sudo | No |
| use_relative_symlink | Yes |
| use_atomic_symlink | Yes |
| composer_action | update |
| composer_options | {{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader |
| bin/php | /usr/bin/php |
| bin/composer | {{bin/php}} /usr/local/bin/composer |
| bin/symlink | ln -nfs |
| git_tty | Yes |
| allow_anonymous_stats | No |
回滚
配置了bin/symlink 不使用默认值,就可以正确回滚了,具体不知道原因。
dep rollback