当前位置: 首页> 技术教程> 正文

Laravel Envoy教程

宁旺春土特产品

对于日常需要频繁处理服务器部署、代码同步、任务批量执行的PHP开发者来说,Laravel生态里的Envoy工具绝对是一款能大幅提升运维效率的轻量型利器,它用简洁的类Blade语法将繁琐的服务器操作封装成可复用的任务脚本,让原本需要手动登录多台服务器逐台敲命令的流程,变成了一行指令就能触发的自动化操作。和传统的Ansible、Fabric等运维自动化工具相比,Envoy的学习曲线更低,对于已经熟悉Laravel框架的开发者而言,几乎不需要额外掌握太多新的概念,就能快速上手并应用到实际项目中。

使用Laravel Envoy的第一步是完成环境准备和工具安装,Envoy本身不强制要求项目必须是Laravel应用,任何PHP项目甚至非PHP项目都可以借助它来实现服务器任务自动化。首先要确保本地开发环境已经安装了PHP 7.2以上版本和Composer,推荐通过Composer全局安装Envoy,这样可以在任意项目目录下直接调用envoy命令,执行`composer global require laravel/envoy`即可完成安装,安装完成后要确保全局Composer的vendor/bin目录被加入到系统的环境变量中,否则会出现命令找不到的错误。如果你不想全局安装,也可以在单个项目中作为开发依赖安装,执行`composer require --dev laravel/envoy`,使用时通过`vendor/bin/envoy`来调用即可。安装完成后可以运行`envoy --version`来验证是否安装成功,如果能输出版本号就说明安装已经完成。

安装完成后,我们需要在项目根目录下创建Envoy的配置文件,文件名为`Envoy.blade.php`,这个文件使用的是和Laravel视图类似的Blade语法,学习成本非常低。文件的开头通常需要先定义服务器列表,使用`@servers`指令来声明,你可以定义多台服务器,每台服务器对应一个别名,比如`@servers(['web' => 'deploy@192.168.1.100', 'db' => 'deploy@192.168.1.101'])`,如果需要指定端口或者SSH密钥,也可以直接在服务器地址里配置,比如`'web' => 'deploy@192.168.1.100 -p 2222 -i ~/.ssh/custom_key'`。除了服务器定义,你还可以用`@setup`指令来定义PHP变量,这些变量可以在后续的任务脚本中使用,比如定义项目路径、Git分支名等,比如`@setup $projectPath = '/var/www/html/my-project'; $branch = 'main'; @endsetup`。

定义好基础配置后,就可以开始编写具体的任务了,任务使用`@task`指令来定义,每个任务都有一个唯一的名称,后面跟上对应的服务器别名,任务体里就是要在服务器上执行的Shell命令。比如最常见的代码拉取任务,可以写成`@task('deploy', ['on' => 'web']) cd {{ $projectPath }} git pull origin {{ $branch }} composer install --no-dev --optimize-autoloader php artisan migrate --force php artisan config:cache php artisan route:cache php artisan view:cache @endtask`。这里的`{{ }}`语法就是Blade的变量输出,会自动把我们在`@setup`里定义的变量替换成对应的值。如果需要让任务在多台服务器上执行,只需要在`on`参数里传入服务器别名的数组即可,比如`['on' => ['web1', 'web2']]`,Envoy会默认按顺序执行,如果想要并行执行提升速度,可以加上`'parallel' => true`参数。

除了基础的任务定义,Envoy还提供了很多实用的高级特性,能帮我们处理更复杂的场景。比如故事(Story)功能,可以把多个任务组合成一个更大的流程,使用`@story`指令来定义,比如我们可以把代码拉取、依赖安装、缓存清理等步骤组合成一个完整的部署故事,`@story('full-deploy') deploy npm-build restart-queue @endstory`,这样执行的时候只需要指定故事名,就会按顺序执行里面的所有任务。还有钩子函数,Envoy提供了`@before`、`@after`、`@error`等钩子指令,可以在任务执行前后或者出错时执行特定的操作,比如我们可以在`@before`里输出任务开始的提示,在`@error`里发送错误通知到Slack或者企业微信,及时提醒运维人员部署出错了。

当我们编写好Envoy配置文件后,就可以通过命令行来执行任务了,基本的执行命令格式是`envoy run 任务名`,比如刚才定义的deploy任务,就可以执行`envoy run deploy`来触发。如果任务里的变量需要动态传入,不需要每次修改配置文件,可以通过命令行参数来传递,比如想要切换部署的分支,可以执行`envoy run deploy --branch=develop`,这些参数会自动作为变量注入到Envoy配置中。如果想要确认命令是否正确,又不想真的在服务器上执行,可以加上`--pretend`参数,Envoy会把将要执行的命令打印出来供你检查,非常适合调试新写的任务脚本。执行过程中如果想要中断任务,按Ctrl+C即可终止。

在实际使用过程中,还有一些常见的问题和优化技巧值得注意。首先是SSH认证的问题,为了避免每次执行任务都要输入服务器密码,建议配置SSH密钥登录,把本地的公钥添加到服务器的authorized_keys文件中,这样Envoy就能自动登录服务器执行命令了。其次是安全性问题,不要在Envoy配置文件中硬编码敏感信息,比如数据库密码、API密钥等,可以通过服务器上的环境变量来读取,或者使用Laravel的.env文件配合env函数来获取。对于复杂的部署流程

PC右下角
wap底部