deployer代码发布工具

特性

-- --
快速 采用了比如并发发布、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