原文参考地址: https://juejin.im/entry/5afd3dd051882542821c87d3
介绍
本文主要介绍 Deployer —— 一个具有模块化、代码回滚、并行任务等功能的 PHP 部署工具。
Deployer 用法非常简单易用,可以快速上手,且支持多个 PHP 框架。
官方文档
https://deployer.org/docs/getting-started.html
重点注意
# 我们需要将我们设置的用户加到 sudoers 中,否则可能没有执行重启php-fpm或重启其他服务的权限:
$ vim /etc/sudoers
# 在最后加入
dev ALL=(ALL) NOPASSWD: ALL # (将dev用户添加到sudoers)
# 保存并退出
安装
第一种:通过 Phar 存档,只需运行一下命令即可:
curl -LO https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep
第二种:通过 composer 安装:
# 安装
composer require deployer/deployer --dev
# 使用
php vendor/bin/dep
第三种:通过 Github 源代码安装:clone 最新的代码:
1. git clone https://github.com/deployphp/deployer.git
2. 在源代码目录下运行:
php ./build
注意:第三种方法会建立 deployer.phar 的 Phar 归档,所以建议使用第一种方法安装。
使用
安装完后,你可以通过 dep 使用 Deployer ,在你的项目目录下运行以下命令:
dep init
运行此命令后会出现下图的选项,可选择你所需的,当然本教程使用 Laravel ,so 选择 [1] Laravel。
dep init
Please select your project type [Common]:
[0 ] Common
[1 ] Laravel
[2 ] Symfony
[3 ] Yii
[4 ] Yii2 Basic App
[5 ] Yii2 Advanced App
[6 ] Zend Framework
[7 ] CakePHP
[8 ] CodeIgniter
[9 ] Drupal
[10] TYPO3
初始化后,会自动生成 deployer.php 文件。 deployer.php 文件包含了基本的部署配置和任务,且有明确的注释,你可以根据注释在适当的地方添加配置以及任务。
没错,按照 deployer.php 文件的注释,设置一下 repository、server config ,基本上都能正常运行。
当你第一次成功部署的时候, Deployer 会自动帮你在服务器上生成一下文件:
- releases 包含你部署项目的版本(默认保留 5 个版本)
- shared 包含你部署项目的共享文件或目录(如:Laravel 的 Storage 目录、.env 文件等 )
- current 软连接到你当前发布的版本
deployer.php
<?php
namespace Deployer;
require 'recipe/laravel.php';
// 项目名称
set('application', 'xxx');
// 项目git仓库
set('repository', 'git@github.com:tianyong90/xxx.git');
// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', true);
// 配置项目共享文件个共享目录
add('shared_files', [
'.env',
]);
add('shared_dirs', [
'storage',
]);
// 需要服务器有写权限的目录
add('writable_dirs', []);
// 保存最近五次部署,这样的话回滚最多也只能回滚到前 5 个版本
set('keep_releases', 5);
// 实践证明,这样能减少一些不必要的麻烦,如出现权限相关的问题,也可将此项设置为 true 后尝试
set('writable_use_sudo', false);
// 生产用的主机
host('172.16.1.1')
->stage('production')
->user('root')
->port(22)
->set('branch', 'master') // 最新的主分支部署到生产机
->set('deploy_path', '/data/wwwroot/xxx')
->identityFile('/home/vagrant/.ssh/id_rsa')
->forwardAgent(true)
->multiplexing(true)
->set('http_user', 'www') // 这个与 nginx 里的配置一致
->addSshOption('UserKnownHostsFile', '/dev/null')
->addSshOption('StrictHostKeyChecking', 'no');
// 测试用的主机
host('172.16.3.2')
->stage('debug')
->user('root')
->port(22)
->set('branch', 'develop') // 一般是把 develop 分支弄到测试机测试,没问题再合并
->set('deploy_path', '/data/wwwroot/xxx')
->identityFile('/home/vagrant/.ssh/id_rsa')
->forwardAgent(true)
->multiplexing(true)
->set('http_user', 'www')
->addSshOption('UserKnownHostsFile', '/dev/null')
->addSshOption('StrictHostKeyChecking', 'no');
// 自定义任务:重置 opcache 缓存
task('opcache_reset', function () {
run('{{bin/php}} -r \'opcache_reset();\'');
});
// 自定义任务:重启 php-fpm 服务
task('php-fpm:restart', function () {
run('systemctl restart php-fpm.service');
});
// 自定义任务:supervisor reload (supervisor是监听工具)
task('supervisor:reload', function () {
run('sudo supervisorctl reload');
});
// 自定义任务:部署成功了用 bearychat 发消息给大佬和自己(需要自己配置相关发送服务)
task('send_message', function () {
run('{{bin/php}} {{release_path}}/artisan deployed');
});
// 自定义任务:缓存路由,recipe/laravel.php 默认的流程里没有这个,所以加上,息看需要
after('artisan:config:cache', 'artisan:route:cache');
// 执行自定义任务,注意时间点是 current 已经成功链向新部署的目录之后
after('deploy:symlink', 'php-fpm:restart');
after('deploy:symlink', 'supervisor:reload');
// 部署成功后重置 opcache 缓存
after('deploy:symlink', 'opcache_reset');
// 部署成功后调用 laravel 命令行发送通知
after('success', 'send_message');
// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
注意:以上task根据自己的实际应用去选择配置
部署
dep debug # 部署到测试机
dep production # 部署到生产机
网友评论