Envoy任务执行器及自动化部署项目

简介

Laravel Envoy 提供了简洁、轻量的语法用于定义在远程服务器上可执行的通用任务。通过 Blade 风格的语法,你可以很容易地设置任务从而完成部署、执行 Artisan 命令或其他更多工作。

官网:https://github.com/laravel/envoy

安装

直接通过 Composer 的 global 命令来安装 Envoy:

1
$ composer global require "laravel/envoy=~1.0"

务必将 ~/.composer/vendor/bin 目录加入到 PATH 环境变量中,这样才能在命令行中执行 envoy 命令时找到可执行文件。

1
2
3
$ vim ~/.bash_profile
$ export PATH="$PATH:~/.composer/vendor/bin"
$ source ~/.bash_profile

Envoy 基本使用

创建任务

Envoy通过执行 Envoy.blade.php文件来执行SSH任务。
在项目目录创建Envoy.blade.php,写入如下内容:

1
2
3
4
@servers(['web' => 'root@115.27.x.x'])
@task('foo', ['on' => 'web'])
ls -la
@endtask

如上所示,@servers数组定义了服务器地址,后续的任务声明中,你可以在 on 选项中直接引用。@task声明里定义了一个名称为foo的任务,用于执行ls -la。

执行任务

使用run命令来执行任务

1
$ envoy run foo

执行run命令后,控制台会要求输入服务器的密码。
输入密码后即可看到在服务器执行ls -la的结果。
sd

如有需要,你还可以通过命令行向 Envoy 文件传递参数:

1
$ envoy run deploy --path=/home/www
1
2
3
4
5
6
 @servers(['web' => '192.168.1.1'])

@task('deploy', ['on' => 'web'])
cd {{$path}}
ls
@endtask

可以在 @setup 指令中声明变量,并在 Envoy 文件中执行普通的 PHP 代码:

1
2
3
4
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup

还有多服务器并行执行:

1
2
3
@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])
@task('deploy', ['on' => ['web-1', 'web-2'],'parallel' => true])
@endtask

其他,@macro任务宏声明让你只用一条命令就能顺序执行一组任务, @after声明在任务执行完后处理,如发一封邮件通知等。

参考https://laravel.com/docs/5.1/envoy

使用envoy部署项目

在实际项目中我们常常使用git来作版本控制,开发完成后将代码提交到远程代码库。
在产品发布新版本时,可以在服务器直接git pull下来完成更新。我们将一系列任务通过envoy来执行,如:

1
2
3
4
5
6
7
8
9
10
@servers(['web' => '115.27.x.x'])
@task('deploy', ['on' => 'web'])
cd /home/www/laravel
git pull origin {{ $branch }}
php artisan migrate
@endtask

@after
echo "\r\n新版本发布完成!\r\n";
@endafter
1
$ envoy run deploy --branch=master

基于envoy的项目:
Envoyer : https://envoyer.io/
envoy-deploy : https://github.com/papertank/envoy-deploy