Added command to schedule tasks if not ran for a specified X days
This commit is contained in:
parent
a8019e20a8
commit
5a7d145c94
98
src/PHPCensor/Command/ScheduleBuildCommand.php
Normal file
98
src/PHPCensor/Command/ScheduleBuildCommand.php
Normal 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue