diff --git a/Mage/Command/BuiltIn/DeployCommand.php b/Mage/Command/BuiltIn/DeployCommand.php
index 943a630..e4e2a78 100644
--- a/Mage/Command/BuiltIn/DeployCommand.php
+++ b/Mage/Command/BuiltIn/DeployCommand.php
@@ -59,6 +59,15 @@ class DeployCommand extends AbstractCommand implements RequiresEnvironment
*/
const IN_PROGRESS = 'in_progress';
+ /**
+ * Stage where possible throw Rollback Exception
+ * @var array
+ */
+ public $acceptedStagesToRollback = array(
+ AbstractTask::STAGE_POST_RELEASE,
+ AbstractTask::STAGE_POST_DEPLOY
+ );
+
/**
* Time the Deployment has Started
* @var integer
@@ -430,22 +439,46 @@ class DeployCommand extends AbstractCommand implements RequiresEnvironment
}
}
- protected function runRollbackTask(){
+ protected function runRollbackTask(AbstractTask $task){
$this->getConfig()->reload();
$hosts = $this->getConfig()->getHosts();
- if (count($hosts) == 0) {
+ Console::output("",1,2);
+ Console::output("Starting the rollback",1,1);
+
+ if(!in_array($task->getStage(), $this->acceptedStagesToRollback ) ) {
+ $stagesString = implode(', ',$this->acceptedStagesToRollback);
+ Console::output("Warning! Rollback during deployment can be called only at the stages: $stagesString ",1);
+ Console::output("Rollback: ABORTING",1,3);
+
+ } elseif (count($hosts) == 0) {
Console::output('Warning! No hosts defined, unable to get releases.', 1, 3);
} else {
$result = true;
- foreach ($hosts as $host) {
- $this->getConfig()->setHost($host);
+ foreach ($hosts as $hostKey => $host) {
+ $hostConfig = null;
+ if (is_array($host)) {
+ $hostConfig = $host;
+ $host = $hostKey;
+ }
+ // Set Host and Host Specific Config
+ $this->getConfig()->setHost($host);
+ $this->getConfig()->setHostConfig($hostConfig);
$this->getConfig()->setReleaseId(-1);
- $task = Factory::get('releases/rollback', $this->getConfig());
+
+ $task = Factory::get(array(
+ 'name'=>'releases/rollback',
+ 'parameters' => array('inDeploy'=>true)
+ ),
+ $this->getConfig(),
+ false,
+ $task->getStage()
+ );
$task->init();
$result = $task->run() && $result;
+
}
return $result;
}
@@ -486,8 +519,8 @@ class DeployCommand extends AbstractCommand implements RequiresEnvironment
$result = false;
}
} catch (RollbackException $e) {
- Console::output('FAIL, Rollback started [Message: ' . $e->getMessage() . ']', 0);
- $this->runRollbackTask();
+ Console::output('FAIL, Rollback catched [Message: ' . $e->getMessage() . ']', 0);
+ $this->runRollbackTask($task);
$result = false;
} catch (ErrorWithMessageException $e) {
diff --git a/Mage/Task/BuiltIn/Releases/RollbackTask.php b/Mage/Task/BuiltIn/Releases/RollbackTask.php
index 7a437fd..1de9831 100644
--- a/Mage/Task/BuiltIn/Releases/RollbackTask.php
+++ b/Mage/Task/BuiltIn/Releases/RollbackTask.php
@@ -55,12 +55,18 @@ class RollbackTask extends AbstractTask implements IsReleaseAware
$result = $this->runCommandRemote('ls -1 ' . $releasesDirectory, $output);
$releases = ($output == '') ? array() : explode(PHP_EOL, $output);
+ $inDeploy = $this->getParameter('inDeploy',false);
+
if (count($releases) == 0) {
Console::output('Release are not available for ' . $this->getConfig()->getHost() . ' ... FAIL');
} else {
rsort($releases);
- $deleteCurrent = $this->getConfig()->getParameter('deleteCurrent', false);
+ $deleteCurrent = $this->getConfig()->getParameter('deleteCurrent',
+ $this->getConfig()->deployment('delete-on-rollback',
+ $this->getConfig()->general('delete-on-rollback',false)
+ )
+ );
$releaseIsAvailable = false;
if ($this->getReleaseId() == '') {