From 014d98bc9699d5667b15603001c8d1ed56611a29 Mon Sep 17 00:00:00 2001 From: woutersioen Date: Wed, 16 Jul 2014 16:29:44 +0200 Subject: [PATCH 1/5] Implement releases in git-rebase Note: the parameter repository needs to be set to make this work. --- Mage/Task/AbstractTask.php | 18 +++++ .../Deployment/Strategy/GitRebaseTask.php | 67 +++++++++++++------ 2 files changed, 64 insertions(+), 21 deletions(-) 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/GitRebaseTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php index 5bcbd8e..f3ffbde 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,69 @@ 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; } return $result; } -} \ No newline at end of file +} From f7e2163fedd09f3738b40630ff565025fe89fff0 Mon Sep 17 00:00:00 2001 From: woutersioen Date: Wed, 16 Jul 2014 17:04:23 +0200 Subject: [PATCH 2/5] Cleanup releases. --- .../Deployment/Strategy/GitRebaseTask.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php index f3ffbde..b0bc000 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php @@ -97,6 +97,41 @@ class GitRebaseTask extends BaseStrategyTaskAbstract implements IsReleaseAware $result = $this->runCommandRemote($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); + } + } + } + } + } + } + return $result; } } From b869876c26059b63ff496733723076cb0424b5f8 Mon Sep 17 00:00:00 2001 From: woutersioen Date: Wed, 16 Jul 2014 17:06:00 +0200 Subject: [PATCH 3/5] Refactor tar gz to reuse function. --- .../BuiltIn/Deployment/Strategy/TarGzTask.php | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php index eae35bb..34a8034 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php @@ -75,25 +75,11 @@ 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 @@ -137,4 +123,4 @@ class TarGzTask extends BaseStrategyTaskAbstract implements IsReleaseAware return $result; } -} \ No newline at end of file +} From 980d209fb456631e279220d88c88835a917bc25d Mon Sep 17 00:00:00 2001 From: woutersioen Date: Wed, 16 Jul 2014 17:07:19 +0200 Subject: [PATCH 4/5] Refactor cleaning up releases to a common function. --- .../Strategy/BaseStrategyTaskAbstract.php | 41 +++++++++++++++++++ .../Deployment/Strategy/GitRebaseTask.php | 35 +--------------- .../BuiltIn/Deployment/Strategy/TarGzTask.php | 35 +--------------- 3 files changed, 43 insertions(+), 68 deletions(-) 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 b0bc000..61ac5e9 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php @@ -97,40 +97,7 @@ class GitRebaseTask extends BaseStrategyTaskAbstract implements IsReleaseAware $result = $this->runCommandRemote($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; } diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php index 34a8034..ea9e99e 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php @@ -86,40 +86,7 @@ class TarGzTask extends BaseStrategyTaskAbstract implements IsReleaseAware $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; } From 0ce94c382181ab9df46cdcacfe1d93b7271afe98 Mon Sep 17 00:00:00 2001 From: woutersioen Date: Wed, 16 Jul 2014 17:08:04 +0200 Subject: [PATCH 5/5] Also use common code in RsyncTask --- .../BuiltIn/Deployment/Strategy/RsyncTask.php | 35 +------------------ 1 file changed, 1 insertion(+), 34 deletions(-) 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; }