diff --git a/Mage/Task/AbstractTask.php b/Mage/Task/AbstractTask.php index d2f2ed8..fc1541c 100644 --- a/Mage/Task/AbstractTask.php +++ b/Mage/Task/AbstractTask.php @@ -51,200 +51,260 @@ abstract class AbstractTask * Configuration * @var Config; */ - protected $config = null; + protected $config = null; - /** - * Indicates if the Task is running in a Rollback - * @var boolean - */ - protected $inRollback = false; + /** + * Indicates if the Task is running in a Rollback + * @var boolean + */ + protected $inRollback = false; - /** - * Indicates the Stage the Task is running ing - * @var string - */ - protected $stage = null; + /** + * Indicates the Stage the Task is running ing + * @var string + */ + protected $stage = null; - /** - * Extra parameters - * @var array - */ - protected $parameters = array(); + /** + * Extra parameters + * @var array + */ + protected $parameters = array(); - /** - * Returns the Title of the Task - * @return string - */ - public abstract function getName(); + /** + * Returns the Title of the Task + * @return string + */ + public abstract function getName(); - /** - * Runs the task - * - * @return boolean - * @throws Exception - * @throws ErrorWithMessageException - * @throws SkipException - */ - public abstract function run(); + /** + * Runs the task + * + * @return boolean + * @throws Exception + * @throws ErrorWithMessageException + * @throws SkipException + */ + public abstract function run(); - /** - * Task Constructor - * - * @param Config $config - * @param boolean $inRollback - * @param string $stage - * @param array $parameters - */ - public final function __construct(Config $config, $inRollback = false, $stage = null, $parameters = array()) - { - $this->config = $config; - $this->inRollback = $inRollback; - $this->stage = $stage; - $this->parameters = $parameters; - } + /** + * Task Constructor + * + * @param Config $config + * @param boolean $inRollback + * @param string $stage + * @param array $parameters + */ + public final function __construct(Config $config, $inRollback = false, $stage = null, $parameters = array()) + { + $this->config = $config; + $this->inRollback = $inRollback; + $this->stage = $stage; + $this->parameters = $parameters; + } - /** - * Indicates if the Task is running in a Rollback operation - * @return boolean - */ - public function inRollback() - { - return $this->inRollback; - } + /** + * Indicates if the Task is running in a Rollback operation + * @return boolean + */ + public function inRollback() + { + return $this->inRollback; + } - /** - * Gets the Stage of the Deployment: - * - pre-deploy - * - deploy - * - post-deploy - * - post-release - * @return string - */ - public function getStage() - { - return $this->stage; - } + /** + * Gets the Stage of the Deployment: + * - pre-deploy + * - deploy + * - post-deploy + * - post-release + * @return string + */ + public function getStage() + { + return $this->stage; + } - /** - * Gets the Configuration - * @return Config; - */ - public function getConfig() - { - return $this->config; - } + /** + * Gets the Configuration + * @return Config; + */ + public function getConfig() + { + return $this->config; + } - /** - * Initializes the Task, optional to implement - */ - public function init() - { - } + /** + * Initializes the Task, optional to implement + */ + public function init() + { + } - /** - * Returns a Parameter, or a default if not found - * - * @param string $name - * @param mixed $default - * @return mixed - */ - public function getParameter($name, $default = null) - { - return $this->getConfig()->getParameter($name, $default, $this->getParameters()); - } + /** + * Returns a Parameter, or a default if not found + * + * @param string $name + * @param mixed $default + * @return mixed + */ + public function getParameter($name, $default = null) + { + return $this->getConfig()->getParameter($name, $default, $this->getParameters()); + } - /** - * @return array - */ - protected function getParameters() - { - return $this->parameters; - } + /** + * @return array + */ + protected function getParameters() + { + return $this->parameters; + } - /** - * Runs a Shell Command Localy - * @param string $command - * @param string $output - * @return boolean - */ - protected final function runCommandLocal($command, &$output = null) - { - return Console::executeCommand($command, $output); - } + /** + * Runs a Shell Command Localy + * @param string $command + * @param string $output + * @return boolean + */ + protected final function runCommandLocal($command, &$output = null) + { + return Console::executeCommand($command, $output); + } - /** - * Runs a Shell Command on the Remote Host - * @param string $command - * @param string $output - * @param boolean $cdToDirectoryFirst - * @return boolean - */ - protected final function runCommandRemote($command, &$output = null, $cdToDirectoryFirst = true) - { - if ($this->getConfig()->release('enabled', false) == true) { - if ($this instanceOf IsReleaseAware) { - $releasesDirectory = ''; + /** + * Runs a Shell Command on the Remote Host + * @param string $command + * @param string $output + * @param boolean $cdToDirectoryFirst + * @return boolean + */ + protected final function runCommandRemote($command, &$output = null, $cdToDirectoryFirst = true) + { + if ($this->getConfig()->release('enabled', false) == true) { + if ($this instanceOf IsReleaseAware) { + $releasesDirectory = ''; - } else { - $releasesDirectory = '/' - . $this->getConfig()->release('directory', 'releases') - . '/' - . $this->getConfig()->getReleaseId(); - } + } else { + $releasesDirectory = '/' + . $this->getConfig()->release('directory', 'releases') + . '/' + . $this->getConfig()->getReleaseId(); + } - } else { - $releasesDirectory = ''; - } + } else { + $releasesDirectory = ''; + } - // if general.yml includes "ssy_needs_tty: true", then add "-t" to the ssh command - $needs_tty = ($this->getConfig()->general('ssh_needs_tty',false) ? '-t' : ''); + // if general.yml includes "ssy_needs_tty: true", then add "-t" to the ssh command + $needs_tty = ($this->getConfig()->general('ssh_needs_tty',false) ? '-t' : ''); - $localCommand = 'ssh ' . $this->getConfig()->getHostIdentityFileOption() . $needs_tty . ' -p ' . $this->getConfig()->getHostPort() . ' ' - . '-q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' - . $this->getConfig()->deployment('user') . '@' . $this->getConfig()->getHostName(); + $localCommand = 'ssh ' . $this->getConfig()->getHostIdentityFileOption() . $needs_tty . ' -p ' . $this->getConfig()->getHostPort() . ' ' + . '-q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + . $this->getConfig()->deployment('user') . '@' . $this->getConfig()->getHostName(); - $remoteCommand = str_replace('"', '\"', $command); - if($cdToDirectoryFirst){ - $remoteCommand = 'cd ' . rtrim($this->getConfig()->deployment('to'), '/') . $releasesDirectory . ' && ' . $remoteCommand; - } - $localCommand .= ' ' . '"sh -c \"' . $remoteCommand . '\""'; + $remoteCommand = str_replace('"', '\"', $command); + if($cdToDirectoryFirst){ + $remoteCommand = 'cd ' . rtrim($this->getConfig()->deployment('to'), '/') . $releasesDirectory . ' && ' . $remoteCommand; + } + $localCommand .= ' ' . '"sh -c \"' . $remoteCommand . '\""'; - Console::log('Run remote command ' . $remoteCommand); + Console::log('Run remote command ' . $remoteCommand); - return $this->runCommandLocal($localCommand, $output); - } + return $this->runCommandLocal($localCommand, $output); + } - /** - * Runs a Shell Command Localy or in the Remote Host based on the Task Stage. - * If the stage is "deploy" then it will be executed in the remote host. - * @param string $command - * @param string $output - * @return boolean - */ - protected final function runCommand($command, &$output = null) - { - if ($this->getStage() == self::STAGE_DEPLOY) { - return $this->runCommandRemote($command, $output); - } else { - return $this->runCommandLocal($command, $output); - } - } + /** + * Runs a Shell Command Localy or in the Remote Host based on the Task Stage. + * If the stage is "deploy" then it will be executed in the remote host. + * @param string $command + * @param string $output + * @return boolean + */ + protected final function runCommand($command, &$output = null) + { + if ($this->getStage() == self::STAGE_DEPLOY) { + return $this->runCommandRemote($command, $output); + } else { + 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'); + /** + * 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; - } + $deployToDirectory = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); + return 'cd ' . $deployToDirectory . ' && ' . $command; + } - return $command; - } + return $command; + } + + /** + * @param $releasesDirectory + * @param $releaseId + * @return bool + */ + protected function tarRelease($releaseId) + { + $result = true; + // for given release, check if tarred + $output = ''; + $releasesDirectory = $this->getConfig()->release('directory', 'releases'); + + $currentReleaseDirectory = $releasesDirectory . '/' . $releaseId; + $currentReleaseDirectoryTemp = $currentReleaseDirectory . '_tmp/'; + $currentRelease = $currentReleaseDirectory . '/' . $releaseId . '.tar.gz'; + + $command = 'test -e ' . $currentRelease . ' && echo "true" || echo ""'; + $this->runCommandRemote($command, $output); + + // if not, do so + if (!$output) { + $commands = array(); + $commands[] = 'mv ' . $currentReleaseDirectory . ' ' . $currentReleaseDirectoryTemp; + $commands[] = 'mkdir ' . $currentReleaseDirectory; + $commands[] = 'tar cfz ' . $currentRelease . ' ' . $currentReleaseDirectoryTemp; + $commands[] = 'rm -rf ' . $currentReleaseDirectoryTemp; + $command = implode(' && ', $commands); + $result = $this->runCommandRemote($command, $output); + return $result; + } + return $result; + } + + protected function untarRelease($releaseId) + { + $result = true; + // for given release, check if tarred + $output = ''; + $releasesDirectory = $this->getConfig()->release('directory', 'releases'); + + $currentReleaseDirectory = $releasesDirectory . '/' . $releaseId; + $currentReleaseDirectoryTemp = $currentReleaseDirectory . '_tmp/'; + $currentRelease = $currentReleaseDirectory . '/' . $releaseId . '.tar.gz'; + + $command = 'test -e ' . $currentRelease . ' && echo "true" || echo ""'; + $this->runCommandRemote($command, $output); + + // if tarred, untar now + if ($output) { + $commands = array(); + $commands[] = 'tar xfz ' . $currentRelease; + $commands[] = 'rm -rf ' . $currentReleaseDirectory; + $commands[] = 'mv ' .$currentReleaseDirectoryTemp . ' ' . $currentReleaseDirectory; + $command = implode(' && ', $commands); + $result = $this->runCommandRemote($command, $output); + return $result; + } + return $result; + } } diff --git a/Mage/Task/BuiltIn/Deployment/ReleaseTask.php b/Mage/Task/BuiltIn/Deployment/ReleaseTask.php index 7bf1b38..5abcb52 100644 --- a/Mage/Task/BuiltIn/Deployment/ReleaseTask.php +++ b/Mage/Task/BuiltIn/Deployment/ReleaseTask.php @@ -25,73 +25,82 @@ class ReleaseTask extends AbstractTask implements IsReleaseAware, SkipOnOverride * (non-PHPdoc) * @see \Mage\Task\AbstractTask::getName() */ - public function getName() - { - return 'Releasing [built-in]'; - } + public function getName() + { + return 'Releasing [built-in]'; + } - /** - * Releases a Deployment: points the current symbolic link to the release directory - * @see \Mage\Task\AbstractTask::run() - */ - public function run() - { - if ($this->getConfig()->release('enabled', false) == true) { - $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - $symlink = $this->getConfig()->release('symlink', 'current'); + /** + * Releases a Deployment: points the current symbolic link to the release directory + * @see \Mage\Task\AbstractTask::run() + */ + public function run() + { + 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; - } + if (substr($symlink, 0, 1) == '/') { + $releasesDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory; + } - $currentCopy = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); + $releaseId = $this->getConfig()->getReleaseId(); - //Check if target user:group is specified - $userGroup = $this->getConfig()->deployment('owner'); - // Fetch the user and group from base directory; defaults usergroup to 33:33 - if(empty($userGroup)){ - $user = '33'; - $group = '33'; - $directoryInfos = ''; - // Get raw directory info and parse it in php. - // "stat" command don't behave the same on different systems, ls output format also varies - // and awk parameters need special care depending on the executing shell - $resultFetch = $this->runCommandRemote("ls -ld .", $directoryInfos); - if(!empty($directoryInfos)){ - //uniformize format as it depends on the system deployed on - $directoryInfos = trim(str_replace(array(" ", "\t"), ' ', $directoryInfos)); - $infoArray = explode(' ', $directoryInfos); - if(!empty($infoArray[2])) { - $user = $infoArray[2]; - } - if(!empty($infoArray[3])) { - $group = $infoArray[3]; - } - $userGroup = $user . ':' . $group; - } - } + if ($this->getConfig()->release('compressreleases', false) == true) { + // Tar.gz releases + $result = $this->tarReleases() && $result; + // Untar new release + $result = $this->untarRelease($releaseId) && $result; + } - // Remove symlink if exists; create new symlink and change owners - $command = 'rm -f ' . $symlink - . ' ; ' - . 'ln -sf ' . $currentCopy . ' ' . $symlink; + $currentCopy = $releasesDirectory . '/' . $releaseId; - if ($resultFetch && $userGroup != '') { - $command .= ' && ' - . 'chown -h ' . $userGroup . ' ' . $symlink - . ' && ' - . 'chown -R ' . $userGroup . ' ' . $currentCopy - . ' && ' - . 'chown ' . $userGroup . ' ' . $releasesDirectory; - } + //Check if target user:group is specified + $userGroup = $this->getConfig()->deployment('owner'); + // Fetch the user and group from base directory; defaults usergroup to 33:33 + if(empty($userGroup)){ + $user = '33'; + $group = '33'; + $directoryInfos = ''; + // Get raw directory info and parse it in php. + // "stat" command don't behave the same on different systems, ls output format also varies + // and awk parameters need special care depending on the executing shell + $resultFetch = $this->runCommandRemote("ls -ld .", $directoryInfos); + if(!empty($directoryInfos)){ + //uniformize format as it depends on the system deployed on + $directoryInfos = trim(str_replace(array(" ", "\t"), ' ', $directoryInfos)); + $infoArray = explode(' ', $directoryInfos); + if(!empty($infoArray[2])) { + $user = $infoArray[2]; + } + if(!empty($infoArray[3])) { + $group = $infoArray[3]; + } + $userGroup = $user . ':' . $group; + } + } - $result = $this->runCommandRemote($command); + // Remove symlink if exists; create new symlink and change owners + $command = 'rm -f ' . $symlink + . ' ; ' + . 'ln -sf ' . $currentCopy . ' ' . $symlink; - return $result; + if ($resultFetch && $userGroup != '') { + $command .= ' && ' + . 'chown -h ' . $userGroup . ' ' . $symlink + . ' && ' + . 'chown -R ' . $userGroup . ' ' . $currentCopy + . ' && ' + . 'chown ' . $userGroup . ' ' . $releasesDirectory; + } - } else { - return false; - } - } + $result = $this->runCommandRemote($command); + + return $result; + + } else { + return false; + } + } } diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php index 5782892..76ddc44 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php @@ -10,6 +10,7 @@ namespace Mage\Task\BuiltIn\Deployment\Strategy; +use Mage\Console; use Mage\Task\BuiltIn\Deployment\Strategy\BaseStrategyTaskAbstract; use Mage\Task\Releases\IsReleaseAware; @@ -67,19 +68,19 @@ class TarGzTask extends BaseStrategyTaskAbstract implements IsReleaseAware } $command = 'tar cfz ' . $localTarGz . '.tar.gz ' . $excludeCmd . ' -C ' . $this->getConfig()->deployment('from') . ' .'; - $result = $this->runCommandLocal($command); + $result = $this->runCommandLocal($command); - // Copy Tar Gz to Remote Host - $command = 'scp ' . $this->getConfig()->getHostIdentityFileOption() . '-P ' . $this->getConfig()->getHostPort() . ' ' . $localTarGz . '.tar.gz ' + // Copy Tar Gz to Remote Host + $command = 'scp ' . $this->getConfig()->getHostIdentityFileOption() . '-P ' . $this->getConfig()->getHostPort() . ' ' . $localTarGz . '.tar.gz ' . $this->getConfig()->deployment('user') . '@' . $this->getConfig()->getHostName() . ':' . $deployToDirectory; - $result = $this->runCommandLocal($command) && $result; + $result = $this->runCommandLocal($command) && $result; // Extract Tar Gz - $this->getReleasesAwareCommand('tar xfz ' . $remoteTarGz . '.tar.gz'); + $command = $this->getReleasesAwareCommand('tar xfz ' . $remoteTarGz . '.tar.gz'); $result = $this->runCommandRemote($command) && $result; // Delete Tar Gz from Remote Host - $this->getReleasesAwareCommand('rm ' . $remoteTarGz . '.tar.gz'); + $command = $this->getReleasesAwareCommand('rm ' . $remoteTarGz . '.tar.gz'); $result = $this->runCommandRemote($command) && $result; // Delete Tar Gz from Local diff --git a/Mage/Task/BuiltIn/Releases/RollbackTask.php b/Mage/Task/BuiltIn/Releases/RollbackTask.php index 9115883..cfc0a54 100644 --- a/Mage/Task/BuiltIn/Releases/RollbackTask.php +++ b/Mage/Task/BuiltIn/Releases/RollbackTask.php @@ -27,168 +27,175 @@ class RollbackTask extends AbstractTask implements IsReleaseAware * The Relase ID to Rollback To * @var integer */ - protected $release = null; + protected $release = null; - /** - * (non-PHPdoc) - * @see \Mage\Task\AbstractTask::getName() - */ - public function getName() - { - return 'Rollback release [built-in]'; - } + /** + * (non-PHPdoc) + * @see \Mage\Task\AbstractTask::getName() + */ + public function getName() + { + return 'Rollback release [built-in]'; + } - /** - * Sets the Release ID to Rollback To - * @param integer $releaseId - * @return \Mage\Task\BuiltIn\Releases\RollbackTask - */ - public function setRelease($releaseId) - { - $this->release = $releaseId; - return $this; - } + /** + * Sets the Release ID to Rollback To + * @param integer $releaseId + * @return \Mage\Task\BuiltIn\Releases\RollbackTask + */ + public function setRelease($releaseId) + { + $this->release = $releaseId; + return $this; + } - /** - * Gets the Release ID to Rollback To - * @return integer - */ - public function getRelease() - { - return $this->release; - } + /** + * Gets the Release ID to Rollback To + * @return integer + */ + public function getRelease() + { + return $this->release; + } - /** - * Performs a Rollback Operation - * @see \Mage\Task\AbstractTask::run() - */ - public function run() - { - if ($this->getConfig()->release('enabled', false) == true) { - $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - $symlink = $this->getConfig()->release('symlink', 'current'); + /** + * Performs a Rollback Operation + * @see \Mage\Task\AbstractTask::run() + */ + public function run() + { + if ($this->getConfig()->release('enabled', false) == true) { + $releasesDirectory = $this->getConfig()->release('directory', 'releases'); + $symlink = $this->getConfig()->release('symlink', 'current'); - $output = ''; - $result = $this->runCommandRemote('ls -1 ' . $releasesDirectory, $output); - $releases = ($output == '') ? array() : explode(PHP_EOL, $output); + $output = ''; + $result = $this->runCommandRemote('ls -1 ' . $releasesDirectory, $output); + $releases = ($output == '') ? array() : explode(PHP_EOL, $output); - if (count($releases) == 0) { - Console::output('Release are not available for ' . $this->getConfig()->getHost() . ' ... FAIL'); + if (count($releases) == 0) { + Console::output('Release are not available for ' . $this->getConfig()->getHost() . ' ... FAIL'); - } else { - rsort($releases); + } else { + rsort($releases); - $releaseIsAvailable = false; - if ($this->getRelease() == '') { - $releaseId = $releases[0]; - $releaseIsAvailable = true; + $releaseIsAvailable = false; + if ($this->getRelease() == '') { + $releaseId = $releases[0]; + $releaseIsAvailable = true; - } else if ($this->getRelease() <= 0) { - $index = $this->getRelease() * -1; - if (isset($releases[$index])) { - $releaseId = $releases[$index]; - $releaseIsAvailable = true; - } - } else { - if (in_array($this->getRelease(), $releases)) { - $releaseId = $this->getRelease(); - $releaseIsAvailable = true; - } - } + } else if ($this->getRelease() <= 0) { + $index = $this->getRelease() * -1; + if (isset($releases[$index])) { + $releaseId = $releases[$index]; + $releaseIsAvailable = true; + } + } else { + if (in_array($this->getRelease(), $releases)) { + $releaseId = $this->getRelease(); + $releaseIsAvailable = true; + } + } - if (!$releaseIsAvailable) { - Console::output('Release ' . $this->getRelease() . ' is invalid or unavailable for ' . $this->getConfig()->getHost() . ' ... FAIL'); + if (!$releaseIsAvailable) { + Console::output('Release ' . $this->getRelease() . ' is invalid or unavailable for ' . $this->getConfig()->getHost() . ' ... FAIL'); - } else { - Console::output('Rollback release on ' . $this->getConfig()->getHost() . ''); - $rollbackTo = $releasesDirectory . '/' . $releaseId; + } else { + Console::output('Rollback release on ' . $this->getConfig()->getHost() . ''); + $rollbackTo = $releasesDirectory . '/' . $releaseId; - // Tasks - $tasks = 1; - $completedTasks = 0; - $tasksToRun = $this->getConfig()->getTasks(); - $this->getConfig()->setReleaseId($releaseId); + // Tasks + $tasks = 1; + $completedTasks = 0; + $tasksToRun = $this->getConfig()->getTasks(); + $this->getConfig()->setReleaseId($releaseId); - // Run Deploy Tasks - foreach ($tasksToRun as $taskData) { - $task = Factory::get($taskData, $this->getConfig(), true, self::STAGE_DEPLOY); - $task->init(); - Console::output('Running ' . $task->getName() . ' ... ', 2, false); + // Run Deploy Tasks + foreach ($tasksToRun as $taskData) { + $task = Factory::get($taskData, $this->getConfig(), true, self::STAGE_DEPLOY); + $task->init(); + Console::output('Running ' . $task->getName() . ' ... ', 2, false); - if ($task instanceOf RollbackAware) { - $tasks++; - $result = $task->run(); - - if ($result == true) { - Console::output('OK', 0); - $completedTasks++; - } else { - Console::output('FAIL', 0); - } - } else { - Console::output('SKIPPED', 0); - } - } + if ($task instanceOf RollbackAware) { + $tasks++; + $result = $task->run(); - // Changing Release - Console::output('Running Rollback Release [id=' . $releaseId . '] ... ', 2, false); + if ($result == true) { + Console::output('OK', 0); + $completedTasks++; + } else { + Console::output('FAIL', 0); + } + } else { + Console::output('SKIPPED', 0); + } + } - $userGroup = ''; - $resultFetch = $this->runCommandRemote('ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'', $userGroup); - $command = 'rm -f ' . $symlink - . ' && ' - . 'ln -sf ' . $rollbackTo . ' ' . $symlink; + if ($this->getConfig()->release('compressreleases', false) == true) { + // Tar the current + $result = $this->tarReleases() && $result; + // Untar the rollbackto + $result = $this->untarRelease($releaseId) && $result; + } - if ($resultFetch) { - $command .= ' && chown -h ' . $userGroup . ' ' . $symlink; - } + // Changing Release + Console::output('Running Rollback Release [id=' . $releaseId . '] ... ', 2, false); - $result = $this->runCommandRemote($command); + $userGroup = ''; + $resultFetch = $this->runCommandRemote('ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'', $userGroup); + $command = 'rm -f ' . $symlink + . ' && ' + . 'ln -sf ' . $rollbackTo . ' ' . $symlink; - if ($result) { - Console::output('OK', 0); - $completedTasks++; - } else { - Console::output('FAIL', 0); - } + if ($resultFetch) { + $command .= ' && chown -h ' . $userGroup . ' ' . $symlink; + } - // Run Post Release Tasks - $tasksToRun = $this->getConfig()->getTasks(AbstractTask::STAGE_POST_DEPLOY); - foreach ($tasksToRun as $taskData) { - $task = Factory::get($taskData, $this->getConfig(), true, self::STAGE_POST_DEPLOY); - $task->init(); - Console::output('Running ' . $task->getName() . ' ... ', 2, false); + $result = $this->runCommandRemote($command); - if ($task instanceOf RollbackAware) { - $tasks++; - $result = $task->run(); + if ($result) { + Console::output('OK', 0); + $completedTasks++; + } else { + Console::output('FAIL', 0); + } - if ($result == true) { - Console::output('OK', 0); - $completedTasks++; - } else { - Console::output('FAIL', 0); - } - } else { - Console::output('SKIPPED', 0); - } - } + // Run Post Release Tasks + $tasksToRun = $this->getConfig()->getTasks(AbstractTask::STAGE_POST_DEPLOY); + foreach ($tasksToRun as $taskData) { + $task = Factory::get($taskData, $this->getConfig(), true, self::STAGE_POST_DEPLOY); + $task->init(); + Console::output('Running ' . $task->getName() . ' ... ', 2, false); - if ($completedTasks == $tasks) { - $tasksColor = 'green'; - } else { - $tasksColor = 'red'; - } - - Console::output('Release rollback on ' . $this->getConfig()->getHost() . ' compted: <' . $tasksColor . '>' . $completedTasks . '/' . $tasks . ' tasks done.', 1, 3); - } - } + if ($task instanceOf RollbackAware) { + $tasks++; + $result = $task->run(); - return $result; + if ($result == true) { + Console::output('OK', 0); + $completedTasks++; + } else { + Console::output('FAIL', 0); + } + } else { + Console::output('SKIPPED', 0); + } + } - } else { - return false; - } - } + if ($completedTasks == $tasks) { + $tasksColor = 'green'; + } else { + $tasksColor = 'red'; + } + + Console::output('Release rollback on ' . $this->getConfig()->getHost() . ' compted: <' . $tasksColor . '>' . $completedTasks . '/' . $tasks . ' tasks done.', 1, 3); + } + } + + return $result; + + } else { + return false; + } + } } \ No newline at end of file