PHP 代码部署 deployer

Deployer 是一个 PHP 自动化部署的工具。它可以做到多机部署、任务并行、版本回滚。

本篇博客是博主去掉整理的一篇技术文章。现在博客重建,于是整理发布出来以飨读者。

注:Deployer 5.x 是针对 PHP 7.x 的版本。如果,您使用的是 PHP 5.x,请使用 Deployer 4.x 版本。

本篇以 PHP 7.x & Deployer 5.x 进行示例讲解。

一、安装 Deployer

安装 Deployer 非常简单。代码如下:

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

默认是安装最新的版本。目前(2017-07-09)最新版本是 Deployer 5.1.3。所以,请确保您当前系统的 PHP 版本是 7.x。

测试是否安装成功。在终端输入:

dep --version

会得到如下结果:

Deployer 5.1.3

如果得不到上述结果,说明安装出错。

二、创建部署环境

我们已经安装了 Deployer。那么,我们现在来使用 Deployer 帮我们自动化部署代码。

假设,我们已经有一个项目托管到了 GitHub 这样的服务器。代码的Git地址如下:

git@github.com:winerQin/phpthread.git

此时,有一个重要的操作要做。就是所有的服务器要生成一个 SSH 公钥并把公钥添加到 GitHub 的配置中去。当我们用 Deployer 在服务器上执行代码 clone 的时候会把当前登录的用户所对应的 SSH KEY 拿来使用。

1) 在 Deployer 所在的服务器创建部署目录

创建一个目录来存放部署的配置脚本。

mkdir /data/deployer

2) 在deployer目录初始化部署环境

dep init

此时,会在当前命令所执行的目录下生成一个 deploy.php 脚本文件。

3) 编辑 deploy.php 脚本

在编辑之前我们来了解一下,基础的配置包含哪些东西。

首先,要部署代码,我们得知道服务器的基本信息(IP/端口/账号/密钥)。一般标准的项目代码都具备三个环境:开发、测试、正式。甚至还有公测等这样的环境。

其次,代码部署成功之后。我们会做一些初始化工作。比如:根据环境调用不同的配置文件,重启nginx服务器、设置目录权限等。

通过以上信息,我们现在需要知道服务器的IP、端口、账号、密钥。这里不用密码,是因为密钥更便于代码部署以及服务器管理。

打开 deploy.php 脚本,然后找到 host(......) 那一段的代码。然后,根据如下代码格式进行修改:

host('xxx.xxx.xxx.xxx')
    ->user('root')
    ->port(22)
    ->identityFile('~/.ssh/id_rsa')
    ->stage('production')
    ->set('deploy_path', '/data/wwwroot/www.test.com');
  1. xxx.xxx.xxx.xxx 是服务器的IP地址。
  2. user('root') 是连接服务器时使用哪个账号。
  3. port(22) 是连接服务器时使用哪个 SSH 端口。
  4. identifyFile('xxxx') 是连接服务器时 SSH 公钥路径。
  5. stage('production') 设置当前这个host标记。在部署的时候,你可以根据标记来对应哪些服务器是正式或测试。
  6. set('deploy_path') 是将代码部署到哪个目录下。

4) 启动部署工具

事实上,启动部署工作相当简单:

dep deploy produtcion

production 就是告诉 Deployer 我们要启动部署的服务器是 stage('production') 对应的服务器。

如果部署正常会输出如下结果:

✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
➤ Executing task deploy:update_code
Connection to xxx.xxx.xxx.xxx closed.
✔ Ok
✔ Executing task deploy:shared
✔ Executing task deploy:writable
✔ Executing task deploy:clear_paths
✔ Executing task deploy:symlink
✔ Executing task config_init
✔ Executing task php-fpm:restart
✔ Executing task deploy:unlock
✔ Executing task cleanup
✔ Executing task success
Successfully deployed!

我在部署的时候把 deploy.php 文件末尾的'deploy:vendors' 给注释掉了。因为,它会导致我部署的时候出错。其次,因为默认的配置里面启动 PHP-FPM 服务是与我服务器启动方式不一样的。于是,我把它更改了:

desc('Restart PHP-FPM service');
task('php-fpm:restart', function () {
    // The user must have rights for restart service
    // /etc/sudoers: username ALL=NOPASSWD:/bin/systemctl restart php-fpm.service
    run('/etc/init.d/php-fpm restart');
});

三、版本回滚

有时候,我们代码发布之后,发现一个惊天BUG正懵逼的时候。心里一定在想:我能不能把代码还原到之前的版本呀?

很开心地告诉你。我们的 Deployer 已经为我们提供了这样的功能。你只需要执行简单的一个命令就行轻松完成。

dep rollback

博主 2011 年创建了一个《PHP 初学者官方群》,目前群成员 500 人左右。群号:168159147。为了防止广告,设置为付费入群。欢迎大家加入讨论技术!

标签: 无

发表评论: