muxx / dplr

基于GoSSHa的对象化部署器

v3.1.0 2023-01-11 09:04 UTC

This package is auto-updated.

Last update: 2024-09-11 13:40:39 UTC


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 将同时并行上传到所有服务器。第二个任务仅在组 app1.2.3.51.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=jobapp init --mode=app 将在组 jobfront 的服务器上并行执行。最后,命令 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