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;
-
- /**
- * 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;
-
- /**
- * Extra parameters
- * @var array
- */
- protected $parameters = array();
-
- /**
- * 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();
-
- /**
- * 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;
- }
-
- /**
- * 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;
- }
-
- /**
- * 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());
- }
-
- /**
- * @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 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 = '';
- }
-
- // 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();
-
- $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);
-
- 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);
- }
- }
-
- /**
- * 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;
- }
+ protected $config = null;
+
+ /**
+ * 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;
+
+ /**
+ * Extra parameters
+ * @var array
+ */
+ protected $parameters = array();
+
+ /**
+ * 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();
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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());
+ }
+
+ /**
+ * @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 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 = '';
+ }
+
+ // 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();
+
+ $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);
+
+ 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);
+ }
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * @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;
+ }
+
+ $releaseId = $this->getConfig()->getReleaseId();
- if (substr($symlink, 0, 1) == '/') {
- $releasesDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory;
- }
+ if ($this->getConfig()->release('compressreleases', false) == true) {
+ // Tar.gz releases
+ $result = $this->tarReleases() && $result;
+ // Untar new release
+ $result = $this->untarRelease($releaseId) && $result;
+ }
- $currentCopy = $releasesDirectory . '/' . $this->getConfig()->getReleaseId();
+ $currentCopy = $releasesDirectory . '/' . $releaseId;
- //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;
- }
- }
+ //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;
+ }
+ }
- // Remove symlink if exists; create new symlink and change owners
- $command = 'rm -f ' . $symlink
- . ' ; '
- . 'ln -sf ' . $currentCopy . ' ' . $symlink;
+ // Remove symlink if exists; create new symlink and change owners
+ $command = 'rm -f ' . $symlink
+ . ' ; '
+ . 'ln -sf ' . $currentCopy . ' ' . $symlink;
- if ($resultFetch && $userGroup != '') {
- $command .= ' && '
- . 'chown -h ' . $userGroup . ' ' . $symlink
- . ' && '
- . 'chown -R ' . $userGroup . ' ' . $currentCopy
- . ' && '
- . 'chown ' . $userGroup . ' ' . $releasesDirectory;
- }
+ if ($resultFetch && $userGroup != '') {
+ $command .= ' && '
+ . 'chown -h ' . $userGroup . ' ' . $symlink
+ . ' && '
+ . 'chown -R ' . $userGroup . ' ' . $currentCopy
+ . ' && '
+ . 'chown ' . $userGroup . ' ' . $releasesDirectory;
+ }
- $result = $this->runCommandRemote($command);
+ $result = $this->runCommandRemote($command);
- return $result;
+ return $result;
- } else {
- return false;
- }
- }
+ } 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;
-
- /**
- * (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;
- }
-
- /**
- * 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');
-
- $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');
-
- } else {
- rsort($releases);
-
- $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;
- }
- }
-
- 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;
-
- // 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);
-
- 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);
- }
- }
-
- // Changing Release
- Console::output('Running Rollback Release [id=' . $releaseId . '] ... ', 2, false);
-
- $userGroup = '';
- $resultFetch = $this->runCommandRemote('ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'', $userGroup);
- $command = 'rm -f ' . $symlink
- . ' && '
- . 'ln -sf ' . $rollbackTo . ' ' . $symlink;
-
- if ($resultFetch) {
- $command .= ' && chown -h ' . $userGroup . ' ' . $symlink;
- }
-
- $result = $this->runCommandRemote($command);
-
- if ($result) {
- Console::output('OK', 0);
- $completedTasks++;
- } else {
- Console::output('FAIL', 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 ($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 ($completedTasks == $tasks) {
- $tasksColor = 'green';
- } else {
- $tasksColor = 'red';
- }
-
- Console::output('Release rollback on ' . $this->getConfig()->getHost() . ' compted: <' . $tasksColor . '>' . $completedTasks . '/' . $tasks . '' . $tasksColor . '> tasks done.', 1, 3);
- }
- }
-
- return $result;
-
- } else {
- return false;
- }
- }
+ protected $release = null;
+
+ /**
+ * (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;
+ }
+
+ /**
+ * 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');
+
+ $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');
+
+ } else {
+ rsort($releases);
+
+ $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;
+ }
+ }
+
+ 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;
+
+ // 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);
+
+ 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 ($this->getConfig()->release('compressreleases', false) == true) {
+ // Tar the current
+ $result = $this->tarReleases() && $result;
+ // Untar the rollbackto
+ $result = $this->untarRelease($releaseId) && $result;
+ }
+
+ // Changing Release
+ Console::output('Running Rollback Release [id=' . $releaseId . '] ... ', 2, false);
+
+ $userGroup = '';
+ $resultFetch = $this->runCommandRemote('ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'', $userGroup);
+ $command = 'rm -f ' . $symlink
+ . ' && '
+ . 'ln -sf ' . $rollbackTo . ' ' . $symlink;
+
+ if ($resultFetch) {
+ $command .= ' && chown -h ' . $userGroup . ' ' . $symlink;
+ }
+
+ $result = $this->runCommandRemote($command);
+
+ if ($result) {
+ Console::output('OK', 0);
+ $completedTasks++;
+ } else {
+ Console::output('FAIL', 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 ($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 ($completedTasks == $tasks) {
+ $tasksColor = 'green';
+ } else {
+ $tasksColor = 'red';
+ }
+
+ Console::output('Release rollback on ' . $this->getConfig()->getHost() . ' compted: <' . $tasksColor . '>' . $completedTasks . '/' . $tasks . '' . $tasksColor . '> tasks done.', 1, 3);
+ }
+ }
+
+ return $result;
+
+ } else {
+ return false;
+ }
+ }
}
\ No newline at end of file