Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/en/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Plugins
* [IRC](plugins/irc.md) - `irc`
* [Lint](plugins/lint.md) - `lint`
* [Mage](plugins/mage.md) - `mage`
* [Mage v3](plugins/mage3.md) - `mage3`
* [MySQL](plugins/mysql.md) - `mysql`
* [Package Build](plugins/package_build.md) - `package_build`
* [PDepend](plugins/pdepend.md) - `pdepend`
Expand Down
32 changes: 32 additions & 0 deletions docs/en/plugins/mage3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
Plugin Mage v3
==============

Triggers a deployment of the project to run via [Mage v3](https://github.com/andres-montanez/Magallanes)

Configuration
-------------

### Options

* **env** [required, string] - The environment name

### Examples

```yaml
deploy:
mage3:
env: production
```

### Options for config.yml

* **bin** [optional, string] - The mage executable path
* **log_dir** [optional, string] - The mage logs path

### Examples

```yaml
mage:
bin: /usr/local/bin/mage
log_dir: ./var/log
```
121 changes: 121 additions & 0 deletions src/PHPCensor/Plugin/Mage3.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?php
/**
* PHPCensor - Continuous Integration for PHP
*/

namespace PHPCensor\Plugin;

use PHPCensor\Builder;
use PHPCensor\Model\Build;
use Psr\Log\LogLevel;
use \PHPCensor\Plugin;

/**
* Integrates PHPCensor with Mage v3: https://github.com/andres-montanez/Magallanes
* @package PHPCensor
* @subpackage Plugins
*/
class Mage3 extends Plugin
{
protected $mage_bin = 'mage';
protected $mage_env;
protected $mage_log_dir;

/**
* {@inheritdoc}
*/
public static function pluginName()
{
return 'mage3';
}

/**
* {@inheritdoc}
*/
public function __construct(Builder $builder, Build $build, array $options = [])
{
parent::__construct($builder, $build, $options);

$config = $builder->getSystemConfig('mage3');
if (!empty($config['bin'])) {
$this->mage_bin = $config['bin'];
}

if (isset($options['env'])) {
$this->mage_env = $builder->interpolate($options['env']);
}

if (isset($options['log_dir'])) {
$this->mage_log_dir = $builder->interpolate($options['log_dir']);
}
}

/**
* {@inheritdoc}
*/
public function execute()
{
if (empty($this->mage_env)) {
$this->builder->logFailure('You must specify environment.');
return false;
}

$result = $this->builder->executeCommand($this->mage_bin . ' -n deploy ' . $this->mage_env);

try {
$this->builder->log('########## MAGE LOG BEGIN ##########');
$this->builder->log($this->getMageLog());
$this->builder->log('########## MAGE LOG END ##########');
} catch (\Exception $e) {
$this->builder->log($e->getMessage(), LogLevel::NOTICE);
}

return $result;
}

/**
* Get mage log lines
* @return array
* @throws \Exception
*/
protected function getMageLog()
{
$logs_dir = $this->build->getBuildPath() . (!empty($this->mage_log_dir) ? '/' . $this->mage_log_dir : '');
if (!is_dir($logs_dir)) {
throw new \Exception('Log directory not found');
}

$list = scandir($logs_dir);
if ($list === false) {
throw new \Exception('Log dir read fail');
}

$list = array_filter($list, function ($name) {
return preg_match('/^\d+_\d+\.log$/', $name);
});
if (empty($list)) {
throw new \Exception('Log dir filter fail');
}

$res = sort($list);
if ($res === false) {
throw new \Exception('Logs sort fail');
}

$last_log_file = end($list);
if ($last_log_file === false) {
throw new \Exception('Get last Log name fail');
}

$log_content = file_get_contents($logs_dir . '/' . $last_log_file);
if ($log_content === false) {
throw new \Exception('Get last Log content fail');
}

$lines = explode("\n", $log_content);
$lines = array_map('trim', $lines);
$lines = array_filter($lines);

return $lines;
}
}