Giving plugins an isAllowedInStage() method to protect them from being run at inappropriate times.

Fixes #1122
Fixes #1090
This commit is contained in:
Dan Cryer 2015-11-12 14:41:39 +00:00
parent b24b01ec65
commit 9dcb29af5d
42 changed files with 196 additions and 41 deletions

View file

@ -15,5 +15,6 @@ namespace PHPCI;
*/
interface Plugin
{
public function isAllowedInStage($stage);
public function execute();
}

View file

@ -0,0 +1,31 @@
<?php
namespace PHPCI\Plugin;
use PHPCI\Plugin;
abstract class AbstractPlugin implements Plugin
{
/**
* Define the stages that this plugin is allowed to run in.
* @see AbstractPlugin::canExecute()
* @var array
*/
protected $allowedStages = array('setup', 'test', 'complete', 'success', 'failure', 'fixed', 'broken');
/**
* Verify whether or not this plugin is allowed to execute in a given stage.
* @param string $stage
* @return bool
*/
public function isAllowedInStage($stage)
{
return in_array($stage, $this->allowedStages);
}
/**
* Execute the plugin and return its success or failure.
* @return bool
*/
abstract public function execute();
}

View file

@ -17,8 +17,13 @@ use PHPCI\Model\Build;
* Atoum plugin, runs Atoum tests within a project.
* @package PHPCI\Plugin
*/
class Atoum implements \PHPCI\Plugin
class Atoum extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
private $args;
private $config;
private $directory;

View file

@ -20,8 +20,13 @@ use PHPCI\Model\BuildError;
* @package PHPCI
* @subpackage Plugins
*/
class Behat implements \PHPCI\Plugin
class Behat extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $phpci;
protected $build;
protected $features;

View file

