yidas / deployer-php-cli
基于RSYNC的PHP-CLI脚本的代码部署工具
Requires
- php: >=5.4.0
README
支持流行框架的PHP编写的CI/CD部署工具
特性
-
通过项目/组向多个服务器部署
-
支持Yii2, Laravel, Codeigniter3 框架
-
支持Git, Composer, 测试和自定义任务的流水线
-
CI/CD自动化解决方案
帮助开发者将代码从本地实例部署到远程实例。
概要
演示
命令行
安装后只需在命令行中执行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通过sudoer
或root
安装是使用自动安装程序的最简单方式
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
分支的推送事件来触发。
要浏览结果日志报告的网页,请使用带有log
和token
参数的相同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与包
$ 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',
],
],
],