diff --git a/Mage/Task/AbstractTask.php b/Mage/Task/AbstractTask.php index 69ba25f..bf01c83 100644 --- a/Mage/Task/AbstractTask.php +++ b/Mage/Task/AbstractTask.php @@ -214,4 +214,22 @@ abstract class AbstractTask return $this->runCommandLocal($command, $output); } } + + /** + * adds a cd to the needed release if we work with releases. + * + * @param string $command + * @return string + */ + protected function getReleasesAwareCommand($command) + { + if ($this->getConfig()->release('enabled', false) == true) { + $releasesDirectory = $this->getConfig()->release('directory', 'releases'); + + $deployToDirectory = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); + return 'cd ' . $deployToDirectory . ' && ' . $command; + } + + return $command; + } } diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/BaseStrategyTaskAbstract.php b/Mage/Task/BuiltIn/Deployment/Strategy/BaseStrategyTaskAbstract.php index f17afbd..39dff21 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/BaseStrategyTaskAbstract.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/BaseStrategyTaskAbstract.php @@ -61,4 +61,45 @@ abstract class BaseStrategyTaskAbstract extends AbstractTask implements IsReleas return array_merge($excludes, $userExcludes); } + + /** + * Removes old releases + */ + protected function cleanUpReleases() + { + // Count Releases + if ($this->getConfig()->release('enabled', false) == true) { + $releasesDirectory = $this->getConfig()->release('directory', 'releases'); + $symlink = $this->getConfig()->release('symlink', 'current'); + + if (substr($symlink, 0, 1) == '/') { + $releasesDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory; + } + + $maxReleases = $this->getConfig()->release('max', false); + if (($maxReleases !== false) && ($maxReleases > 0)) { + $releasesList = ''; + $countReleasesFetch = $this->runCommandRemote('ls -1 ' . $releasesDirectory, $releasesList); + $releasesList = trim($releasesList); + + if ($countReleasesFetch && $releasesList != '') { + $releasesList = explode(PHP_EOL, $releasesList); + if (count($releasesList) > $maxReleases) { + $releasesToDelete = array_diff($releasesList, array($this->getConfig()->getReleaseId())); + sort($releasesToDelete); + $releasesToDeleteCount = count($releasesToDelete) - $maxReleases; + $releasesToDelete = array_slice($releasesToDelete, 0, $releasesToDeleteCount + 1); + + foreach ($releasesToDelete as $releaseIdToDelete) { + $directoryToDelete = $releasesDirectory . '/' . $releaseIdToDelete; + if ($directoryToDelete != '/') { + $command = 'rm -rf ' . $directoryToDelete; + $result = $result && $this->runCommandRemote($command); + } + } + } + } + } + } + } } diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php index 5bcbd8e..61ac5e9 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php @@ -18,12 +18,12 @@ use Mage\Task\Releases\IsReleaseAware; * * @author Oscar Reales */ -class GitRebaseTask extends AbstractTask implements IsReleaseAware +class GitRebaseTask extends BaseStrategyTaskAbstract implements IsReleaseAware { - /** - * (non-PHPdoc) - * @see \Mage\Task\AbstractTask::getName() - */ + /** + * (non-PHPdoc) + * @see \Mage\Task\AbstractTask::getName() + */ public function getName() { return 'Deploy via Git Rebase [built-in]'; @@ -34,44 +34,71 @@ class GitRebaseTask extends AbstractTask implements IsReleaseAware * @see \Mage\Task\AbstractTask::run() */ public function run() - { - $branch = $this->getParameter('branch', 'master'); - $remote = $this->getParameter('remote', 'origin'); - - // Fetch Remote - $command = 'git fetch ' . $remote; + { + $this->checkOverrideRelease(); + $excludes = $this->getExcludes(); + + // If we are working with releases + $deployToDirectory = $this->getConfig()->deployment('to'); + if ($this->getConfig()->release('enabled', false) == true) { + $releasesDirectory = $this->getConfig()->release('directory', 'releases'); + + $deployToDirectory = rtrim($this->getConfig()->deployment('to'), '/') + . '/' . $releasesDirectory + . '/' . $this->getConfig()->getReleaseId(); + $this->runCommandRemote('mkdir -p ' . $releasesDirectory . '/' . $this->getConfig()->getReleaseId()); + } + + $branch = $this->getParameter('branch', 'master'); + $remote = $this->getParameter('remote', 'origin'); + + // Fetch Remote + $command = $this->getReleasesAwareCommand('git fetch ' . $remote); $result = $this->runCommandRemote($command); + if ($result === false) { + $repository = $this->getConfig()->deployment('repository'); + if ($repository) { + $command = $this->getReleasesAwareCommand('git clone ' . $repository . ' .'); + $result = $this->runCommandRemote($command); + + $command = $this->getReleasesAwareCommand('git fetch ' . $remote); + $result = $this->runCommandRemote($command); + } + } + // Checkout - $command = 'git checkout ' . $branch; + $command = $this->getReleasesAwareCommand('git checkout ' . $branch); $result = $this->runCommandRemote($command) && $result; // Check Working Copy status $stashed = false; $status = ''; - $command = 'git checkout ' . $branch; + $command = $this->getReleasesAwareCommand('git checkout ' . $branch); $result = $this->runCommandRemote($command) && $result; // Stash if Working Copy is not clean if(!$status) { - $stashResult = ''; - $command = 'git stash'; - $result = $this->runCommandRemote($command, $stashResult) && $result; - if($stashResult != "No local changes to save") { + $stashResult = ''; + $command = $this->getReleasesAwareCommand('git stash'); + $result = $this->runCommandRemote($command, $stashResult) && $result; + if($stashResult != "No local changes to save") { $stashed = true; } } // Rebase - $command = 'git rebase ' . $remote . '/' . $branch; + $command = $this->getReleasesAwareCommand('git rebase ' . $remote . '/' . $branch); $result = $this->runCommandRemote($command) && $result; // If Stashed, restore. if ($stashed) { - $command = 'git stash pop'; - $result = $this->runCommandRemote($command) && $result; + $command = $this->getReleasesAwareCommand('git stash pop'); + $result = $this->runCommandRemote($command) && $result; } + $this->cleanUpReleases(); + return $result; } -} \ No newline at end of file +} diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php index 925a048..8f1d1d9 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php @@ -88,40 +88,7 @@ class RsyncTask extends BaseStrategyTaskAbstract implements IsReleaseAware $result = $this->runCommandLocal($command); - // Count Releases - if ($this->getConfig()->release('enabled', false) == true) { - $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - $symlink = $this->getConfig()->release('symlink', 'current'); - - if (substr($symlink, 0, 1) == '/') { - $releasesDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory; - } - - $maxReleases = $this->getConfig()->release('max', false); - if (($maxReleases !== false) && ($maxReleases > 0)) { - $releasesList = ''; - $countReleasesFetch = $this->runCommandRemote('ls -1 ' . $releasesDirectory, $releasesList); - $releasesList = trim($releasesList); - - if ($countReleasesFetch && $releasesList != '') { - $releasesList = explode(PHP_EOL, $releasesList); - if (count($releasesList) > $maxReleases) { - $releasesToDelete = array_diff($releasesList, array($this->getConfig()->getReleaseId())); - sort($releasesToDelete); - $releasesToDeleteCount = count($releasesToDelete) - $maxReleases; - $releasesToDelete = array_slice($releasesToDelete, 0, $releasesToDeleteCount + 1); - - foreach ($releasesToDelete as $releaseIdToDelete) { - $directoryToDelete = $releasesDirectory . '/' . $releaseIdToDelete; - if ($directoryToDelete != '/') { - $command = 'rm -rf ' . $directoryToDelete; - $result = $result && $this->runCommandRemote($command); - } - } - } - } - } - } + $this->cleanUpReleases(); return $result; } diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php index eae35bb..ea9e99e 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php @@ -75,66 +75,19 @@ class TarGzTask extends BaseStrategyTaskAbstract implements IsReleaseAware $result = $this->runCommandLocal($command) && $result; // Extract Tar Gz - if ($this->getConfig()->release('enabled', false) == true) { - $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - - $deployToDirectory = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); - $command = 'cd ' . $deployToDirectory . ' && tar xfz ' . $remoteTarGz . '.tar.gz'; - } else { - $command = 'tar xfz ' . $remoteTarGz . '.tar.gz'; - } + $this->getReleasesAwareCommand('tar xfz ' . $remoteTarGz . '.tar.gz'); $result = $this->runCommandRemote($command) && $result; // Delete Tar Gz from Remote Host - if ($this->getConfig()->release('enabled', false) == true) { - $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - - $deployToDirectory = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); - $command = 'rm ' . $deployToDirectory . '/' . $remoteTarGz . '.tar.gz'; - } else { - $command = 'rm ' . $remoteTarGz . '.tar.gz'; - } + $this->getReleasesAwareCommand('rm ' . $remoteTarGz . '.tar.gz'); $result = $this->runCommandRemote($command) && $result; // Delete Tar Gz from Local $command = 'rm ' . $localTarGz . ' ' . $localTarGz . '.tar.gz'; $result = $this->runCommandLocal($command) && $result; - // Count Releases - if ($this->getConfig()->release('enabled', false) == true) { - $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - $symlink = $this->getConfig()->release('symlink', 'current'); - - if (substr($symlink, 0, 1) == '/') { - $releasesDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory; - } - - $maxReleases = $this->getConfig()->release('max', false); - if (($maxReleases !== false) && ($maxReleases > 0)) { - $releasesList = ''; - $countReleasesFetch = $this->runCommandRemote('ls -1 ' . $releasesDirectory, $releasesList); - $releasesList = trim($releasesList); - - if ($countReleasesFetch && $releasesList != '') { - $releasesList = explode(PHP_EOL, $releasesList); - if (count($releasesList) > $maxReleases) { - $releasesToDelete = array_diff($releasesList, array($this->getConfig()->getReleaseId())); - sort($releasesToDelete); - $releasesToDeleteCount = count($releasesToDelete) - $maxReleases; - $releasesToDelete = array_slice($releasesToDelete, 0, $releasesToDeleteCount + 1); - - foreach ($releasesToDelete as $releaseIdToDelete) { - $directoryToDelete = $releasesDirectory . '/' . $releaseIdToDelete; - if ($directoryToDelete != '/') { - $command = 'rm -rf ' . $directoryToDelete; - $result = $result && $this->runCommandRemote($command); - } - } - } - } - } - } + $this->cleanUpReleases(); return $result; } -} \ No newline at end of file +}