diff --git a/composer.json b/composer.json index 58d0908..597d31a 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ "require": { "php": ">=5.6.0", "illuminate/support": "~5.2", - "laravelcollective/remote": "5.4.*" + "laravelcollective/remote": "5.4.*", + "composer/semver": "^1.4" }, "require-dev": { "sebastiaanluca/laravel-helpers": "^1.0", diff --git a/src/Helpers/Deployer.php b/src/Helpers/Deployer.php index 0ff438a..90bfddc 100644 --- a/src/Helpers/Deployer.php +++ b/src/Helpers/Deployer.php @@ -14,7 +14,7 @@ public static function freshInit(Connection $connection, $stage) { // Init fresh remote repo $connection->define('init', [ - 'cd '.config('laravel-deploy-helper.stages.'.$stage.'.remote.root'), + 'cd ' . config('laravel-deploy-helper.stages.' . $stage . '.remote.root'), 'mkdir releases', 'mkdir patches', 'mkdir shared', @@ -24,22 +24,22 @@ public static function freshInit(Connection $connection, $stage) } /** - * @param \Collective\Remote\Connection $connection - * @param $stage - * @param $branch - * @param $ldh + * @param $stage + * @param $branch + * @param $ldh * - * @return int + * @return array + * @throws \Exception */ public static function doDeploy($stage, $branch, $ldh) { // Some stuff that does not change in runtime $releaseName = time(); - $home = config('laravel-deploy-helper.stages.'.$stage.'.remote.root'); - $shared = config('laravel-deploy-helper.stages.'.$stage.'.shared'); - $commands = config('laravel-deploy-helper.stages.'.$stage.'.commands'); - $versions = config('laravel-deploy-helper.stages.'.$stage.'.config.dependencies'); - $keep = config('laravel-deploy-helper.stages.'.$stage.'.config.keep'); + $home = config('laravel-deploy-helper.stages.' . $stage . '.remote.root'); + $shared = config('laravel-deploy-helper.stages.' . $stage . '.shared'); + $commands = config('laravel-deploy-helper.stages.' . $stage . '.commands'); + $versions = config('laravel-deploy-helper.stages.' . $stage . '.config.dependencies'); + $keep = config('laravel-deploy-helper.stages.' . $stage . '.config.keep'); // Check what releases are old and can be removed // Adding the array fixed #1 @@ -55,75 +55,78 @@ public static function doDeploy($stage, $branch, $ldh) // Check versions // Operators: http://php.net/manual/en/function.version-compare.php - verbose('['.$stage.'] Checking dependencies. Might take a minute.'); + verbose('[' . $stage . '] Checking dependencies. Might take a minute.'); foreach ($versions as $app => $version) { - SSH::checkAppVersion($connection, $app, $version); + if (SSH::checkAppVersion($connection, $app, $version) == '-1') { + throw new \Exception('Version of ' . $app . ' does not match your requirements'); + } } - // Define the deploy - verbose('['.$stage.'] Creating new release directory and pulling from remote'); + return $ldh; - $url = config('laravel-deploy-helper.stages.'.$stage.'.git.http'); + // Define the deploy + verbose('[' . $stage . '] Creating new release directory and pulling from remote'); // Fixes https://github.com/DALTCORE/laravel-deploy-helper/issues/6#issuecomment-315124310 + $url = config('laravel-deploy-helper.stages.' . $stage . '.git.http'); if ($url === null) { - $url = config('laravel-deploy-helper.stages.'.$stage.'.git'); + $url = config('laravel-deploy-helper.stages.' . $stage . '.git'); } SSH::execute($stage, [ - 'mkdir '.$home.'/releases/'.$releaseName, - 'cd '.$home.'/releases/'.$releaseName, - 'git clone -b '.$branch.' '."'".$url."'".' .', + 'mkdir ' . $home . '/releases/' . $releaseName, + 'cd ' . $home . '/releases/' . $releaseName, + 'git clone -b ' . $branch . ' ' . "'" . $url . "'" . ' .', ]); // Pre-flight for shared stuff $items['directories'] = []; foreach ($shared['directories'] as $share) { - verbose('['.$stage.'] About to share directory "'.$home.'/current/'.$share.'"'); - $items['directories'][] = '[ -e '.$home.'/current/'.$share.' ] && cp -R -p '.$home.'/current/' - .$share.' '.$home.'/shared/'.$share; - $items['directories'][] = '[ -e '.$home.'/shared/'.$share.' ] && cp -R -p '.$home.'/shared/'. - $share.' '.$home.'/releases/'.$releaseName; + verbose('[' . $stage . '] About to share directory "' . $home . '/current/' . $share . '"'); + $items['directories'][] = '[ -e ' . $home . '/current/' . $share . ' ] && cp -R -p ' . $home . '/current/' + . $share . ' ' . $home . '/shared/' . $share; + $items['directories'][] = '[ -e ' . $home . '/shared/' . $share . ' ] && cp -R -p ' . $home . '/shared/' . + $share . ' ' . $home . '/releases/' . $releaseName; } // Pre-flight for shared stuff $items['files'] = []; foreach ($shared['files'] as $share) { - verbose('['.$stage.'] About to share file "'.$home.'/current/'.$share.'"'); - $items['files'][] = '[ -e '.$home.'/current/'.$share.' ] && cp -p '.$home.'/current/'.$share - .' '.$home.'/shared/'.$share; - $items['files'][] = '[ -e '.$home.'/shared/'.$share.' ] && cp -p '.$home.'/shared/'.$share. - ' '.$home.'/releases/'.$releaseName.'/'.$share; + verbose('[' . $stage . '] About to share file "' . $home . '/current/' . $share . '"'); + $items['files'][] = '[ -e ' . $home . '/current/' . $share . ' ] && cp -p ' . $home . '/current/' . $share + . ' ' . $home . '/shared/' . $share; + $items['files'][] = '[ -e ' . $home . '/shared/' . $share . ' ] && cp -p ' . $home . '/shared/' . $share . + ' ' . $home . '/releases/' . $releaseName . '/' . $share; } // Define shared files - verbose('['.$stage.'] Syncing shared files'); + verbose('[' . $stage . '] Syncing shared files'); SSH::execute($stage, $items['files']); // Define shared directories - verbose('['.$stage.'] Syncing shared directories'); + verbose('[' . $stage . '] Syncing shared directories'); SSH::execute($stage, $items['directories']); $items = []; foreach ($commands as $command) { - $items[] = 'cd '.$home.'/releases/'.$releaseName.' && '.$command; + $items[] = 'cd ' . $home . '/releases/' . $releaseName . ' && ' . $command; } // Define commands - verbose('['.$stage.'] Executing custom commands'); + verbose('[' . $stage . '] Executing custom commands'); SSH::execute($stage, $items); // Define post deploy actions - verbose('['.$stage.'] Linking new release to /current directory and removing temp'); + verbose('[' . $stage . '] Linking new release to /current directory and removing temp'); SSH::execute($stage, [ - 'ln -sfn '.$home.'/releases/'.$releaseName.' '.$home.'/current', - 'rm -rf '.$home.'/shared/*', + 'ln -sfn ' . $home . '/releases/' . $releaseName . ' ' . $home . '/current', + 'rm -rf ' . $home . '/shared/*', ]); // Remove old deploys if (isset($toRemove) && is_array($toRemove)) { $items = []; foreach ($toRemove as $dir => $val) { - $items[] = 'echo "Removing release '.$dir.'" && rm -rf '.$home.'/releases/'.$dir; + $items[] = 'echo "Removing release ' . $dir . '" && rm -rf ' . $home . '/releases/' . $dir; } - verbose('['.$stage.'] Cleaning up old releases'); + verbose('[' . $stage . '] Cleaning up old releases'); SSH::execute($stage, $items); } @@ -137,15 +140,15 @@ public static function doDeploy($stage, $branch, $ldh) */ public static function doRollback(Connection $connection, $stage, $ldh, $dirs) { - $home = config('laravel-deploy-helper.stages.'.$stage.'.remote.root'); + $home = config('laravel-deploy-helper.stages.' . $stage . '.remote.root'); // Define post deploy actions $connection->define('preformRollback', [ - 'ln -sfn '.$home.'/releases/'.$dirs[1].' '.$home.'/current', - 'rm -rf '.$home.'/releases/'.$dirs[0], + 'ln -sfn ' . $home . '/releases/' . $dirs[1] . ' ' . $home . '/current', + 'rm -rf ' . $home . '/releases/' . $dirs[0], ]); - verbose("\t".'Hold my beer, We\'re rolling back'); + verbose("\t" . 'Hold my beer, We\'re rolling back'); $connection->task('preformRollback'); unset($dirs[0]); @@ -165,13 +168,13 @@ public static function doRollback(Connection $connection, $stage, $ldh, $dirs) */ public static function doPatch($stage, $branch) { - $home = config('laravel-deploy-helper.stages.'.$stage.'.remote.root'); + $home = config('laravel-deploy-helper.stages.' . $stage . '.remote.root'); // setup ssh connection to remote $connection = SSH::instance()->into($stage); $connection->define('preformPatch', [ - Command::builder('cd', [$home.'/current']), + Command::builder('cd', [$home . '/current']), Command::builder('ls', ['-haml']), Command::builder('git', ['config', 'user.email', 'git+LDH@localhost.ext']), @@ -179,12 +182,12 @@ public static function doPatch($stage, $branch) Command::builder('git', ['fetch']), Command::builder('git', - ['format-patch', '-1', 'origin/'.$branch, 'FETCH_HEAD', '-o', $home.'/patches']), - 'git apply --reject --whitespace=fix '.$home.'/patches/*', - Command::builder('rm', ['-rf', $home.'/patches']), + ['format-patch', '-1', 'origin/' . $branch, 'FETCH_HEAD', '-o', $home . '/patches']), + 'git apply --reject --whitespace=fix ' . $home . '/patches/*', + Command::builder('rm', ['-rf', $home . '/patches']), ]); - verbose("\t".'Hold on tight, trying to patch!'); + verbose("\t" . 'Hold on tight, trying to patch!'); $connection->task('preformPatch'); } } diff --git a/src/Helpers/SSH.php b/src/Helpers/SSH.php index f6f9d7f..797680b 100644 --- a/src/Helpers/SSH.php +++ b/src/Helpers/SSH.php @@ -3,6 +3,7 @@ namespace DALTCORE\LaravelDeployHelper\Helpers; use Collective\Remote\Connection; +use Composer\Semver\Semver; use DALTCORE\LaravelDeployHelper\Remote\RemoteManager; class SSH @@ -22,7 +23,7 @@ public static function instance() */ public static function home($stage) { - return config('laravel-deploy-helper.stages.'.$stage.'.remote.root'); + return config('laravel-deploy-helper.stages.' . $stage . '.remote.root'); } /** @@ -86,7 +87,7 @@ public static function checkAppVersion(Connection $connection, $app, $requestedV if ($requestedVersion === true) { $connection->run(Command::builder($app, []), function ($response) use ($app) { if (stripos($response, 'command not found') !== false) { - throw new \Exception('ERROR: '.$app.' is not installed on the server.'); + throw new \Exception('ERROR: ' . $app . ' is not installed on the server.'); } }); verbose("\t => Checking $app is available"); @@ -99,13 +100,13 @@ public static function checkAppVersion(Connection $connection, $app, $requestedV */ $connection->run(Command::builder($app, []), function ($response) use ($app) { if (stripos($response, 'command not found') !== false) { - throw new \Exception('ERROR: '.$app.' is not installed on the server.'); + throw new \Exception('ERROR: ' . $app . ' is not installed on the server.'); } }); verbose("\t => Checking $app version $currVer $operator $version"); - return version_compare($currVer, $version, $operator); + return (!empty(Semver::satisfies($version, $requestedVersion))); } /** @@ -140,9 +141,9 @@ public static function preFlight($instance, $stage, $branch = false) if ($stage === null) { throw new \Exception('The argument "--stage=" is required!', 128); } else { - if (!is_array(config('laravel-deploy-helper.stages.'.$stage))) { - throw new \Exception('The stage "'.$stage - .'" does not exist!', 128); + if (!is_array(config('laravel-deploy-helper.stages.' . $stage))) { + throw new \Exception('The stage "' . $stage + . '" does not exist!', 128); } } @@ -152,13 +153,13 @@ public static function preFlight($instance, $stage, $branch = false) } if (in_array($branch, Git::getBranches()) == false) { - throw new \Exception('The branch "'.$branch - .'" does not exists locally? Please `git pull`!', 128); + throw new \Exception('The branch "' . $branch + . '" does not exists locally? Please `git pull`!', 128); } } // Connecting to remote server - verbose('['.$stage.'] Trying to login into remote SSH'); + verbose('[' . $stage . '] Trying to login into remote SSH'); $ssh = self::instance()->into($stage); // Check for lockfile @@ -168,22 +169,22 @@ public static function preFlight($instance, $stage, $branch = false) } // Trying to read file - verbose('['.$stage.'] Reading config file from remote server'); - $config = $ssh->exists(self::home($stage).'/ldh.json'); + verbose('[' . $stage . '] Reading config file from remote server'); + $config = $ssh->exists(self::home($stage) . '/ldh.json'); // Check if config exists if ($config == false) { - error('['.$stage.'] ldh.json does not exists.'); + error('[' . $stage . '] ldh.json does not exists.'); if ($instance->confirm('Do you want to initialize LDH here?')) { Deployer::freshInit($ssh, $stage); } else { return false; } } else { - verbose('['.$stage.'] Found config. Checking directories.'); - $config = $ssh->getString(self::home($stage).'/ldh.json'); + verbose('[' . $stage . '] Found config. Checking directories.'); + $config = $ssh->getString(self::home($stage) . '/ldh.json'); if ($config == false) { - error('['.$stage.'] Config file is empty... Something is wrong.'); + error('[' . $stage . '] Config file is empty... Something is wrong.'); return false; } @@ -201,6 +202,6 @@ public static function performLanding($stage) { $ssh = self::instance()->into($stage); Locker::unlock($ssh, $stage); - verbose('['.$stage.'] Changes are successfull!'); + verbose('[' . $stage . '] Changes are successfull!'); } } diff --git a/src/Helpers/helpers.php b/src/Helpers/helpers.php index 8f3723e..b395a07 100644 --- a/src/Helpers/helpers.php +++ b/src/Helpers/helpers.php @@ -15,7 +15,7 @@ function verbose($message) { $console = new ConsoleOutput(); $console->getFormatter()->setStyle('info', new OutputFormatterStyle('blue', null)); - $console->writeln(''.$message.''); + $console->writeln('' . $message . ''); } } @@ -31,7 +31,7 @@ function error($message) { $console = new ConsoleOutput(); $console->getFormatter()->setStyle('error', new OutputFormatterStyle('white', 'red')); - $console->writeln(''.$message.''); + $console->writeln('' . $message . ''); } } @@ -55,6 +55,6 @@ function cli_header() \t\________|\_______/ \__| \__| \t Laravel Deploy Helper \tRamon Smit -\t\t 1.1.2\n"; +\t\t 1.1.3\n"; } }