yidas/deployer-php-cli

基于RSYNC的PHP-CLI脚本的代码部署工具

1.13.0 2021-04-22 04:21 UTC

README

支持流行框架的PHP编写的CI/CD部署工具

Latest Stable Version License

特性

  • 通过项目/组多个服务器部署

  • 支持Yii2, Laravel, Codeigniter3 框架

  • 支持Git, Composer, 测试和自定义任务的流水线

  • CI/CD自动化解决方案

帮助开发者将代码从本地实例部署到远程实例。

概要

演示

Basic Flow

命令行

安装后只需在命令行中执行deployer即可将本地项目部署到远程服务器

$ deployer

或者,您也可以调用原始的bootstrap: $ ./deployer$ php ./deployer

交互式结果可能如下所示

$ deployer

Your available projects in configuration:
  [0] your.project.com
  [1] second.project.com
  [2] other.site.com

  Please select a project [number or project, Ctrl+C to quit]:0

Selected Project: your.project.com
Successful Excuted Task: Git
Successful Excuted Task: Composer
Successful Excuted Task: Composer
Successful Excuted Task: Test UnitTest
Successful Excuted Task: Commands before: Minify assets
Successful Excuted Task: Deploy to 127.0.0.11
Successful Excuted Task: Deploy to 127.0.0.12
Successful Excuted Task: Deploy
Successful Excuted Task: Commands after: Email notification

或者,您也可以通过非交互模式运行,达到相同的目的

$ deployer --project="your.project.com"

要求

此库需要以下内容

  • PHP(CLI) 5.4.0+
  • RSYNC

安装

Composer安装

使用Composer通过sudoerroot安装是使用自动安装程序的最简单方式

composer create-project --prefer-dist yidas/deployer-php-cli

Wget安装

您可以通过查看发布来选择具有版本的包,例如

$ wget https://github.com/yidas/deployer-php-cli/archive/master.tar.gz -O deployer-php-cli.tar.gz

下载后,解压缩包

$ tar -zxvf deployer-php-cli.tar.gz

此外,您可以通过以下命令重命名解压缩的文件夹:mkdir deployer-php-cli && tar -zxvf deployer-php-cli.tar.gz --strip-components 1 -C deployer-php-cli

Make命令

要为deployer创建一个命令,如果包文件夹是deployer-php-cli,则创建一个符号链接,如下所示

$ sudo chmod +x $(pwd -L)/deployer-php-cli/deployer
$ sudo ln -s $(pwd -L)/deployer-php-cli/deployer /usr/bin/deployer

启动

安装完成后,您就可以开始设置deployer的config.inc.php文件,并享受使用它了

$ deployer

升级

要升级,您可以重新安装deployer并将旧的config.inc.php复制到新文件中,例如

$ cp ./deployer-php-cli/config.inc.php ./
$ rm -r deployer-php-cli
$ composer create-project --prefer-dist yidas/deployer-php-cli
$ mv ./config.inc.php ./deployer-php-cli

配置

项目设置

您需要在config.inc.php文件中设置项目配置,如服务器、源和目标

<?php

return [
    // This project config processes deployment only for simple usage
    'default' => [
        'servers' => [
            '127.0.0.1',
        ],
        'source' => '/home/user/project',
        'destination' => '/var/www/html/prod/',
    ],
];

您可以通过查看config.inc.php文件作为示例。

配置选项

配置提供了许多功能的设置,您可以自定义并选择您需要的设置。

Git

要使用Git在部署任务中,您需要第一次在源目录中初始化或克隆Git。

$ git clone git@gitlab.com:username/project-to-deploy.git sourceDir

Composer

要使用Composer在部署任务中,请确保源目录中有Composer文件。

测试

要使用测试在部署任务中,请确保源目录中有测试配置。

测试

对于多个测试任务,使用数组声明每个测试选项

