介绍

Deployer 是一个基于 SSH 协议的无侵入 web 项目部署工具,因为它不需要你在目标 服务器 上装什么服务之类的东西即可使用,它只需要在你的开发机,或者你的笔记本,就是发起部署动作的一方安装即可。

它的原理就是通过 SSH 到你的机器去创建目录,移动文件,执行指定的动作来完成项目的部署。

Deployer 不但可以部署php项目,也可以部署其他语言醒目

deployer 的优势

  1. 真正解放双手,一条命令完成部署。
  2. 进行部署的过程中,项目仍然能够正常访问。部署成功完成后才切到新的版本。
  3. 能十分方便地进行回滚。
  4. 丰富任务钩子和预置任务可灵活的组合完成各种任务,比如执行前端依赖的安装、构建等。

使用 deployer 的前提条件

  1. 本地机器(也就是你执行 dep 命令时所在的机器)能够 SSH 连接到目标机器
  2. 指定用户有登录目标机器并调整一些设置的权限
  3. 目标主机有拉取项目仓库的权限

使用说明

1、安装

  1. curl -LO https://deployer.org/deployer.phar
  2. mv deployer.phar /usr/local/bin/dep
  3. chmod +x /usr/local/bin/dep

2、生成部署脚本代码

切换到要部署的项目目录下,执行以下命令

  1. dep init

此时会在改目录下生成 deploy.php文件

3、使用说明

未便于管理最好再创建文件deploy.config.php文件,提出公共配置,便于维护部署脚本。

实例:

以deploy部署go语言项目为例:

deploy.config.php

  1. <?php
  2. return [
  3. 'application' => 'miner-proxy', # 进程名称
  4. 'git' => 'git@bitbucket.org:miner/miner-proxy.git',
  5. 'branch' => 'master',
  6. 'deploy_path' => '/alidata/deploy/miner-proxy',
  7. 'servers' => [
  8. 'proxy0' => '192.134.45.45',
  9. 'proxy1' => '192.45.67.8',
  10. 'proxy2' => '193.168.45.67',
  11. ],
  12. 'rsync' => [
  13. 'rsync -avz /alidata/deploy/miner-proxy/current/build/bin/* public@{ip}:/alidata/service/miner-proxy/',
  14. 'rsync -avz /alidata/deploy/miner-proxy/current/build/supervisord.conf public@{ip}:/alidata/service/miner-proxy/'
  15. ]
  16. ];

deploy.php

  1. <?php
  2. namespace Deployer;
  3. require 'recipe/common.php';
  4. $config = require 'deploy.config.php';
  5. // 项目名
  6. set('application', $config['application']);
  7. // 项目仓库地址
  8. set('repository', $config['git']);
  9. // [Optional] Allocate tty for git clone. Default value is false.
  10. set('git_tty', true);
  11. // Shared files/dirs between deploys
  12. set('shared_files', []);
  13. set('shared_dirs', []);
  14. // Writable dirs by web server
  15. set('writable_dirs', []);
  16. set('keep_releases', 5);
  17. $stage = $_SERVER['argv'][2];
  18. if(!array_key_exists($stage, $config['servers'])){
  19. exit('stage ' . $stage . ' 不存在');
  20. }
  21. # 目标主机配置
  22. # 192.168.45.67 机器作为程序构建机器
  23. # 不要用root用户,新创建一个普通用户用作部署,在部署之前设置好改账号的各个目录权限
  24. host('192.168.45.67')
  25. ->user('test')
  26. ->set('branch', $config['branch']);
  27. ->stage($stage)
  28. ->set('deploy_path', $config['deploy_path']);
  29. // Tasks
  30. desc('Deploy super-miner-proxy project');
  31. task('deploy', [
  32. 'deploy:info',
  33. 'deploy:prepare',
  34. 'deploy:lock',
  35. 'deploy:release',
  36. 'deploy:update_code',
  37. 'deploy:shared',
  38. 'deploy:writable',
  39. 'deploy:clear_paths',
  40. 'deploy:symlink',
  41. 'deploy:unlock',
  42. 'cleanup',
  43. 'success'
  44. ]);
  45. # 自定义任务
  46. # 构建任务
  47. task('make', function () use ($config, $stage) {
  48. run('cd ' . $config['deploy_path'] . '/current && (export PATH=$PATH:/usr/local/go/bin;make)');
  49. });
  50. # 打包同步任务,最好先压缩再同步
  51. task('rsync', function () use ($config, $stage){
  52. foreach ($config['rsync'] as $val){
  53. $val = str_replace('{ip}', $config['servers'][$stage], $val);
  54. run($val);
  55. }
  56. });
  57. # 可执行程序同步完成后重启进程
  58. # 对于需要sudo操作的命令,可以在指定机器上设置该命令免密
  59. task('restart', function () use ($config, $stage) {
  60. run('ssh test@' . $config['servers'][$stage] . ' "sudo /usr/bin/supervisorctl restart ' . $config['application'] . '"');
  61. });
  62. # 如果部署失败,自动解除部署锁定状态,以免影响下次执行
  63. after('deploy:failed', 'deploy:unlock');
  64. # 部署
  65. after('deploy', 'make');
  66. # 回退
  67. after('rollback', 'make');
  68. # 同步
  69. after('make', 'rsync');
  70. # 重启
  71. after('rsync', 'restart');

注意

对于 deploy:update_code 使用Git下载新版本的代码。如果您使用的是Git 2.0版,并且git_cache config已打开,则此任务将使用先前发行版中的文件,因此仅下载更改的文件。否则重新clone 代码。

执行部署命令
  1. 部署:
  2. dep deploy {stage} -vvv
  3. 回退:
  4. dep rollback {stage} -vvv

当你第一次成功部署的时候, Deployer 会自动帮你在服务器上生成一下文件:
  1. releases 包含你部署项目的版本(默认保留 5 个版本)
  2. shared 包含你部署项目的共享文件或目录(如:Laravel Storage 目录、.env 文件等
  3. current 软连接到你当前发布的版本

官方文档地址

其他设置点可以通过以下网址查看

https://deployer.org/docs/getting-started

https://github.com/deployphp/deployer