是时候换种更优雅的方式部署你的php代码了

让我们来回顾下上次你是怎么宣布你的代码的:

  1. 先把线上的代码用ftp备份下来

  2. 上传改善了的文件

  3. 测验一下效果是或不是健康

  4. 网址500了,赶紧用备份替换回去

  5. 交替错了/替换漏了

  6. 生机勃勃台服务器揭橥成功

  7. 报到每风流浪漫台实行叁遍发表操作

  8. 加班化解

  9. 首席推行官娘发飙

更加的现在的互连网行当,讲究快捷迭代,小步快跑。像bug修复大概小功用的改动大约天天都发版本,大效果的版本迭代周周也多数会有一回。相信广临汾行们像小编上边说的如此宣布本身的代码吧。或许恐怕学好一点,直接去服务器上施行一条看似git
pull的命令拖下宾馆中的代码,不过风姿浪漫旦您的代码运转在集群中呢?每台机器登陆贰遍施行叁回git
pull吗?假设发今世码极度亟需回滚呢?

比如你还在像本人上边说的这种艺术布署本身的代码的话,那么自身梦想你能耐性看完那篇文章,自此解脱代码陈设之痛。

 

实在绕了那般豆蔻梢头圈后天是想向咱们介绍一下用php写的代码公布工具:deployer。

deployer具有以下吸引人的本性:

– 急速     
采取了诸如并发发布、ssh通道复用、缓存可用处境下使用缓存等本事加快代码安顿

– 原子安插  
在新发表的本子内实践全数定义的操作,诸如下载依赖、设置文件访问权限等都不会一向影响线上,独有一切成功后,最终一步设置软链才会真的替换线上代码

– 飞速回滚   由于应用了原子布置,所以回滚也只是再也安装一下软链指向

– 并发安排   集群情状下,并发在具有机器上推行相符的布局流程

– 风度翩翩致性    
集群境况下,唯有具备机器都履行成功才算成功,风流浪漫台失利则全部受挫

– 内置多少个框架公布模板   例如Laravel、Yii、Symfony、CodeIgniter、Zend
Framework等

– 易扩大     相当的轻易能够依据本身的项目用Common模板编写公布流程

安装: 

composer global require deployer/deployer

设置到位后,切换成自个儿的类别目录,实行dep
init,根据本人项目利用的框架选用生成的布置模板:

➜  tb 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;

require 'recipe/common.php';

option('tag', null, InputOption::VALUE_OPTIONAL, '发布的tag');

// 全局配置文件   
set('ssh_type', 'native');    // 登录远程主机使用的方式,有三种:phpseclib(默认方式)、native、ext-ssh2
set('ssh_multiplexing', true);  // 是否开启ssh通道复用技术(开启可以降低服务器和本地负载,并提升速度)
set('keep_releases', 10); //    报错10个之前版本,设置为-1表示一直保存历史版本
set('repository', 'git@xxxxxxx.com:loc/loc-api.git');    // 代码仓库的地址,只支持git
set('branch', 'master');    // 发布代码时候默认使用的分支
set('shared_files', []);    // 共享文件列表   这里面列出的文件会被移动到项目根目录的shared目录下,并做软链
set('shared_dirs', []);     // 共享目录    同上
set('writable_mode', 'chmod');  // 采用哪种方式控制可写权限,有4中:chown、chgrp、chmod、acl(默认方式)
set('writable_chmod_mode', '0755'); // 当使用chmod控制可写权限的时候,赋予的可写权限值
set('writable_dirs', []);   // 可写目录   规定那些目录是需要可以被web server写入的
set('clear_path', []);  // 设置在代码发布的时候需要被删除的目录
set('http_user', 'nginx');  // web server的用户,一般不用设置,deployer会自动判断
set('release_name', function () {   // 设置发布版名称,这里优先使用tag作为名称,不传的话会使用日期+时间表示发布时间
    if (input()->hasOption('tag')) {
        return input()->getOption('tag');
    }
    return date('Ymd-H:i');
});

// 可以设置多个服务器,发布的时候根据设置会同步发往多个服务器
// 针对每个服务器可以单独设置参数,设置的参数会覆盖全局的参数
server('prod_1', 'xxx.xxx.xxx.xxx')
    ->user('root')
    ->password('xxxxx')
    ->set('deploy_path', '/var/www/tb')   // 代码部署目录,注意:你的webserver,比如nginx,设置的root目录应该是/var/www/tb/current,
                                          // 因为current是一个指向当前线上实际使用的版本的软链
    ->stage('prod');  // 标识该服务器类型,用于服务器分组

server('prod_2', 'xxx.xxx.xxx.xxx')
    ->user('root')
    ->password('xxxxx')
    ->set('deploy_path', '/var/www/tb')
    ->set('branch', 'master')   // 指定发往这个服务器的分支,会覆盖全局设置的branch参数
    ->set('extra_stuff', '...') // 随意指定其他什么参数
    ->stage('prod');

server('beta', 'xxx.xxx.xxx.xxx')
    ->user('root')
    ->password('xxxxx')
    ->set('deploy_path', '/var/www/test')
    ->set('branch', 'beta')   // 测试环境使用beta分支
    ->stage('beta');    // 放在beta分组


