*/ 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') ->addArgument('days', InputArgument::REQUIRED, 'Since specified days') ->setDescription('Schedules a build for active projects which have not been ran by X 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(); $projects = $projects['items']; /** @var Project $project */ foreach ($projects as $project) { $latestBuild = $this->buildStore->getLatestBuilds($project->getId(), 1); if ($latestBuild) { /** @var Build $build */ $build = $latestBuild[0]; $status = (integer)$build->getStatus(); if ($status === Build::STATUS_RUNNING || $status === Build::STATUS_PENDING) { // If it's running or just created, we don't want to reschedule already. continue; } if ($date < $build->getFinishDate()) { // If finished date is newer then the specified since days, we don't want to reschedule continue; } } try { $this->buildService->createBuild($project, null, '', null, null, null, null, Build::SOURCE_PERIODICAL); $output->writeln("Build Created for {$project->getTitle()}"); } catch (\Exception $e) { $output->writeln('Failed'); $output->writeln(sprintf('%s', $e->getMessage())); } } } }