public function run($tasks, $servers, $environments, $input, $output)
{
$output = new OutputWatcher($output);
$informer = new Informer($output);
$localhost = new Local();
$localEnv = new Environment();
foreach ($tasks as $task) {
$success = true;
$informer->startTask($task->getName());
if ($task->isOnce()) {
$task->run(new Context($localhost, $localEnv, $input, $output));
} else {
foreach ($servers as $serverName => $server) {
if ($task->isOnServer($serverName)) {
$env = isset($environments[$serverName]) ? $environments[$serverName] : ($environments[$serverName] = new Environment());
try {
$task->run(new Context($server, $env, $input, $output));
} catch (NonFatalException $exception) {
$success = false;
$informer->taskException($serverName, 'Deployer\\Exception\\NonFatalException', $exception->getMessage());
}
$informer->endOnServer($serverName);
}
}
}
if ($success) {
$informer->endTask();
} else {
$informer->taskError();
}
}
}
/** * {@inheritdoc} */ protected function execute(Input $input, Output $output) { $stage = $input->hasArgument('stage') ? $input->getArgument('stage') : null; $tasks = $this->deployer->getScriptManager()->getTasks($this->getName(), $stage); $servers = $this->deployer->getStageStrategy()->getServers($stage); $environments = iterator_to_array($this->deployer->environments); if (isset($this->executor)) { $executor = $this->executor; } else { if ($input->getOption('parallel')) { $executor = new ParallelExecutor($this->deployer->getConsole()->getUserDefinition()); } else { $executor = new SeriesExecutor(); } } try { $executor->run($tasks, $servers, $environments, $input, $output); } catch (\Exception $exception) { \Deployer\logger($exception->getMessage(), Logger::ERROR); // Check if we have tasks to execute on failure. if ($this->deployer['onFailure']->has($this->getName())) { $taskName = $this->deployer['onFailure']->get($this->getName()); $tasks = $this->deployer->getScriptManager()->getTasks($taskName, $stage); $executor->run($tasks, $servers, $environments, $input, $output); } throw $exception; } if (Deployer::hasDefault('terminate_message')) { $output->writeln(Deployer::getDefault('terminate_message')); } }