Envoy 自动部署脚本详解

图为ssh配置情况

以使用Laravel的Envoy1.4.1为例:

Envoy是基于SSH远程配置实现的,原文见:高级Envoy部署

现简单翻译如下:(根据Envoy v1.4.1有修改@macro 改为 @story)2018年5月23日 13:15:48


上一篇文章Envoy部署

Envoy部署进阶脚本

将展示如何更准确地从 GitHub 获取代码、使用 ACL 权限,怎样让我们的部署用户deployer安全地使用sudo、保留日志文件和更多边缘案例。

改进的脚本将处理环境文件、日志目录、允许部署用户重新加载 PHP-FPM 等等!以下是我们对 Envoy 配置所做的所有调整。

原脚本


@servers(['web' => 'deploy-ex']) <?php $repo = 'git@github.com:Servers-for-Hackers/deploy-ex.git'; $release_dir = '/var/www/releases'; $app_dir = '/var/www/app'; $release = 'release_' . date('Ymd_His'); ?> @story('deploy', ['on' => 'web']) fetch_repo run_composer update_permissions update_symlinks @endstory @task('fetch_repo') [ -d {{ $release_dir }} ] || mkdir {{ $release_dir }}; cd {{ $release_dir }}; git clone {{ $repo }} {{ $release }}; @endtask @task('run_composer') cd {{ $release_dir }}/{{ $release }}; composer install --prefer-dist; @endtask @task('update_permissions') cd {{ $release_dir }}; chgrp -R www-data {{ $release }}; chmod -R ug+rwx {{ $release }}; @endtask @task('update_symlinks') ln -nfs {{ $release_dir }}/{{ $release }} {{ $app_dir }}; chgrp -h www-data {{ $app_dir }}; @endtask

始终克隆主分支代码

更改

git clone {{ $repo }} {{ $release }};

为:

git clone -b master {{ $repo }} {{ $release }};

ACL跨组权限

在生产服务器中:

检查setfacl存在:

which setfacl

# If doesn't exist:
sudo apt-get install -y acl

然后使用它:

# Inspect current ACL's
getfacl /var/www

# Set current and default ACL's for /var/www
sudo setfacl -Rm g:www-data:rwx,d:g:www-data:rwx /var/www

现在,我们的部署用户deployer(它是组的一部分www-data)可以读取,写入和执行文件中的目录,/var/www,忽略当前组设置和权限。

visudo命令

允许组www-data运行 sudo service php5-fpm [reload|restart] 而不需要密码:

打开

# Run as super user
sudo visudo

加入:

%www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service php5-fpm restart,/usr/sbin/service php5-fpm reload

或者我们可以创建和编辑文件 /etc/sudoers.d/wwwdata 并添加上一行。

最后,部署用户在部署后重新加载 PHP-FPM。将以下内容添加到该 update_symlinks 部分的底部:

sudo service php5-fpm reload

处理.env文件:

我们不希望我们的.env文件在我们的代码库中。我们将把它放在我们的服务器上并且符号链接到它,所以它可用于我们应用程序的每个部署版本。

在生产服务器上:

# Create and edit the .env file as needed
vim /var/www/.env

然后在 Envoy 配置中,更新update_symlinks部分:

cd {{ $release_dir }}/{{ $release }};
ln -nfs ../../.env .env;
chgrp -h www-data .env;

处理 Composer 的环境

确保在 Laravel 中定义的安装后命令composer.json在正确的环境中运行。将以下内容添加到该run_composer部分中:

composer install --prefer-dist --no-scripts;
php artisan clear-compiled --env=production;
php artisan optimize --env=production; #已不再推荐使用

保留日志文件

storage/logs每次部署时,目录都会被覆盖。然而,我们希望我们的日志处于中心位置。我们可以使用符号链接来完成此操作。

在生产服务器上:

sudo mkdir /var/www/logs
sudo chown www-data:www-data /var/www/logs
然后在Envoy配置下update_symlinks,添加以下内容:

rm -r {{ $release_dir }}/{{ $release }}/storage/logs;
cd {{ $release_dir }}/{{ $release }}/storage;
ln -nfs ../../../logs logs;
chgrp -h www-data logs;

最终代码:


@servers(['web' => 'deploy-ex']) <?php $repo = 'git@github.com:Servers-for-Hackers/deploy-ex.git'; $release_dir = '/var/www/releases'; $app_dir = '/var/www/app'; $release = 'release_' . date('Ymd_His'); ?> @story('deploy', ['on' => 'web']) fetch_repo run_composer update_permissions update_symlinks @endstory @task('fetch_repo') [ -d {{ $release_dir }} ] || mkdir {{ $release_dir }}; cd {{ $release_dir }}; git clone -b master {{ $repo }} {{ $release }}; @endtask @task('run_composer') cd {{ $release_dir }}/{{ $release }}; composer install --prefer-dist --no-scripts; php artisan clear-compiled --env=production; php artisan optimize --env=production; @endtask @task('update_permissions') cd {{ $release_dir }}; chgrp -R www-data {{ $release }}; chmod -R ug+rwx {{ $release }}; @endtask @task('update_symlinks') ln -nfs {{ $release_dir }}/{{ $release }} {{ $app_dir }}; chgrp -h www-data {{ $app_dir }}; cd {{ $release_dir }}/{{ $release }}; ln -nfs ../../.env .env; chgrp -h www-data .env; rm -r {{ $release_dir }}/{{ $release }}/storage/logs; cd {{ $release_dir }}/{{ $release }}/storage; ln -nfs ../../../logs logs; chgrp -h www-data logs; sudo service php5-fpm reload; @endtask

延伸阅读:Laravel Envoy 详解

Author: thinkwei

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注