muxx / dplr
基于GoSSHa的对象化部署器
v3.1.0
2023-01-11 09:04 UTC
Requires
- php: >=7.3
- ext-json: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.15
- phpunit/phpunit: ^8.5
README
基于GoSSHa的对象化部署器,允许同时并行执行任务。简单快捷。
用法
使用示例
require 'vendor/autoload.php'; $dplr = new Dplr\Dplr('ssh-user', '/path/to/GoSSHa'); $dplr ->addServer('front1.site.ru', 'front') ->addServer('front2.site.ru', 'front') ->addServer('job1.site.ru', ['job', 'master']) ->addServer('job2.site.ru', 'job') ; const PATH = '/home/webmaster/product'; $dplr ->upload('/path/to/local_file1', '/path/to/remote_file1', 'front') ->command(PATH . '/app/console cache:clear') ; $dplr->run(function($step) { echo $step; }); if (!$dplr->isSuccessful()) { echo "Deploy completed with errors.\n"; foreach($dplr->getFailed() as $item) { echo "[ " . $item . " ]\n" . $item->getErrorOutput() . "\n"; } } else { echo "Deploy completed successfully.\n"; } $report = $dplr->getReport(); echo sprintf( "Tasks: %s total, %s successful, %s failed.\nTime of execution: %s\n", $report['total'], $report['successful'], $report['failed'], $report['timers']['execution'] );
安装
使用composer安装 dplr
"require": {
"muxx/dplr": "~1.0"
}
重要: dplr
需要 GoSSHa。
文档
初始化
使用密钥初始化ssh授权
$dplr = new Dplr\Dplr('ssh-user', '/path/to/GoSSHa'); // or $dplr = new Dplr\Dplr('ssh-user', '/path/to/GoSSHa', '/path/to/public.key');
注册服务器
通过添加到不同的组来添加多个服务器。将服务器添加到组中允许您在特定组的服务器上执行任务。
$dplr->addServer('1.2.3.4'); // Add server IP 1.2.3.4 without adding to group $dplr->addServer('1.2.3.5', 'app'); // Add server IP 1.2.3.5 with adding to group 'app' $dplr->addServer('1.2.3.6', ['app', 'cache']); // Add server IP 1.2.3.6 with adding to groups 'app' and 'cache' $dplr->addServer('1.2.3.7:2222', ['cache']); // Add server IP 1.2.3.7 and ssh port 2222 with adding to group 'cache'
注册任务
dplr
允许注册两种类型的任务
- 命令执行
- 将本地文件上传到远程服务器
$local = __DIR__; $path = '/home/webmaster/project'; $dplr ->upload("$local/share/parameters.yml", "$path/app/config/parameters.yml") ->command("cd $path && ./app/console cache:clear --env=prod --no-debug", 'app', 15) ;
在上面的例子中,文件 parameters.yml
将同时并行上传到所有服务器。第二个任务仅在组 app
(1.2.3.5
和 1.2.3.6
)的服务器上并行执行。第二个任务定义了执行超时(15秒)。
有时您必须并行执行不同的任务。在这种情况下,Dplr
有多线程模式。
$dplr ->command('app build') ->multi() ->command('app init --mode=job', 'job') ->command('app init --mode=app', 'front') ->end() ->command('app run', 'front') ;
在上面的例子中,命令 app build
将在所有服务器上执行。然后命令 app init --mode=job
和 app init --mode=app
将在组 job
和 front
的服务器上并行执行。最后,命令 app run
将在组 front
的服务器上执行。
运行
运行很简单
$dplr->run();
如果您想显示执行步骤,请定义回调
$dplr->run(function($step) { echo $step; }); /* Output -- CPY /home/webmaster/test/share/parameters.yml -> /home/webmaster/project/app/config/parameters.yml ..T. CMD cd /home/webmaster/project && ./app/console doctrine:migration:migrate --env=prod --no-debug .E */
任务行末的每个点都表示在特定服务器上执行一个动作(上传、命令)。标记 E
是执行失败的指示器。标记 J
是JSON解析错误的指示器。标记 T
是执行超时的指示器。
结果处理
您可以获取执行回顾或每个任务执行的详细信息。
显示报告
$report = $dplr->getReport(); echo sprintf( "Tasks: %s total, %s successful, %s failed.\nTime of execution: %s\n", $report['total'], $report['successful'], $report['failed'], $report['timers']['execution'] ); /* Output -- Tasks: 163 total, 163 successful, 0 failed. Time of execution: 08:25 */
每个任务的详细信息
foreach($dplr->getReports() as $report) { echo sprintf( "%s\n Successful: %s\n", (string) $report, $report->isSuccessful() ? 'true' : 'false' ); } /* Output -- CPY /home/webmaster/test/share/parameters.yml -> /home/webmaster/project/app/config/parameters.yml | 54.194.27.92 Successful: false CMD cd /home/webmaster/project && ./app/console doctrine:migration:migrate --env=prod --no-debug | 54.194.27.92 Successful: true */
返回的数组中的每个元素都是 Dplr\TaskReport
的实例,并具有以下方法
isSuccessful()
- 任务执行成功getHost()
- 执行任务的服务器getTask()
- 关于任务的信息(Dplr\Task
的实例)getOutput()
- 任务的输出getErrorOutput()
- 错误任务的输出
测试
执行以下命令以运行测试。
make sshkeygen docker-compose up -d make composer make check