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
{
2014-08-06 19:01:39 +02:00
/**
* ( non - PHPdoc )
* @ see \Mage\Task\AbstractTask :: getName ()
*/
public function getName ()
{
return 'Rollback release [built-in]' ;
}
/**
* Gets the Release ID to Rollback To
* @ return integer
*/
2014-08-06 19:53:42 +02:00
public function getReleaseId ()
2014-08-06 19:01:39 +02:00
{
2014-08-06 19:53:42 +02:00
return $this -> getConfig () -> getReleaseId ();
2014-08-06 19:01:39 +02:00
}
/**
* Performs a Rollback Operation
* @ see \Mage\Task\AbstractTask :: run ()
*/
public function run ()
{
2014-10-11 18:43:57 +02:00
if ( $this -> getConfig () -> release ( 'enabled' , false ) === true ) {
2014-08-06 19:01:39 +02:00
$releasesDirectory = $this -> getConfig () -> release ( 'directory' , 'releases' );
$symlink = $this -> getConfig () -> release ( 'symlink' , 'current' );
2015-01-12 18:50:32 +01:00
if ( substr ( $symlink , 0 , 1 ) == '/' ) {
$releasesDirectory = rtrim ( $this -> getConfig () -> deployment ( 'to' ), '/' ) . '/' . $releasesDirectory ;
}
2014-08-06 19:01:39 +02:00
$output = '' ;
$result = $this -> runCommandRemote ( 'ls -1 ' . $releasesDirectory , $output );
$releases = ( $output == '' ) ? array () : explode ( PHP_EOL , $output );
if ( count ( $releases ) == 0 ) {
2014-11-01 22:31:04 +01:00
Console :: output ( 'Release are not available for <bold>' . $this -> getConfig () -> getHost () . '</bold> ... <red>FAIL</red>' );
2014-08-06 19:01:39 +02:00
} else {
rsort ( $releases );
2014-11-12 23:07:20 +01:00
$deleteCurrent = $this -> getConfig () -> getParameter ( 'deleteCurrent' ,
$this -> getConfig () -> deployment ( 'delete-on-rollback' ,
$this -> getConfig () -> general ( 'delete-on-rollback' , false )
)
);
2014-08-06 19:01:39 +02:00
$releaseIsAvailable = false ;
2014-08-06 19:53:42 +02:00
if ( $this -> getReleaseId () == '' ) {
2014-08-06 19:01:39 +02:00
$releaseId = $releases [ 0 ];
$releaseIsAvailable = true ;
2014-08-06 19:53:42 +02:00
} else if ( $this -> getReleaseId () <= 0 ) {
$index = $this -> getReleaseId () * - 1 ;
2014-08-06 19:01:39 +02:00
if ( isset ( $releases [ $index ])) {
$releaseId = $releases [ $index ];
$releaseIsAvailable = true ;
}
} else {
2014-08-06 19:53:42 +02:00
if ( in_array ( $this -> getReleaseId (), $releases )) {
$releaseId = $this -> getReleaseId ();
2014-08-06 19:01:39 +02:00
$releaseIsAvailable = true ;
}
}
if ( ! $releaseIsAvailable ) {
2014-11-01 22:31:04 +01:00
Console :: output ( 'Release <bold>' . $this -> getReleaseId () . '</bold> is invalid or unavailable for <bold>' . $this -> getConfig () -> getHost () . '</bold> ... <red>FAIL</red>' );
2014-08-06 19:01:39 +02:00
} else {
2014-11-01 22:31:04 +01:00
Console :: output ( 'Rollback release on <bold>' . $this -> getConfig () -> getHost () . '</bold>' );
2014-08-06 19:01:39 +02:00
$rollbackTo = $releasesDirectory . '/' . $releaseId ;
2014-08-06 20:03:53 +02:00
// Get Current Release
if ( $deleteCurrent ) {
$result = $this -> runCommandRemote ( 'ls -l ' . $symlink , $output ) && $result ;
$currentRelease = explode ( '/' , $output );
$currentRelease = trim ( array_pop ( $currentRelease ));
}
2014-08-06 19:01:39 +02:00
// 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 <purple>' . $task -> getName () . '</purple> ... ' , 2 , false );
if ( $task instanceOf RollbackAware ) {
2014-08-06 19:17:26 +02:00
/* @var $task AbstractTask */
2014-08-06 19:01:39 +02:00
$tasks ++ ;
$result = $task -> run ();
2014-10-11 18:43:57 +02:00
if ( $result === true ) {
2014-08-06 19:01:39 +02:00
Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
} else {
Console :: output ( '<red>FAIL</red>' , 0 );
}
} else {
Console :: output ( '<yellow>SKIPPED</yellow>' , 0 );
}
}
// Changing Release
Console :: output ( 'Running <purple>Rollback Release [id=' . $releaseId . ']</purple> ... ' , 2 , false );
$userGroup = '' ;
$resultFetch = $this -> runCommandRemote ( 'ls -ld ' . $rollbackTo . ' | awk \'{print \$3":"\$4}\'' , $userGroup );
2015-01-09 17:27:14 +01:00
$tmplink = $rollbackTo . '.tmp' ;
$command = 'ln -sfn ' . $currentCopy . ' ' . $tmplink
2014-08-06 20:03:53 +02:00
. ' && '
2015-01-09 17:27:14 +01:00
. 'mv -T ' . $tmplink . ' ' . $symlink ;
2014-08-06 19:01:39 +02:00
if ( $resultFetch ) {
$command .= ' && chown -h ' . $userGroup . ' ' . $symlink ;
}
$result = $this -> runCommandRemote ( $command );
if ( $result ) {
Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
2014-08-06 20:03:53 +02:00
// Delete Old Current Release
if ( $deleteCurrent && $currentRelease ) {
$this -> runCommandRemote ( 'rm -rf ' . $releasesDirectory . '/' . $currentRelease , $output );
}
2014-08-06 19:01:39 +02:00
} else {
Console :: output ( '<red>FAIL</red>' , 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 <purple>' . $task -> getName () . '</purple> ... ' , 2 , false );
if ( $task instanceOf RollbackAware ) {
2014-08-06 19:17:26 +02:00
/* @var $task AbstractTask */
2014-08-06 19:01:39 +02:00
$tasks ++ ;
$result = $task -> run ();
2014-10-11 18:43:57 +02:00
if ( $result === true ) {
2014-08-06 19:01:39 +02:00
Console :: output ( '<green>OK</green>' , 0 );
$completedTasks ++ ;
} else {
Console :: output ( '<red>FAIL</red>' , 0 );
}
} else {
Console :: output ( '<yellow>SKIPPED</yellow>' , 0 );
}
}
if ( $completedTasks == $tasks ) {
$tasksColor = 'green' ;
} else {
$tasksColor = 'red' ;
}
2014-11-01 22:31:04 +01:00
Console :: output ( 'Release rollback on <bold>' . $this -> getConfig () -> getHost () . '</bold> compted: <' . $tasksColor . '>' . $completedTasks . '/' . $tasks . '</' . $tasksColor . '> tasks done.' , 1 , 3 );
2014-08-06 19:01:39 +02:00
}
}
return $result ;
} else {
return false ;
}
}
2014-10-11 19:07:36 +02:00
}