return [
    'default' => [
        'tests' => [
            [
                'name' => 'Test Task 1',
                // ...
            ],
            [
                'name' => 'Test Task 2',
                // ...
            ],
        ],
        // ...

Rsync

命令

命令提供了许多触发钩子,以自定义部署任务。

示例

  • project目录从/var/www/html/复制到位于/var/www/html/test/的目标下
'source' => '/var/www/html/project',
'destination' => '/var/www/html/test/',
  • 将所有文件(*)从/var/www/html/project/复制到/var/www/html/test/下的目标位置
'source' => '/var/www/html/project/',
'destination' => '/var/www/html/test/',

用法

Usage:
  deployer [options] [arguments]
  ./deployer [options] [arguments]

Options:
  -h, --help            Display this help message
      --version         Show the current version of the application
  -p, --project         Project key by configuration for deployment
      --config          Show the seleted project configuration
      --configuration
      --skip-git        Force to skip Git process
      --skip-composer   Force to skip Composer process
      --git-reset       Git reset to given commit with --hard option
  -v, --verbose         Increase the verbosity of messages

交互式项目选择

$ deployer

Your available projects in configuration:
  [0] default
  [1] your.project.com

  Please select a project [number or project, Ctrl+C to quit]:your.project.com

Selected Project: your.project.com
Successful Excuted Task: Git
Successful Excuted Task: Composer
Successful Excuted Task: Deploy to 127.0.0.11
Successful Excuted Task: Deploy

非交互式项目选择

$ deployer --project="your.project.com"

跳过流程

即使你在配置中启用了Git和Composer,你也可以强制跳过这些流程。

$ deployer --project="default" --skip-git --skip-composer

撤销并重置

如果你在最新版本发布后遇到问题,可以使用--git-reset选项将git重置到指定的提交。

$ deployer --project="default" --git-reset="79616d"

此选项与在源项目中执行git reset --hard 79616d相同。

实现

假设project1是你想要部署的开发项目。

开发者必须有他们自己的站点来开发,例如

# Dev host
/var/www/html/dev/nick/project1
/var/www/html/dev/eric/project1

通常,你会有一个与生产相同的文件的阶段project1

# Dev/Stage host
/var/www/html/project1

其目的是生产文件需要从阶段同步

# Production host
/var/www/html/project1

此工具将阶段项目视为,这意味着生产指的是目标,因此配置文件可能如下所示

return [
    'project1' => [
        ...
        'source' => '/var/www/html/project1',
        'destination' => '/var/www/html/',
        ...

运行此工具部署project1后,阶段项目的文件将执行类似git pull的过程,然后同步到生产。

权限处理

1. 本地和远程用户

你可以为运行Deployer创建本地用户,使用umask 002。即使你用root运行Deployer,它也会通过你设置的本地用户运行进程

return [
    'project1' => [
         'user' => [
            'local' => 'deployer',
            'remote' => 'deployer',
        ],
        ...
2. 应用文件权限

Deployer使用rsync将本地源项目部署到远程,不包括--no-perms,这意味着源文件的权限将保留在远程,但文件的所有者将由远程用户重新生成,包括root,使用--no-owner --no-group

在远程用户上,你可以在/etc/passwd中将用户的默认组ID设置为www-data,这样本地用户生成的664/775模式的文件就可以为远程www-data访问部署。

对于本地用户,可以在~/.bashrc或全局中设置umask 002。注意,权限需要应用于源文件,例如Git克隆的init文件。

CI/CD

Webhook

Deployer提供了webhook功能,可以通过任何webhook服务(如Gitlab)触发项目部署。

要使用webhook,你需要将webhook设置添加到config.inc.php中所需的项目中

return [
    'project' => [
        // ...
        'webhook' => [
            'enabled' => true,
            'provider' => 'gitlab',
            'project' => 'yidas/deployer-php-cli',
            'token' => 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
            'branch' => 'release',
            'log' => '/tmp/deployer-webhook-project.log'
        ],
    ],
];

PHP Web设置

Deployer需要一个用户来执行部署,而这个用户通常不是PHP网络用户。

对于PHP-FPM,你可以为webhook站点添加一个当前用户设置的新的PHP池套接字,例如/etc/php/fpm/pool.d/deployer.conf

[deployer]

user = deployer
group = www-data

listen = /run/php/php7.0-fpm_deployer.sock

然后将新的套接字给webhook服务器设置,例如Nginx示例/etc/nginx/site-enabled/webhook

server_name webhook.your.com;
root /srv/deployer/deployer-php-cli/webhook;

location ~ \.php$ {                                     
    include snippets/fastcgi-php.conf;                  
    fastcgi_param SCRIPT_FILENAME $request_filename;    
    fastcgi_pass unix:/run/php/php7.0-fpm_deployer.sock;
}                                                                                                               

在webhook成功后,Deployer将准备处理过程,同时响应状态和结果url以检查部署结果。

注意:Shell和PHP之间的PATH环境变量应设置为相同,以防止任何意外问题。

Gitlab

  • 私钥:gitlab

根据上述Nginx网站设置,webhook URL可以是https://webhook.your.com/gitlab。设置config.inc.php并设置密钥令牌后,你可以通过推送事件来运行!

注意:默认设置是监听release分支的推送事件来触发。

要浏览结果日志报告的网页,请使用带有logtoken参数的相同webhook URL进行访问。例如:https://webhook.your.com/gitlab?log={project-name}&token={project-token}

附加信息

Rsync无密码

你可以将本地用户的SSH公钥放置到目标服务器用户中进行授权。

.ssh/id_rsa.pub >> .ssh/authorized_keys

保存二进制编码文件

在执行脚本时,如果你收到类似于Exception: Zend Extension ./deployer does not exist的错误,你可能需要以二进制编码保存脚本文件,这可以通过使用vim来完成。

:set ff=unix

Yii2部署

对于yii2-app-advanced,你需要在config.inc.php中启用Composer并设置yii2 init命令。

'composer' => [                     
    'enabled' => true,          
],                                  
'commands' => [
    'before' => [
        'yii2 init prod' => './init --env=Production --overwrite=All',
    ],
],

通过Gulp压缩/精简

1. 安装NPM,对于Debian/Ubuntu

apt-get install npm

2. 使用NPM安装Gulp

npm install -g gulp

3. 创建Gulp项目

cd /srv/tools/minify-project
npm init
npm install gulp --save-dev
touch gulpfile.js

4. 设置Gulp与包

包:gulp-uglify

$ npm install gulp-uglify --save-dev
$ npm install pump --save-dev

gulpfile.js:

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var pump = require('pump');
var assetPath = '/srv/your.project.com/assets/js';

gulp.task('compress', function (callback) {
  pump([
        gulp.src(assetPath+'/**/*.js'),
        uglify(),
        gulp.dest(assetPath)
    ],
    callback
  );
});

5. 将 Gulp 进程设置到 Deployer 中

'source' => '/srv/project',
'commands' => [                                                    
    'before' => [                                                  
        'Minify inner JS' => [                                     
            'command' => 'cd /srv/tools/minify-project; gulp compress',                                                 
        ],                                                          
    ],                                                             
],