nueip/deployer-php-cli

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

安装: 6

依赖: 0

建议者: 0

安全: 0

星星: 0

关注者: 1

分支: 9

公开问题: 0

类型:项目

0.2.0 2021-04-17 10:04 UTC

This package is auto-updated.

Last update: 2024-09-17 17:43:35 UTC


README

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

Latest Stable Version License

特性

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

  • 支持Yii2, Laravel, Codeigniter3框架

  • 支持Git, Composer,并为源项目提供任务

  • CI/CD解决方案

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

概要

演示

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

user@stage:~$ deployer

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

交互式结果可能是

user@stage:~$ 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: Deploy to 127.0.0.11
Successful Excuted Task: Deploy to 127.0.0.12
Successful Excuted Task: Deploy

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

user@stage:~$ deployer --project="your.project.com"

要求

此库需要以下内容

  • PHP(CLI) 5.4.0+
  • RSYNC

安装

Composer安装

使用sudoer或root通过自动安装器安装Composer是最简单的方法

user@stage:/srv$ composer create-project --prefer-dist nueip/deployer-php-cli

Wget安装

您可以在发布中查看版本,例如

user@stage:~$ wget https://github.com/nueip/deployer-php-cli/archive/master.tar.gz -O deployer-php-cli.tar.gz

下载后,解压缩包

user@stage:~$ 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,则创建符号如下命令

user@stage:~$ sudo chmod +x $(pwd -L)/deployer-php-cli/deployer
user@stage:~$ sudo ln -s $(pwd -L)/deployer-php-cli/deployer /usr/bin/deployer

启动

安装后,您可以为deployer开始设置config.inc.php,并享受使用

user@stage:~$ deployer

升级

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

user@stage:/srv/deployer$ cp ./deployer-php-cli/config.inc.php ./
user@stage:/srv/deployer$ rm -r deployer-php-cli
user@stage:/srv/deployer$ composer create-project --prefer-dist nueip/deployer-php-cli
user@stage:/srv/deployer$ 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初始化或克隆到源目录

user@stage:~$ 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

交互式项目选择

user@stage:~$ 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

非交互式项目选择

user@stage:~$ deployer --project="your.project.com"

跳过流程

即使您在配置中启用了它们,也可以强制跳过例如 Git 和 Composer 等流程。

user@stage:~$ deployer --project="default" --skip-git --skip-composer

撤销 & 重置

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

user@stage:~$ 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

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

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,您需要在 config.inc.php 中将 webhook 设置添加到您需要的项目中。

return [
    'project' => [
        // ...
        'webhook' => [
            'enabled' => true,
            'provider' => 'gitlab',
            'project' => 'nueip/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 以检查部署结果。

Gitlab

  • 私钥: gitlab

根据上述 Nginx 网站设置,webhook URL 可以是 https://webhook.your.com/gitlab。设置 config.inc.php 和设置 secret token 后,您可以推送一个事件来启动!

img\cicd-gitlab-webhook.png

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

附加功能

Rsync无密码

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

user@stage:~$ cat .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压缩/Uglify

1. 安装NPM,针对Debian/Ubuntu

user@stage:~$ apt-get install npm

2. 使用NPM安装Gulp

user@stage:~$ npm install -g gulp

3. 创建Gulp项目

user@stage:~$ cd /srv/tools/minify-project
user@stage:~$ npm init
user@stage:~$ npm install gulp --save-dev
user@stage:~$ touch gulpfile.js

4. 设置Gulp与包

包: gulp-uglify

user@stage:~$ npm install --global --no-optional gulp gulp-uglify-es

gulpfile.js:

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

gulp.task('compress', function () {
    return gulp.src(assetPath + '/**/*.js')
        .pipe(uglify())
        .pipe(gulp.dest(assetPath));
});

5. 将Gulp过程设置到Deployer中

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