2012-01-01 21:10:25 +01:00
< ? php
class Mage_Task_BuiltIn_Releases_Rollback
extends Mage_Task_TaskAbstract
2012-02-04 19:31:42 +01:00
implements Mage_Task_Releases_BuiltIn
2012-01-01 21:10:25 +01:00
{
private $_release = null ;
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
public function getName ()
{
return 'Rollback release [built-in]' ;
}
public function setRelease ( $releaseId )
{
$this -> _release = $releaseId ;
return $this ;
}
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
public function getRelease ()
{
return $this -> _release ;
}
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
public function run ()
{
2012-09-21 05:23:07 +02:00
if ( $this -> getConfig () -> release ( 'enabled' , false ) == true ) {
$releasesDirectory = $this -> getConfig () -> release ( 'directory' , 'releases' );
$symlink = $this -> getConfig () -> release ( 'symlink' , 'current' );
2012-01-01 21:10:25 +01:00
$output = '' ;
$result = $this -> _runRemoteCommand ( 'ls -1 ' . $releasesDirectory , $output );
$releases = ( $output == '' ) ? array () : explode ( PHP_EOL , $output );
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
if ( count ( $releases ) == 0 ) {
2012-09-21 05:23:07 +02:00
Mage_Console :: output ( 'Release are not available for <dark_gray>' . $this -> getConfig () -> getHost () . '</dark_gray> ... <red>FAIL</red>' );
2012-01-01 21:10:25 +01:00
} else {
rsort ( $releases );
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
$releaseIsAvailable = false ;
if ( $this -> getRelease () == '' ) {
$releaseId = $releases [ 0 ];
2012-09-21 05:23:07 +02:00
$releaseIsAvailable = true ;
2012-01-01 21:10:25 +01:00
} 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 ;
}
}
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
if ( ! $releaseIsAvailable ) {
2012-09-21 05:23:07 +02:00
Mage_Console :: output ( 'Release <dark_gray>' . $this -> getRelease () . '</dark_gray> is invalid or unavailable for <dark_gray>' . $this -> getConfig () -> getHost () . '</dark_gray> ... <red>FAIL</red>' );
2012-01-01 21:10:25 +01:00
} else {
2012-09-21 05:23:07 +02:00
Mage_Console :: output ( 'Rollback release on <dark_gray>' . $this -> getConfig () -> getHost () . '</dark_gray>' );
2012-01-01 21:10:25 +01:00
$rollbackTo = $releasesDirectory . '/' . $releaseId ;
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
// Tasks
$tasks = 1 ;
$completedTasks = 0 ;
2012-09-21 05:23:07 +02:00
$tasksToRun = $this -> getConfig () -> getTasks ();
$this -> getConfig () -> setReleaseId ( $releaseId );
2012-01-01 21:10:25 +01:00
if ( count ( $tasksToRun ) == 0 ) {
Mage_Console :: output ( '<light_purple>Warning!</light_purple> <dark_gray>No </dark_gray><light_cyan>Deployment</light_cyan> <dark_gray>tasks defined.</dark_gray>' , 2 );
2012-09-21 05:23:07 +02:00
Mage_Console :: output ( 'Deployment to <dark_gray>' . $this -> getConfig () -> getHost () . '</dark_gray> skipped!' , 1 , 3 );
2012-01-01 21:10:25 +01:00
} else {
2012-09-24 00:33:10 +02:00
foreach ( $tasksToRun as $taskData ) {
$task = Mage_Task_Factory :: get ( $taskData , $this -> getConfig (), true , 'deploy' );
2012-01-04 02:25:42 +01:00
$task -> init ();
Mage_Console :: output ( 'Running <purple>' . $task -> getName () . '</purple> ... ' , 2 , false );
2012-09-21 05:23:07 +02:00
2012-01-04 02:25:42 +01:00
if ( $task instanceOf Mage_Task_Releases_RollbackAware ) {
$tasks ++ ;
$result = $task -> run ();
2012-09-21 05:23:07 +02:00
2012-01-04 02:25:42 +01:00
if ( $result == true ) {
Mage_Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
} else {
Mage_Console :: output ( '<red>FAIL</red>' , 0 );
}
} else {
2012-09-21 05:23:07 +02:00
Mage_Console :: output ( '<yellow>SKIPPED</yellow>' , 0 );
2012-01-01 21:10:25 +01:00
}
}
}
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
// Changing Release
2012-01-04 02:25:42 +01:00
Mage_Console :: output ( 'Running <purple>Rollback Release [id=' . $releaseId . ']</purple> ... ' , 2 , false );
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
$userGroup = '' ;
2012-10-24 23:52:29 +02:00
$resultFetch = $this -> _runRemoteCommand ( 'ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'' , $userGroup );
2012-01-01 21:10:25 +01:00
$command = 'rm -f ' . $symlink
. ' && '
. 'ln -sf ' . $rollbackTo . ' ' . $symlink
. ' && '
. 'chown -h ' . $userGroup . ' ' . $symlink ;
$result = $this -> _runRemoteCommand ( $command );
if ( $result ) {
Mage_Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
} else {
Mage_Console :: output ( '<red>FAIL</red>' , 0 );
}
2012-09-21 05:23:07 +02:00
2012-01-01 21:10:25 +01:00
if ( $completedTasks == $tasks ) {
$tasksColor = 'green' ;
} else {
$tasksColor = 'red' ;
}
2012-09-21 05:23:07 +02:00
Mage_Console :: output ( 'Release rollback on <dark_gray>' . $this -> getConfig () -> getHost () . '</dark_gray> compted: <' . $tasksColor . '>' . $completedTasks . '/' . $tasks . '</' . $tasksColor . '> tasks done.' , 1 , 3 );
2012-01-01 21:10:25 +01:00
}
}
return $result ;
} else {
return false ;
}
}
}