跳转至

任务 (task)

使用task函数,定义个性化任务. 同时还可以使用desc函数设置任务说明:

desc('My task');
task('my_task', function () {
    run(...);
});

执行任务:

dep my_task

列出全部可用的命令:

dep list

仅在指定的主机或环境(stage)上运行任务:

dep deploy main

你可以通过--hosts选项(多个值时,用英文逗号分隔)指定主机, 以及通过--roles选项指定角色:

dep deploy --hosts domain.com
dep deploy --roles app

简单任务

如果你的任务仅仅包含了run函数调用, 或只有一个bash命令, 可以简化任务定义:

task('build', 'npm build');

默认情况下,所有的简单任务会先 cd 到 release_path目录下, 所以不重复做此步骤.

或者可以使用多行脚本:

task('build', '
    gulp build;
    webpack -p;
    echo "Build done";
');

任务分组

你可以合并任务到一个分组中:

task('deploy', [
    'deploy:prepare',
    'deploy:update_code',
    'deploy:vendors',
    'deploy:symlink',
    'cleanup'
]);

Before 与 after

你可以定义任务在某些任务开始前或完成后执行.

task('deploy:done', function () {
    write('Deploy done!');
});

after('deploy', 'deploy:done');

deploy任务调用之后, deploy:done 将会被执行.

过滤

您可以指定要在哪些主机(hosts)/环境(stage)/角色(roles)上运行任务。

按环境(stage)

按环境(stage)筛选主机:

desc('Run tests for application');
task('test', function () {
    ...
})->onStage('test');

按角色(roles)

按角色(roles)筛选主机:

desc('Migrate database');
task('migrate', function () {
    ...
})->onRoles('db');

还可以指定多个角色: onRoles('app', 'db', ...).

按主机(hosts)名

按主机(hosts)名筛选主机:

desc('Migrate database');
task('migrate', function () {
    ...
})->onHosts('db.domain.com');

你还可以指定多个主机名:onHosts('db.domain.com', ...).

本地任务

将任务标记为 local 以在本地运行,并且只运行一次,与主机计数无关。

task('build', function () {
    ...
})->local();

注意,在本地任务中调用 run 与调用runLocally具有相同的效果。

仅运行一次

任务只运行一次:

task('do', ...)->once();

将仅在第一台主机上运行.

重新配置

您可以重新配置任务,例如,按名称检索第三方recipes提供的任务:

task('notify')->onStage('production');

任务复写

有时,您可能希望某些任务的行为与常见的方法不同。可以简单到覆盖它:

task('deploy:update_code', function () {
    // Your custom update code
    upload(...);
});

使用输入选项

在定义任务之前,可以定义其他输入选项和参数:

use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

argument('stage', InputArgument::OPTIONAL, 'Run tasks only on this host or stage.');
option('tag', null, InputOption::VALUE_OPTIONAL, 'Tag to deploy.');

在任务内部使用这些:

task('foo:bar', function() {
    // 参数(arguments)
    $stage = null;
    if (input()->hasArgument('stage')) {
        $stage = input()->getArgument('stage');
    }

    // 选项(option)
    $tag = null;
    if (input()->hasOption('tag')) {
        $tag = input()->getOption('tag');
    }
});

任务并行执行

当部署到多个主机时,Deployer将在每个主机上运行一个任务:

task 2task 2task 2task 2task 1task 1task 1task 1Host 4Host 3Host 2Host 1

要加快部署, 请添加 --parallel-p 选项. 这将在每个主机上并行运行任务. 如果在主机上执行任务所需的时间比其他主机长,Deployer将等待所有主机完成任务.

task 2task 2task 2task 2task 1task 1task 1task 1Host 4Host 3Host 2Host 1

通过指定一个数字来限制并发任务的数量. 默认情况下, 最多可同时处理10个任务.

dep deploy --parallel --limit 2

task 2task 2task 2task 2task 1task 1task 1task 1Host 4Host 3Host 2Host 1

下一节: 主机.

Back to top