2012-01-01 21:10:25 +01:00
< ? php
2013-11-05 17:12:09 +01:00
/*
* This file is part of the Magallanes package .
*
* ( c ) Andrés Montañez < andres @ andresmontanez . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2013-11-06 15:44:05 +01:00
namespace Mage\Task\BuiltIn\Releases ;
use Mage\Console ;
use Mage\Task\Factory ;
use Mage\Task\AbstractTask ;
2013-11-07 22:26:32 +01:00
use Mage\Task\Releases\IsReleaseAware ;
2013-11-06 15:44:05 +01:00
use Mage\Task\Releases\RollbackAware ;
/**
* Task for Performing a Rollback Operation
*
* @ author Andrés Montañez < andres @ andresmontanez . com >
*/
2013-11-07 22:26:32 +01:00
class RollbackTask extends AbstractTask implements IsReleaseAware
2012-01-01 21:10:25 +01:00
{
2013-11-06 15:44:05 +01:00
/**
* The Relase ID to Rollback To
* @ var integer
*/
protected $release = null ;
/**
* ( non - PHPdoc )
* @ see \Mage\Task\AbstractTask :: getName ()
*/
2012-01-01 21:10:25 +01:00
public function getName ()
{
return 'Rollback release [built-in]' ;
}
2013-11-06 15:44:05 +01:00
/**
* Sets the Release ID to Rollback To
* @ param integer $releaseId
* @ return \Mage\Task\BuiltIn\Releases\RollbackTask
*/
2012-01-01 21:10:25 +01:00
public function setRelease ( $releaseId )
{
2013-11-06 15:44:05 +01:00
$this -> release = $releaseId ;
2012-01-01 21:10:25 +01:00
return $this ;
}
2013-11-06 15:44:05 +01:00
/**
* Gets the Release ID to Rollback To
* @ return integer
*/
2012-01-01 21:10:25 +01:00
public function getRelease ()
{
2013-11-06 15:44:05 +01:00
return $this -> release ;
2012-01-01 21:10:25 +01:00
}
2012-09-21 05:23:07 +02:00
2013-11-06 15:44:05 +01:00
/**
* Performs a Rollback Operation
* @ see \Mage\Task\AbstractTask :: run ()
*/
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 = '' ;
2013-11-06 15:44:05 +01:00
$result = $this -> runCommandRemote ( 'ls -1 ' . $releasesDirectory , $output );
2012-01-01 21:10:25 +01:00
$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 ) {
2013-11-06 15:44:05 +01:00
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 ) {
2013-11-06 15:44:05 +01:00
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 {
2013-11-06 15:44:05 +01:00
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 );
2014-03-16 22:42:29 +01:00
// Run Deploy Tasks
2013-11-07 22:26:32 +01:00
foreach ( $tasksToRun as $taskData ) {
2013-12-15 20:11:53 +01:00
$task = Factory :: get ( $taskData , $this -> getConfig (), true , self :: STAGE_DEPLOY );
2013-11-07 22:26:32 +01:00
$task -> init ();
Console :: output ( 'Running <purple>' . $task -> getName () . '</purple> ... ' , 2 , false );
if ( $task instanceOf RollbackAware ) {
$tasks ++ ;
$result = $task -> run ();
2012-09-21 05:23:07 +02:00
2013-11-07 22:26:32 +01:00
if ( $result == true ) {
Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
} else {
Console :: output ( '<red>FAIL</red>' , 0 );
}
} else {
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
2013-11-06 15:44:05 +01:00
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 = '' ;
2013-11-06 15:44:05 +01:00
$resultFetch = $this -> runCommandRemote ( 'ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'' , $userGroup );
2012-01-01 21:10:25 +01:00
$command = 'rm -f ' . $symlink
. ' && '
2013-12-19 18:37:26 +01:00
. 'ln -sf ' . $rollbackTo . ' ' . $symlink ;
if ( $resultFetch ) {
$command .= ' && chown -h ' . $userGroup . ' ' . $symlink ;
}
2013-11-06 15:44:05 +01:00
$result = $this -> runCommandRemote ( $command );
2012-01-01 21:10:25 +01:00
if ( $result ) {
2013-11-06 15:44:05 +01:00
Console :: output ( '<green>OK</green>' , 0 );
2012-01-01 21:10:25 +01:00
$completedTasks ++ ;
} else {
2013-11-06 15:44:05 +01:00
Console :: output ( '<red>FAIL</red>' , 0 );
2012-01-01 21:10:25 +01:00
}
2012-09-21 05:23:07 +02:00
2014-03-16 22:42:29 +01:00
// 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 <purple>' . $task -> getName () . '</purple> ... ' , 2 , false );
if ( $task instanceOf RollbackAware ) {
$tasks ++ ;
$result = $task -> run ();
if ( $result == true ) {
Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
} else {
Console :: output ( '<red>FAIL</red>' , 0 );
}
} else {
Console :: output ( '<yellow>SKIPPED</yellow>' , 0 );
}
}
2012-01-01 21:10:25 +01:00
if ( $completedTasks == $tasks ) {
$tasksColor = 'green' ;
} else {
$tasksColor = 'red' ;
}
2012-09-21 05:23:07 +02:00
2013-11-06 15:44:05 +01:00
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 ;
2013-11-06 15:44:05 +01:00
2012-01-01 21:10:25 +01:00
} else {
return false ;
}
}
}