From 0fc2a6667826e675ab76a09aea4727e3d17ca41b Mon Sep 17 00:00:00 2001 From: Dmitry Khomutov Date: Sun, 25 Feb 2018 18:14:54 +0700 Subject: [PATCH] Now builds artifacts remove when remove build and project. Issue #107. --- src/PHPCensor/Logging/BuildDBLogHandler.php | 2 +- src/PHPCensor/Model/Build.php | 84 ++++++++++++++++----- src/PHPCensor/Plugin/Pdepend.php | 55 ++++++++++---- src/PHPCensor/Plugin/PhpUnit.php | 42 ++++++++--- src/PHPCensor/Service/BuildService.php | 1 + src/PHPCensor/Service/ProjectService.php | 12 +++ 6 files changed, 150 insertions(+), 46 deletions(-) diff --git a/src/PHPCensor/Logging/BuildDBLogHandler.php b/src/PHPCensor/Logging/BuildDBLogHandler.php index 5cd34892..942b358e 100644 --- a/src/PHPCensor/Logging/BuildDBLogHandler.php +++ b/src/PHPCensor/Logging/BuildDBLogHandler.php @@ -70,7 +70,7 @@ class BuildDBLogHandler extends AbstractProcessingHandler protected function write(array $record) { $message = (string)$record['message']; - $message = str_replace($this->build->currentBuildPath, './', $message); + $message = str_replace($this->build->getBuildPath(), './', $message); $this->logValue .= $message . PHP_EOL; diff --git a/src/PHPCensor/Model/Build.php b/src/PHPCensor/Model/Build.php index 2a40d684..9ebeb453 100644 --- a/src/PHPCensor/Model/Build.php +++ b/src/PHPCensor/Model/Build.php @@ -4,6 +4,7 @@ namespace PHPCensor\Model; use PHPCensor\Builder; use PHPCensor\Store\BuildErrorStore; +use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Yaml\Parser as YamlParser; use PHPCensor\Model; use b8\Store\Factory; @@ -44,6 +45,16 @@ class Build extends Model */ protected $newErrorsCount = null; + /** + * @var string + */ + protected $buildDirectory; + + /** + * @var string + */ + protected $buildBranchDirectory; + /** * @var array */ @@ -683,8 +694,6 @@ class Build extends Model return Factory::getStore('BuildMeta', 'PHPCensor')->getByBuildId($this->getId()); } - public $currentBuildPath; - /** * Get link to commit from another source (i.e. Github) */ @@ -885,8 +894,42 @@ class Build extends Model } /** - * Return the path to run this build into. - * + * @return string|null + */ + public function getBuildDirectory() + { + if (!$this->getId()) { + return null; + } + + if (empty($this->buildDirectory)) { + $this->buildDirectory = $this->getProjectId() . '/' . $this->getId() . '_' . substr( + md5(($this->getId() . '_' . $this->getCreateDate()->format('Y-m-d H:i:s')) + ), 0, 8); + } + + return $this->buildDirectory; + } + + /** + * @return string|null + */ + public function getBuildBranchDirectory() + { + if (!$this->getId()) { + return null; + } + + if (empty($this->buildBranchDirectory)) { + $this->buildBranchDirectory = $this->getProjectId() . '/' . $this->getBranch() . '_' . substr( + md5(($this->getBranch() . '_' . $this->getProject()->getCreateDate()->format('Y-m-d H:i:s')) + ), 0, 8); + } + + return $this->buildBranchDirectory; + } + + /** * @return string|null */ public function getBuildPath() @@ -895,17 +938,7 @@ class Build extends Model return null; } - if (empty($this->currentBuildPath)) { - $buildDirectory = $this->getId() . '_' . substr(md5(microtime(true)), 0, 5); - $this->currentBuildPath = - RUNTIME_DIR . - 'builds' . - DIRECTORY_SEPARATOR . - $buildDirectory . - DIRECTORY_SEPARATOR; - } - - return $this->currentBuildPath; + return RUNTIME_DIR . 'builds/' . $this->getBuildDirectory() . '/'; } /** @@ -921,11 +954,22 @@ class Build extends Model return; } - if (is_link($buildPath)) { - // Remove the symlink without using recursive. - exec(sprintf('rm "%s"', $buildPath)); - } else { - exec(sprintf('rm -Rf "%s"', $buildPath)); + try { + $fileSystem = new Filesystem(); + + if (is_link($buildPath)) { + // Remove the symlink without using recursive. + exec(sprintf('rm "%s"', $buildPath)); + } else { + $fileSystem->remove($buildPath); + } + + $buildDirectory = $this->getBuildDirectory(); + + $fileSystem->remove(PUBLIC_DIR . 'artifacts/pdepend/' . $buildDirectory); + $fileSystem->remove(PUBLIC_DIR . 'artifacts/phpunit/' . $buildDirectory); + } catch (\Exception $e) { + } } diff --git a/src/PHPCensor/Plugin/Pdepend.php b/src/PHPCensor/Plugin/Pdepend.php index dc02df9d..b9cc2735 100644 --- a/src/PHPCensor/Plugin/Pdepend.php +++ b/src/PHPCensor/Plugin/Pdepend.php @@ -5,6 +5,7 @@ namespace PHPCensor\Plugin; use PHPCensor\Builder; use PHPCensor\Model\Build; use PHPCensor\Plugin; +use Symfony\Component\Filesystem\Filesystem; /** * Pdepend Plugin - Allows Pdepend report @@ -20,6 +21,11 @@ class Pdepend extends Plugin */ protected $buildDirectory; + /** + * @var string + */ + protected $buildBranchDirectory; + /** * @var string Directory which needs to be scanned */ @@ -41,10 +47,14 @@ class Pdepend extends Plugin protected $pyramid; /** - * @var string Location on the server where the files are stored. Preferably in the webroot for inclusion - * in the readme.md of the repository + * @var string */ - protected $location; + protected $buildLocation; + + /** + * @var string + */ + protected $buildBranchLocation; /** * @return string @@ -69,8 +79,11 @@ class Pdepend extends Plugin $this->pyramid = 'pyramid.svg'; $this->chart = 'chart.svg'; - $this->buildDirectory = $build->getProjectId() . '/' . $build->getId(); - $this->location = PUBLIC_DIR . 'artifacts/pdepend/' . $this->buildDirectory; + $this->buildDirectory = $build->getBuildDirectory(); + $this->buildBranchDirectory = $build->getBuildBranchDirectory(); + + $this->buildLocation = PUBLIC_DIR . 'artifacts/pdepend/' . $this->buildDirectory; + $this->buildBranchLocation = PUBLIC_DIR . 'artifacts/pdepend/' . $this->buildBranchDirectory; } /** @@ -78,11 +91,11 @@ class Pdepend extends Plugin */ public function execute() { - if (!file_exists($this->location)) { - mkdir($this->location, (0777 & ~umask()), true); + if (!file_exists($this->buildLocation)) { + mkdir($this->buildLocation, (0777 & ~umask()), true); } - if (!is_writable($this->location)) { - throw new \Exception(sprintf('The location %s is not writable or does not exist.', $this->location)); + if (!is_writable($this->buildLocation)) { + throw new \Exception(sprintf('The location %s is not writable or does not exist.', $this->buildLocation)); } $pdepend = $this->findBinary('pdepend'); @@ -100,22 +113,32 @@ class Pdepend extends Plugin $success = $this->builder->executeCommand( $cmd, - $this->location . DIRECTORY_SEPARATOR . $this->summary, - $this->location . DIRECTORY_SEPARATOR . $this->chart, - $this->location . DIRECTORY_SEPARATOR . $this->pyramid, + $this->buildLocation . DIRECTORY_SEPARATOR . $this->summary, + $this->buildLocation . DIRECTORY_SEPARATOR . $this->chart, + $this->buildLocation . DIRECTORY_SEPARATOR . $this->pyramid, $ignore, $this->directory ); + $fileSystem = new Filesystem(); + + if (file_exists($this->buildLocation)) { + $fileSystem->remove($this->buildBranchLocation); + $fileSystem->mirror($this->buildLocation, $this->buildBranchLocation); + } + $config = $this->builder->getSystemConfig('php-censor'); if ($success) { $this->builder->logSuccess( sprintf( - "\nPdepend successful.\nYou can use: %s,\n![Chart](%s \"Pdepend Chart\") and\n![Pyramid](%s \"Pdepend Pyramid\")\nfor inclusion in the readme.md file", + "\nPdepend successful build report.\nYou can use report for this build for inclusion in the readme.md file:\n%s,\n![Chart](%s \"Pdepend Chart\") and\n![Pyramid](%s \"Pdepend Pyramid\")\n\nOr report for last build in the branch:\n%s,\n![Chart](%s \"Pdepend Chart\") and\n![Pyramid](%s \"Pdepend Pyramid\")\n", $config['url'] . '/artifacts/pdepend/' . $this->buildDirectory . '/' . $this->summary, $config['url'] . '/artifacts/pdepend/' . $this->buildDirectory . '/' . $this->chart, - $config['url'] . '/artifacts/pdepend/' . $this->buildDirectory . '/' . $this->pyramid + $config['url'] . '/artifacts/pdepend/' . $this->buildDirectory . '/' . $this->pyramid, + $config['url'] . '/artifacts/pdepend/' . $this->buildBranchDirectory . '/' . $this->summary, + $config['url'] . '/artifacts/pdepend/' . $this->buildBranchDirectory . '/' . $this->chart, + $config['url'] . '/artifacts/pdepend/' . $this->buildBranchDirectory . '/' . $this->pyramid ) ); } @@ -130,8 +153,8 @@ class Pdepend extends Plugin { //Remove the created files first foreach ([$this->summary, $this->chart, $this->pyramid] as $file) { - if (file_exists($this->location . DIRECTORY_SEPARATOR . $file)) { - unlink($this->location . DIRECTORY_SEPARATOR . $file); + if (file_exists($this->buildLocation . DIRECTORY_SEPARATOR . $file)) { + unlink($this->buildLocation . DIRECTORY_SEPARATOR . $file); } } } diff --git a/src/PHPCensor/Plugin/PhpUnit.php b/src/PHPCensor/Plugin/PhpUnit.php index 2cb0cd44..ca49afba 100644 --- a/src/PHPCensor/Plugin/PhpUnit.php +++ b/src/PHPCensor/Plugin/PhpUnit.php @@ -11,6 +11,7 @@ use PHPCensor\Plugin\Util\PhpUnitResultJson; use PHPCensor\Plugin\Util\PhpUnitResultJunit; use PHPCensor\Plugin; use PHPCensor\ZeroConfigPluginInterface; +use Symfony\Component\Filesystem\Filesystem; /** * PHP Unit Plugin - A rewrite of the original PHP Unit plugin @@ -28,9 +29,21 @@ class PhpUnit extends Plugin implements ZeroConfigPluginInterface /** * @var string */ - protected $location; + protected $buildBranchDirectory; - /** @var string[] Raw options from the config file */ + /** + * @var string + */ + protected $buildLocation; + + /** + * @var string + */ + protected $buildBranchLocation; + + /** + * @var string[] Raw options from the config file + */ protected $options = []; /** @@ -57,10 +70,13 @@ class PhpUnit extends Plugin implements ZeroConfigPluginInterface { parent::__construct($builder, $build, $options); - $this->buildDirectory = $this->build->getProjectId() . '/' . $this->build->getId(); - $this->location = PUBLIC_DIR . 'artifacts/phpunit/' . $this->buildDirectory . '/coverage'; + $this->buildDirectory = $build->getBuildDirectory(); + $this->buildBranchDirectory = $build->getBuildBranchDirectory(); - $this->options = new PhpUnitOptions($options, $this->location); + $this->buildLocation = PUBLIC_DIR . 'artifacts/phpunit/' . $this->buildDirectory; + $this->buildBranchLocation = PUBLIC_DIR . 'artifacts/phpunit/' . $this->buildBranchDirectory; + + $this->options = new PhpUnitOptions($options, $this->buildLocation, $this->buildBranchLocation); } /** @@ -145,8 +161,10 @@ class PhpUnit extends Plugin implements ZeroConfigPluginInterface $options->addArgument('configuration', $buildPath . $configFile); } - if (!file_exists($this->location) && $options->getOption('coverage')) { - mkdir($this->location, (0777 & ~umask()), true); + $fileSystem = new Filesystem(); + + if (!$fileSystem->exists($this->buildLocation) && $options->getOption('coverage')) { + $fileSystem->mkdir($this->buildLocation, (0777 & ~umask())); } $arguments = $this->builder->interpolate($options->buildArgumentString()); @@ -154,6 +172,11 @@ class PhpUnit extends Plugin implements ZeroConfigPluginInterface $success = $this->builder->executeCommand($cmd, $arguments, $directory); $output = $this->builder->getLastOutput(); + if ($fileSystem->exists($this->buildLocation) && $options->getOption('coverage')) { + $fileSystem->remove($this->buildBranchLocation); + $fileSystem->mirror($this->buildLocation, $this->buildBranchLocation); + } + $this->processResults($logFile, $logFormat); $config = $this->builder->getSystemConfig('php-censor'); @@ -173,8 +196,9 @@ class PhpUnit extends Plugin implements ZeroConfigPluginInterface $this->builder->logSuccess( sprintf( - "\nPHPUnit successful.\nYou can use coverage report: %s", - $config['url'] . '/artifacts/phpunit/' . $this->buildDirectory . '/coverage/index.html' + "\nPHPUnit successful build coverage report.\nYou can use coverage report for this build: %s\nOr coverage report for last build in the branch: %s", + $config['url'] . '/artifacts/phpunit/' . $this->buildDirectory . '/index.html', + $config['url'] . '/artifacts/phpunit/' . $this->buildBranchDirectory . '/index.html' ) ); } diff --git a/src/PHPCensor/Service/BuildService.php b/src/PHPCensor/Service/BuildService.php index fa06c506..2aee59ee 100644 --- a/src/PHPCensor/Service/BuildService.php +++ b/src/PHPCensor/Service/BuildService.php @@ -151,6 +151,7 @@ class BuildService public function deleteBuild(Build $build) { $build->removeBuildDirectory(); + return $this->buildStore->delete($build); } diff --git a/src/PHPCensor/Service/ProjectService.php b/src/PHPCensor/Service/ProjectService.php index 5d54a079..7822f062 100644 --- a/src/PHPCensor/Service/ProjectService.php +++ b/src/PHPCensor/Service/ProjectService.php @@ -2,8 +2,10 @@ namespace PHPCensor\Service; +use PHPCensor\Model\Build; use PHPCensor\Model\Project; use PHPCensor\Store\ProjectStore; +use Symfony\Component\Filesystem\Filesystem; /** * The project service handles the creation, modification and deletion of projects. @@ -120,6 +122,16 @@ class ProjectService */ public function deleteProject(Project $project) { + try { + $fileSystem = new Filesystem(); + + $fileSystem->remove(RUNTIME_DIR . 'builds/' . $project->getId()); + $fileSystem->remove(PUBLIC_DIR . 'artifacts/pdepend/' . $project->getId()); + $fileSystem->remove(PUBLIC_DIR . 'artifacts/phpunit/' . $project->getId()); + } catch (\Exception $e) { + + } + return $this->projectStore->delete($project); }