* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Mage\Command\BuiltIn\Releases; use Mage\Utils; use Mage\Runtime\Exception\RuntimeException; use Symfony\Component\Process\Process; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Mage\Command\AbstractCommand; /** * Command for Listing all Releases * * @author Andrés Montañez */ class ListCommand extends AbstractCommand { /** * Configure the Command */ protected function configure(): void { $this ->setName('releases:list') ->setDescription('List the releases on an environment') ->addArgument('environment', InputArgument::REQUIRED, 'Name of the environment to deploy to'); } /** * Execute the Command */ protected function execute(InputInterface $input, OutputInterface $output): int { $this->requireConfig(); $utils = new Utils(); $output->writeln('Starting Magallanes'); $output->writeln(''); try { $this->runtime->setEnvironment($input->getArgument('environment')); if (!$this->runtime->getEnvOption('releases', false)) { throw new RuntimeException('Releases are not enabled', 70); } $output->writeln(sprintf(' Environment: %s', $this->runtime->getEnvironment())); $this->log(sprintf('Environment: %s', $this->runtime->getEnvironment())); if ($this->runtime->getConfigOption('log_file', false)) { $output->writeln(sprintf(' Logfile: %s', $this->runtime->getConfigOption('log_file'))); } $output->writeln(''); $hosts = $this->runtime->getEnvOption('hosts'); if (!is_array($hosts) && !$hosts instanceof \Countable) { $hosts = []; } if (count($hosts) == 0) { $output->writeln('No hosts defined'); $output->writeln(''); } else { $hostPath = rtrim($this->runtime->getEnvOption('host_path'), '/'); foreach ($hosts as $host) { $this->runtime->setWorkingHost($host); // Get List of Releases $cmdListReleases = sprintf('ls -1 %s/releases', $hostPath); /** @var Process $process */ $process = $this->runtime->runRemoteCommand($cmdListReleases, false); if (!$process->isSuccessful()) { throw new RuntimeException(sprintf('Unable to retrieve releases from host "%s"', $host), 80); } $releases = []; if (trim($process->getOutput()) != '') { $releases = explode("\n", trim($process->getOutput())); rsort($releases); } if (count($releases) == 0) { $output->writeln( sprintf(' No releases available on host %s:', $host) ); } else { // Get Current Release $cmdCurrentRelease = sprintf('readlink -f %s/current', $hostPath); /** @var Process $process */ $process = $this->runtime->runRemoteCommand($cmdCurrentRelease, false); if (!$process->isSuccessful()) { throw new RuntimeException( sprintf('Unable to retrieve current release from host "%s"', $host), 85 ); } $currentReleaseId = explode('/', trim($process->getOutput())); $currentReleaseId = $currentReleaseId[count($currentReleaseId) - 1]; $output->writeln(sprintf(' Releases on host %s:', $host)); foreach ($releases as $releaseId) { $releaseDate = $utils->getReleaseDate($releaseId); $output->write(sprintf( ' Release ID: %s - Date: %s [%s]', $releaseId, $releaseDate->format('Y-m-d H:i:s'), $utils->getTimeDiff($releaseDate) )); if ($releaseId == $currentReleaseId) { $output->writeln(' [current]'); } else { $output->writeln(''); } } } $this->runtime->setWorkingHost(null); $output->writeln(''); } } } catch (RuntimeException $exception) { $output->writeln(sprintf('%s', $exception->getMessage())); $this->statusCode = $exception->getCode(); } $output->writeln('Finished Magallanes'); return intval($this->statusCode); } }