nueip/ deployer-php-cli
基于RSYNC的PHP-CLI脚本的代码部署工具
Requires
- php: >=5.4.0
This package is auto-updated.
Last update: 2024-09-17 17:43:35 UTC
README
支持流行框架的PHP CI/CD部署工具
特性
-
通过项目/组向多个服务器部署
-
支持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 后,您可以推送一个事件来启动!
注意:默认设置是监听
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', ], ], ],