@ -20,8 +20,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Campfire implements \PHPCI\Plugin
class Campfire extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
private $url;
private $authToken;
private $userAgent;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class CleanBuild implements \PHPCI\Plugin
class CleanBuild extends AbstractPlugin
{
protected $remove;
protected $phpci;

View file

@ -14,6 +14,7 @@ use PHPCI\Helper\Lang;
use PHPCI\Model\Build;
use PHPCI\Plugin\Util\TestResultParsers\Codeception as Parser;
use Psr\Log\LogLevel;
use PHPCI\ZeroConfigPlugin;
/**
* Codeception Plugin - Enables full acceptance, unit, and functional testing.
@ -23,8 +24,13 @@ use Psr\Log\LogLevel;
* @package PHPCI
* @subpackage Plugins
*/
class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin
class Codeception extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** @var string */
protected $args = '';

View file

@ -13,6 +13,7 @@ use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\Helper\Lang;
use PHPCI\ZeroConfigPlugin;
/**
* Composer Plugin - Provides access to Composer functionality.
@ -20,7 +21,7 @@ use PHPCI\Helper\Lang;
* @package PHPCI
* @subpackage Plugins
*/
class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class Composer extends AbstractPlugin implements ZeroConfigPlugin
{
protected $directory;
protected $action;

View file

@ -19,7 +19,7 @@ use PHPCI\Helper\Lang;
* @package PHPCI
* @subpackage Plugins
*/
class CopyBuild implements \PHPCI\Plugin
class CopyBuild extends AbstractPlugin
{
protected $directory;
protected $ignore;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Deployer implements \PHPCI\Plugin
class Deployer extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
protected $webhookUrl;
protected $reason;

View file

@ -23,8 +23,13 @@ use Psr\Log\LogLevel;
* @package PHPCI
* @subpackage Plugins
*/
class Email implements \PHPCI\Plugin
class Email extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
/**
* @var \PHPCI\Builder
*/

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Env implements \PHPCI\Plugin
class Env extends AbstractPlugin
{
protected $phpci;
protected $build;

View file

@ -19,8 +19,13 @@ use Mremi\Flowdock\Api\Push\TeamInboxMessage;
* @package PHPCI
* @subpackage Plugins
*/
class FlowdockNotify implements \PHPCI\Plugin
class FlowdockNotify extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
private $api_key;
private $email;
const MESSAGE_DEFAULT = 'Build %BUILD% has finished for commit <a href="%COMMIT_URI%">%SHORT_COMMIT%</a>

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Git implements \PHPCI\Plugin
class Git extends AbstractPlugin
{
protected $phpci;
protected $build;

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Grunt implements \PHPCI\Plugin
class Grunt extends AbstractPlugin
{
protected $directory;
protected $task;

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Gulp implements \PHPCI\Plugin
class Gulp extends AbstractPlugin
{
protected $directory;
protected $task;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class HipchatNotify implements \PHPCI\Plugin
class HipchatNotify extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
protected $authToken;
protected $color;
protected $notify;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Irc implements \PHPCI\Plugin
class Irc extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
protected $phpci;
protected $build;
protected $message;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Lint implements PHPCI\Plugin
class Lint extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $directories;
protected $recursive = true;
protected $ignore;

View file

@ -21,7 +21,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Mysql implements \PHPCI\Plugin
class Mysql extends AbstractPlugin
{
/**
* @var \PHPCI\Builder

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PackageBuild implements \PHPCI\Plugin
class PackageBuild extends AbstractPlugin
{
protected $directory;
protected $filename;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Pdepend implements \PHPCI\Plugin
class Pdepend extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $args;
/**
* @var \PHPCI\Builder

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Pgsql implements \PHPCI\Plugin
class Pgsql extends AbstractPlugin
{
/**
* @var \PHPCI\Builder

View file

@ -10,7 +10,7 @@ use Phar as PHPPhar;
/**
* Phar Plugin
*/
class Phar implements \PHPCI\Plugin
class Phar extends AbstractPlugin
{
/**
* PHPCI

View file

@ -20,7 +20,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Phing implements \PHPCI\Plugin
class Phing extends AbstractPlugin
{
private $directory;

View file

@ -13,6 +13,7 @@ use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\Model\BuildError;
use PHPCI\ZeroConfigPlugin;
/**
* PHP Code Sniffer Plugin - Allows PHP Code Sniffer testing.
@ -20,8 +21,13 @@ use PHPCI\Model\BuildError;
* @package PHPCI
* @subpackage Plugins
*/
class PhpCodeSniffer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class PhpCodeSniffer extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/**
* @var \PHPCI\Builder
*/

View file

@ -20,8 +20,13 @@ use PHPCI\Model\BuildError;
* @package PHPCI
* @subpackage Plugins
*/
class PhpCpd implements \PHPCI\Plugin
class PhpCpd extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $directory;
protected $args;
protected $phpci;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpCsFixer implements \PHPCI\Plugin
class PhpCsFixer extends AbstractPlugin
{
/**
* @var \PHPCI\Builder

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/**
* PHP Docblock Checker Plugin - Checks your PHP files for appropriate uses of Docblocks
@ -19,8 +20,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpDocblockChecker implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class PhpDocblockChecker extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/**
* @var \PHPCI\Builder
*/

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/**
* PHP Loc - Allows PHP Copy / Lines of Code testing.
@ -19,7 +20,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpLoc implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class PhpLoc extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @var string

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/**
* PHP Mess Detector Plugin - Allows PHP Mess Detector testing.
@ -19,8 +20,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpMessDetector implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class PhpMessDetector extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/**
* @var \PHPCI\Builder
*/

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpParallelLint implements \PHPCI\Plugin
class PhpParallelLint extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/**
* @var \PHPCI\Builder
*/

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpSpec implements PHPCI\Plugin
class PhpSpec extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/**
* @var \PHPCI\Builder
*/

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class PhpTalLint implements PHPCI\Plugin
class PhpTalLint extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $directories;
protected $recursive = true;
protected $suffixes;

View file

@ -13,6 +13,7 @@ use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\Plugin\Util\TapParser;
use PHPCI\ZeroConfigPlugin;
/**
* PHP Unit Plugin - Allows PHP Unit testing.
@ -20,8 +21,13 @@ use PHPCI\Plugin\Util\TapParser;
* @package PHPCI
* @subpackage Plugins
*/
class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class PhpUnit extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $args;
protected $phpci;
protected $build;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Shell implements \PHPCI\Plugin
class Shell extends AbstractPlugin
{
/**
* @var \PHPCI\Builder

View file

@ -17,8 +17,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class SlackNotify implements \PHPCI\Plugin
class SlackNotify extends AbstractPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
private $webHook;
private $room;
private $username;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Sqlite implements \PHPCI\Plugin
class Sqlite extends AbstractPlugin
{
/**
* @var \PHPCI\Builder

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/**
* Technical Debt Plugin - Checks for existence of "TODO", "FIXME", etc.
@ -20,8 +21,13 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class TechnicalDebt implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
class TechnicalDebt extends AbstractPlugin implements ZeroConfigPlugin
{
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/**
* @var \PHPCI\Builder
*/

View file

@ -138,7 +138,7 @@ class Executor
$this->setPluginStatus($stage, $plugin, Build::STATUS_RUNNING);
// Try and execute it
if ($this->executePlugin($plugin, $options)) {
if ($this->executePlugin($plugin, $options, $stage)) {
// Execution was successful
$this->logger->logSuccess(Lang::get('plugin_success'));
$this->setPluginStatus($stage, $plugin, Build::STATUS_SUCCESS);
@ -166,8 +166,12 @@ class Executor
/**
* Executes a given plugin, with options and returns the result.
* @param string $plugin Plugin name
* @param array $options Plugin options (from phpci.yml)
* @param string $stage Stage name
* @return bool
*/
public function executePlugin($plugin, $options)
public function executePlugin($plugin, $options, $stage)
{
// Any plugin name without a namespace separator is a PHPCI built in plugin
// if not we assume it's a fully name-spaced class name that implements the plugin interface.
@ -188,6 +192,12 @@ class Executor
try {
// Build and run it
$obj = $this->pluginFactory->buildPlugin($class, $options);
if (!$obj->isAllowedInStage($stage)) {
$this->logger->logFailure('Plugin "' . $plugin . '" cannot be run in stage: ' . $stage);
return false;
}
return $obj->execute();
} catch (\Exception $ex) {
$this->logger->logFailure(Lang::get('exception') . $ex->getMessage(), $ex);

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class Wipe implements \PHPCI\Plugin
class Wipe extends AbstractPlugin
{
/**
* @var \PHPCI\Builder

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI
* @subpackage Plugins
*/
class XMPP implements \PHPCI\Plugin
class XMPP extends AbstractPlugin
{
protected $directory;
protected $phpci;