// 配置的任务
task('success', function () {
    Deployer::setDefault('terminate_message', '<info>发布成功!</info>');
})->once()->setPrivate();   // 增加once调用那么这个任务将会在本地执行,而非远端服务器,并且只执行一次

desc('重启php-fpm');    // 可以给任务增加一个描述,在执行dep list的时候将能看到这个描述
task('php-fpm:restart', function () {
    run('systemctl restart php-fpm.service');  // run函数定义在服务器执行的操作,通常是一个shell命令,可以有返回值,返回命令打印
});     // 聪明如你一定发现了,可以用run函数制作一些批量管理服务器的任务,比如批量重载所有的nginx配置文件、批量执行服务器上的脚本等

after('deploy:symlink', 'php-fpm:restart'); // 钩子函数,表示执行完设置软链任务之后执行php-fpm重启任务

desc('发布项目');
task('deploy', [    // 可以设置复合任务,第二个参数是这个复合任务包括的所有子任务,将会依次执行
    'deploy:prepare',   // 发布前准备,检查一些需要的目录是否存在,不存在将会自动创建
    'deploy:lock',  // 生成锁文件,避免同时在一台服务器上执行两个发布流程,造成状态混乱
    'deploy:release',   // 创建代码存放目录
    'deploy:update_code',   // 更新代码,通常是git,你也可以重写这个task,使用upload方法,采用sftp方式上传
    'deploy:shared',    // 处理共享文件或目录
    'deploy:writable',  // 设置目录可写权限
    'deploy:vendors',   // 根据composer配置,安装依赖
    'deploy:clear_paths',   // 根据设置的clear_path参数,执行删除操作
    'deploy:symlink',   // 设置符号连接到最新更新的代码,线上此时访问的就是本次发布的代码了
    'deploy:unlock',     // 删除锁文件,以便下次发布
    'cleanup',  // 根据keep_releases参数,清楚过老的版本,释放服务器磁盘空间
    'success'   // 执行成功任务,上面自己定义的,一般用来做提示
]);


after('deploy:failed', 'deploy:unlock');    // 如果发布失败,则删除锁文件,以便下次重试

 

地点正是四个相比完好的自动化安顿脚本配置了,是或不是认为到相当粗略?
因为超越百分之三十二配置工作在您执行dep init的时候就曾经帮你做了!

在接下去还亟需做的大器晚成件专门的学业正是把你要铺排的服务器的ssh-key参加到您的git帐号的认证Curry面,你也足以创制四个账户,只享有宾馆的git
pull和git
clone权限,保持最小权限原则。需求注意的是,加完key之后,第三遍在服务器上施行git
clone恐怕会供给让您输入yes,所以最稳当的章程是,去每台要配置的服务器上去施行壹遍git
clone,把库房代码拖蓬蓬勃勃份到其余目录。

做完上边的职业随后,全数的备选工作就是成功了。接下来就足以拓宽配置测量检验了。

第生机勃勃检查下安插有没难点:

 

dep config:dump beta    // 打印beta环境的配置
dep config:dump prod    // 打印生产环境的配置

打字与印刷出来的配置没有毛病的话,接着实施发表任务:

dep deploy beta // 发布当前beta分支到beta环境
dep --tag=v1.1 deploy prod // 发布v1.1这个tag的代码到生产环境,可以增加-p选项,并发发往所有服务器

澳门新葡新京,三遍得逞的布局应该会有肖似如下输出:

 

➜  tb git:(master) ✗ dep --tag=v1.1 deploy prod_1
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
✔ Executing task deploy:update_code
✔ Executing task deploy:shared
✔ Executing task deploy:writable
✔ Executing task deploy:vendors
✔ Executing task deploy:clear_paths
✔ Executing task deploy:symlink
✔ Executing task php-fpm:restart
✔ Executing task deploy:unlock
✔ Executing task cleanup
✔ Executing task success
发布成功!

查阅当前生产意况使用的哪位版本

dep current prod  //这里应该会输出v1.1 

翻看当前分娩条件使用的哪位版本:

 

dep current prod  //这里应该会输出v1.1 

风度翩翩经公布到线上前面之后发现成难点,供给回滚,只须要试行:

dep rollback prod   // 实际上只是修改软链指向,所以很快就能执行完成且基本不可能失败

重复用dep current prod应该就足以看看回滚到事前版本了

再举例说事前实行出了难题,被暂停,再一次施行大概会唤醒:Deploy
locked,那么只用实践:

 

dep deploy:unlock prod // 删除锁文件

比方线上磁盘空间吃紧了的话(日常不会),可以推行如下命令删除掉太早在此以前的版本:

dep cleanup

 

到了这里关于deployer全体你应有都调节了。固然第三回配置的确供给花点时间,恐怕半个钟头也大概半天。 
不过换到的却是接下去更温婉、快捷、安全、易回滚的发表流程,这么想转手是还是不是还会有一些小感动啊?

万风华正茂在安装使用进程中有何难题的话能够加群:632109190开展研讨。对php、java、运营感兴趣的同室都可以加进去,小编在这里等你们
:卡塔尔国

相关文章