Added command to schedule tasks if not ran for a specified X days

This commit is contained in:
Vincent Vermeulen 2017-10-04 22:40:29 +02:00
parent a8019e20a8
commit 5a7d145c94
2 changed files with 100 additions and 0 deletions

View file

@ -0,0 +1,98 @@
<?php
namespace PHPCensor\Command;
use PHPCensor\Model\Build;
use PHPCensor\Model\Project;
use PHPCensor\Service\BuildService;
use PHPCensor\Store\BuildStore;
use PHPCensor\Store\ProjectStore;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Schedules build command - creates a build for a project if it hasn't run for a specified time
*
* @author Vincent Vermeulen <vincent@redant.nl>
*/
class ScheduleBuildCommand extends Command
{
/**
* @var ProjectStore
*/
protected $projectStore;
/**
* @var BuildStore
*/
protected $buildStore;
/**
* @var BuildService
*/
protected $buildService;
/**
* @param ProjectStore $projectStore
* @param BuildStore $buildStore
* @param BuildService $buildService
*/
public function __construct(ProjectStore $projectStore, BuildStore $buildStore, BuildService $buildService)
{
parent::__construct();
$this->projectStore = $projectStore;
$this->buildService = $buildService;
$this->buildStore = $buildStore;
}
/**
* {@inheritDoc}
*/
protected function configure()
{
$this
->setName('php-censor:schedule-build')
->setDescription('Schedules a build for active projects which have not been ran by X days')
->addArgument('days', InputArgument::REQUIRED, 'Since specified days');
}
/**
* {@inheritDoc}
*/
public function execute(InputInterface $input, OutputInterface $output)
{
$sinceDays = $input->getArgument('days');
$date = new \DateTime('now');
$difference = new \DateInterval("P{$sinceDays}D");
$date->sub($difference);
$projects = $this->projectStore->getAll()['items'];
/** @var Project $project */
foreach ($projects as $project) {
$latestBuild = $this->buildStore->getByProjectId($project->getId(), 1);
if ($latestBuild['count'] > 0) {
/** @var Build $build */
$build = $latestBuild['items'][0];
if ((int)$build->getStatus() === 1 || (int)$build->getStatus() === 0) {
// If it's running or just created, we don't want to reschedule already.
continue;
}
if ($date < $build->getFinished()) {
// If finished date is newer then the specified since days, we don't want to reschedule
continue;
}
}
try {
$this->buildService->createBuild($project, null);
$output->writeln("Build Created for {$project->getTitle()}");
} catch (\Exception $e) {
$output->writeln('<error>Failed</error>');
$output->writeln(sprintf('<error>%s</error>', $e->getMessage()));
}
}
}
}

View file

@ -13,6 +13,7 @@ use PHPCensor\Command\InstallCommand;
use PHPCensor\Command\RebuildCommand;
use PHPCensor\Command\RebuildQueueCommand;
use PHPCensor\Command\RunCommand;
use PHPCensor\Command\ScheduleBuildCommand;
use PHPCensor\Command\WorkerCommand;
use PHPCensor\Logging\Handler;
use PHPCensor\Service\BuildService;
@ -134,5 +135,6 @@ class Application extends BaseApplication
$this->add(new CreateBuildCommand($projectStore, new BuildService($buildStore)));
$this->add(new WorkerCommand($logger));
$this->add(new RebuildQueueCommand($logger));
$this->add(new ScheduleBuildCommand($projectStore, $buildStore, new BuildService($buildStore)));
}
}