# Deployer 部署工具

# 介绍

Deployer 是一个使用 PHP 开发的轻量级项目部署工具,Deployer 不需要在目标服务器上安装任何客户端即可使用,它的原理是通过 SSH 登录到目标服务器,然后执行脚本中定义好的 Shell 命令。

同时 Deployer 内置了一批常见项目、框架的部署脚本,例如 Laravel、WordPress 等等,当我们需要部署相关项目时,只需要调整一些参数就可以直接使用。

官网文档

# 安装

安装部署器有三种方法:

  1. 下载 phar 存档
  2. Composer 安装
  3. 局部 Composer 安装

# 下载 phar 存档

要将部署器安装为 phar 存档,运行以下命令:

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

如果您需要另一个版本的 Deployer,您可以在下载页面上找到它。稍后,要升级 Deployer,运行命令:

dep self-update

要升级到下一个主要版本(如果可用),请使用该选项:--upgrade (-u)

dep self-update --upgrade

# composer 安装

要将 Deployer 源版本与 composer 一起安装,运行命令:

composer require deployer/deployer --dev

您也可以在全局范围内安装它:

composer global require deployer/deployer

如果之前已经安装过 deployer,请再次执行这个命令以更新到最新版。

更多信息: https://getcomposer.org/doc/03-cli.md#global

然后要使用 Deployer,请运行以下命令:

php vendor/bin/dep

如果您使用这两种方法安装了Deployer,则运行命令将更喜欢 composer 安装的版本。dep

如果您有依赖冲突,您可以使用"分布 Composer 安装"

# 分布 Composer 安装

要用 Composer 安装 Deployer 分布 版本,运行命令:

composer require deployer/dist --dev

然后要使用 Deployer,请运行以下命令:

php vendor/bin/dep

# Laradock 安装

  1. 打开 .env 文件

  2. 搜索 WORKSPACE_INSTALL_DEPLOYER

  3. 将其设置为true

    WORKSPACE_INSTALL_DEPLOYER=true
    
  4. 重新构建这个容器docker-compose build workspace

# 打包 phar

如果您想从源代码构建部署程序,则从 GitHub 克隆项目:

git clone https://github.com/deployphp/deployer.git

然后在项目目录中运行以下命令:

php bin/build

这将构建 phar 存档。deployer.phar

# 自动完成

部署器附带了 bash/zsh/fish 的自动完成脚本,因此您不需要记住所有任务和选项。要安装,运行以下命令:

dep autocomplete

并按照说明操作。

# 安装完成

dep

image-20210426151139721

可以看到有正常的输出,说明安装成功。

# 配置脚本

# 创建部署脚本

现在我们需要创建一个目录用于放置部署脚本:

$ mkdir -p ~/code/deploy
$ cd ~/code/deploy-laravel
$ dep init

dep init 命令用来创建一个部署脚本,会询问我们项目类型,我们是 Laravel 项目所以输入 1 然后回车;接下来询问 Repository 也就是我们代码仓库的地址,大家填入自己的 github 仓库地址即可:

注意:这里要填 Https 形式的 Github 仓库地址,因为 SSH 格式的地址需要服务器有 Deploy Key 才可以正常访问。

file

接下来会询问是否允许 Deployer 收集匿名的部署数据以改善项目,大家根据自己的情况填入 yes 或者 no

file

可以看到 Deployer 在当前目录下创建了一个名为 deploy.php 的文件。

我们现在来看看这个文件里有哪些东西:

<?php
namespace Deployer;

// 引入官方的 Laravel 部署脚本
require 'recipe/laravel.php';

// 设置一个名为 application 的环境变量,值为 my_project
set('application', 'my_project');

// 设置一个名为 repository,值为初始化脚本时输入的 github 仓库地址
set('repository', 'https://github.com/leo108/laravel-shop-advanced-57.git');

// 设置环境变量,不需要关心
set('git_tty', true);

// shared_files / shared_dirs 这两个环境变量是数组格式,add 函数可以往数组里添加值
add('shared_files', []);
add('shared_dirs', []);

// Deployer 会把这个变量下的目录加上写权限
add('writable_dirs', []);

// 添加一台服务器,服务器 IP/域名 是 project.com
host('project.com')
    // 设置一个这台服务器独享的环境变量,名为 deploy_path,值为 ~/my_project
    // Deployer 会把花括号包裹起来的字符串替换成对应的环境变量
    ->set('deploy_path', '~/{{application}}');

// 定义一个名为 build 的任务
task('build', function () {
    // 这个任务的内容是执行 cd ~/my_project && build 命令
    run('cd {{release_path}} && build');
});

// 定义一个后置钩子,当 deploy:failed 任务被执行之后,Deployer 会执行 deploy:unlock 任务
after('deploy:failed', 'deploy:unlock');

// 定义一个前置钩子,在执行 deploy:symlink 任务之前先执行 artisan:migrate
before('deploy:symlink', 'artisan:migrate');

可以看到在这个部署文件里并没有太多涉及到部署逻辑的地方,这是因为大部分的部署逻辑都在 recipe/laravel.php 这个 Deployer 自带的脚本中写好了,我们来看看这个文件的内容,这个文件在本地的路径是 ~/.composer/vendor/deployer/deployer/recipe/laravel.php,我们也可以在 github 上直接查看 github.com/deployphp/deployer/blob...

这里面大部分内容都比较浅显易懂,这里就不一一解释了。

我们查看一下这个文件的最底部,可以看到定义了一个名为 deploy 任务,这个是 Deployer 中的默认任务,当我们使用 Deployer 部署而又没有指定具体的任务时,Deployer 就会默认执行 deploy 任务。

这个 deploy 任务的内容是一个数组,这代表 deploy 是一个任务组,Deployer 会按照数组中的顺序依次执行任务。

# 开始使用

# 部署

阅读有关配置部署的有关内容。

现在,让我们部署我们的应用程序:

dep deploy

若要在输出中包含额外的详细信息,可以使用以下选项增加详细程度:--verbose

  • -v对于正常输出,
  • -vv要进行更详细的输出,
  • -vvv用于调试。

部署器将在主机上创建以下目录:

  • releases包含发布 dirs,
  • shared包含共享文件和 dirs,
  • current符号链接到当前版本
  • 配置主机以从 current 中为公共目录服务。

默认情况下,部署程序保留最后 5 个版本,但您可以通过修改关联的参数来增加此数量:

set('keep_releases', 10);

# 回滚代码

如果部署过程中出现错误或新版本出现问题,只需运行以下命令即可回滚到以前的工作版本:

dep rollback