diff --git a/src/PHPCensor/BuildFactory.php b/src/PHPCensor/BuildFactory.php index c7e8428a..8d427c8c 100644 --- a/src/PHPCensor/BuildFactory.php +++ b/src/PHPCensor/BuildFactory.php @@ -66,6 +66,9 @@ class BuildFactory case 'svn': $type = 'SubversionBuild'; break; + case 'gogs': + $type = 'GogsBuild'; + break; default: return $build; } diff --git a/src/PHPCensor/Controller/ProjectController.php b/src/PHPCensor/Controller/ProjectController.php index 4d38b86d..2c136ff2 100644 --- a/src/PHPCensor/Controller/ProjectController.php +++ b/src/PHPCensor/Controller/ProjectController.php @@ -276,9 +276,9 @@ class ProjectController extends PHPCensor\Controller $values['key'] = $values['ssh_private_key']; $values['pubkey'] = $values['ssh_public_key']; - if ($values['type'] == "gitlab") { - $accessInfo = $project->getAccessInformation(); - $reference = $accessInfo["user"].'@'.$accessInfo["domain"].':' . $accessInfo["port"] . '/' . ltrim($project->getReference(), '/') . ".git"; + if ($values['type'] == 'gitlab') { + $accessInfo = $project->getAccessInformation(); + $reference = $accessInfo["user"] . '@' . $accessInfo["domain"] . ':' . $accessInfo["port"] . '/' . ltrim($project->getReference(), '/') . ".git"; $values['reference'] = $reference; } @@ -332,17 +332,18 @@ class ProjectController extends PHPCensor\Controller $options = [ 'choose' => Lang::get('select_repository_type'), - 'github' => Lang::get('github'), - 'bitbucket' => Lang::get('bitbucket'), - 'gitlab' => Lang::get('gitlab'), - 'remote' => Lang::get('remote'), + 'github' => 'GitHub', + 'bitbucket' => 'Bitbucket', + 'gitlab' => 'GitLab', + 'gogs' => 'Gogs', + 'remote' => 'Git', 'local' => Lang::get('local'), - 'hg' => Lang::get('hg'), - 'svn' => Lang::get('svn'), + 'hg' => 'Mercurial (Hg)', + 'svn' => 'SVN', ]; $field = Form\Element\Select::create('type', Lang::get('where_hosted'), true); - $field->setPattern('^(github|bitbucket|gitlab|remote|local|hg|svn)'); + $field->setPattern('^(github|bitbucket|gitlab|gogs|remote|local|hg|svn)'); $field->setOptions($options); $field->setClass('form-control')->setContainerClass('form-group'); $form->addField($field); diff --git a/src/PHPCensor/Controller/WebhookController.php b/src/PHPCensor/Controller/WebhookController.php index 8621d93e..1a883ebd 100644 --- a/src/PHPCensor/Controller/WebhookController.php +++ b/src/PHPCensor/Controller/WebhookController.php @@ -1,13 +1,5 @@ - * @author Sami Tikka - * @author Alex Russell - * @author Guillaume Perréal - * @package PHPCI - * @subpackage Web + * @author Dan Cryer + * @author Sami Tikka + * @author Alex Russell + * @author Guillaume Perréal * - * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class WebhookController extends Controller { @@ -91,8 +80,8 @@ class WebhookController extends Controller */ public function bitbucket($projectId) { - $project = $this->fetchProject($projectId, 'bitbucket'); - + $project = $this->fetchProject($projectId, ['bitbucket', 'remote']); + // Support both old services and new webhooks if ($payload = $this->getParam('payload')) { return $this->bitbucketService(json_decode($payload, true), $project); @@ -194,7 +183,7 @@ class WebhookController extends Controller */ public function github($projectId) { - $project = $this->fetchProject($projectId, 'github'); + $project = $this->fetchProject($projectId, ['github', 'remote']); switch ($_SERVER['CONTENT_TYPE']) { case 'application/json': @@ -225,9 +214,8 @@ class WebhookController extends Controller * * @param Project $project * @param array $payload - * @param b8\Http\Response\JsonResponse $response * - * @return b8\Http\Response\JsonResponse + * @return array */ protected function githubCommitRequest(Project $project, array $payload) { @@ -358,7 +346,7 @@ class WebhookController extends Controller */ public function gitlab($projectId) { - $project = $this->fetchProject($projectId, 'gitlab'); + $project = $this->fetchProject($projectId, ['gitlab', 'remote']); $payloadString = file_get_contents("php://input"); $payload = json_decode($payloadString, true); @@ -424,6 +412,72 @@ class WebhookController extends Controller return $this->createBuild($project, $commit, $branch, $committer, $commitMessage); } + /** + * Called by Gogs Webhooks: + * + * @param string $projectId + * + * @return array + */ + public function gogs($projectId) + { + $project = $this->fetchProject($projectId, ['gogs', 'remote']); + switch ($_SERVER['CONTENT_TYPE']) { + case 'application/json': + $payload = json_decode(file_get_contents('php://input'), true); + break; + case 'application/x-www-form-urlencoded': + $payload = json_decode($this->getParam('payload'), true); + break; + default: + return ['status' => 'failed', 'error' => 'Content type not supported.', 'responseCode' => 401]; + } + + // Handle Push web hooks: + if (array_key_exists('commits', $payload)) { + return $this->gogsCommitRequest($project, $payload); + } + + return ['status' => 'ignored', 'message' => 'Unusable payload.']; + } + + /** + * Handle the payload when Gogs sends a commit webhook. + * + * @param Project $project + * @param array $payload + * + * @return array + */ + protected function gogsCommitRequest(Project $project, array $payload) + { + if (isset($payload['commits']) && is_array($payload['commits'])) { + // If we have a list of commits, then add them all as builds to be tested: + $results = []; + $status = 'failed'; + foreach ($payload['commits'] as $commit) { + try { + $branch = str_replace('refs/heads/', '', $payload['ref']); + $committer = $commit['author']['email']; + $results[$commit['id']] = $this->createBuild( + $project, + $commit['id'], + $branch, + $committer, + $commit['message'] + ); + $status = 'ok'; + } catch (Exception $ex) { + $results[$commit['id']] = ['status' => 'failed', 'error' => $ex->getMessage()]; + } + } + + return ['status' => $status, 'commits' => $results]; + } + + return ['status' => 'ignored', 'message' => 'Unusable payload.']; + } + /** * Wrapper for creating a new build. * diff --git a/src/PHPCensor/Helper/BaseCommandExecutor.php b/src/PHPCensor/Helper/BaseCommandExecutor.php index 5b41d40e..023707a6 100644 --- a/src/PHPCensor/Helper/BaseCommandExecutor.php +++ b/src/PHPCensor/Helper/BaseCommandExecutor.php @@ -78,7 +78,8 @@ abstract class BaseCommandExecutor implements CommandExecutorInterface $this->lastOutput = []; $command = call_user_func_array('sprintf', $args); - $this->logger->logDebug($command); + $this->logger->logDebug('Command: ' . $command); + $this->logger->logDebug('Args: ' . json_encode($args)); if ($this->quiet) { $this->logger->log('Executing: ' . $command); diff --git a/src/PHPCensor/Model/Build/BitbucketBuild.php b/src/PHPCensor/Model/Build/BitbucketBuild.php index bc8e4bf1..3a7a57d7 100644 --- a/src/PHPCensor/Model/Build/BitbucketBuild.php +++ b/src/PHPCensor/Model/Build/BitbucketBuild.php @@ -1,22 +1,12 @@ -* @package PHPCI -* @subpackage Core -*/ + * Bitbucket Build Model + * + * @author Dan Cryer + */ class BitbucketBuild extends RemoteGitBuild { /** diff --git a/src/PHPCensor/Model/Build/GithubBuild.php b/src/PHPCensor/Model/Build/GithubBuild.php index daccdb48..63af9fe1 100644 --- a/src/PHPCensor/Model/Build/GithubBuild.php +++ b/src/PHPCensor/Model/Build/GithubBuild.php @@ -1,11 +1,4 @@ -* @package PHPCI -* @subpackage Core -*/ + * Github Build Model + * + * @author Dan Cryer + */ class GithubBuild extends RemoteGitBuild { /** diff --git a/src/PHPCensor/Model/Build/GitlabBuild.php b/src/PHPCensor/Model/Build/GitlabBuild.php index aa5570e8..35525b37 100644 --- a/src/PHPCensor/Model/Build/GitlabBuild.php +++ b/src/PHPCensor/Model/Build/GitlabBuild.php @@ -1,20 +1,12 @@ -* @package PHPCI -* @subpackage Core -*/ + * Gitlab Build Model + * + * @author André Cianfarani + */ class GitlabBuild extends RemoteGitBuild { diff --git a/src/PHPCensor/Model/Build/GogsBuild.php b/src/PHPCensor/Model/Build/GogsBuild.php new file mode 100644 index 00000000..f2a76c8c --- /dev/null +++ b/src/PHPCensor/Model/Build/GogsBuild.php @@ -0,0 +1,10 @@ + -* @package PHPCI -* @subpackage Core -*/ + * Local Build Model + * + * @author Dan Cryer + */ class LocalBuild extends Build { /** diff --git a/src/PHPCensor/Model/Build/MercurialBuild.php b/src/PHPCensor/Model/Build/MercurialBuild.php index d47946b7..10ac6623 100644 --- a/src/PHPCensor/Model/Build/MercurialBuild.php +++ b/src/PHPCensor/Model/Build/MercurialBuild.php @@ -1,11 +1,4 @@ - * @package PHPCI - * @subpackage Core + * + * @author Pavel Gopanenko */ class MercurialBuild extends Build { diff --git a/src/PHPCensor/Model/Build/RemoteGitBuild.php b/src/PHPCensor/Model/Build/RemoteGitBuild.php index fea49cee..780e929a 100644 --- a/src/PHPCensor/Model/Build/RemoteGitBuild.php +++ b/src/PHPCensor/Model/Build/RemoteGitBuild.php @@ -1,11 +1,4 @@ -* @package PHPCI -* @subpackage Core -*/ + * Remote Git Build Model + * + * @author Dan Cryer + */ class RemoteGitBuild extends Build { /** diff --git a/src/PHPCensor/Model/Build/SubversionBuild.php b/src/PHPCensor/Model/Build/SubversionBuild.php index 9eb5586f..75330a9e 100644 --- a/src/PHPCensor/Model/Build/SubversionBuild.php +++ b/src/PHPCensor/Model/Build/SubversionBuild.php @@ -1,11 +1,4 @@ - * @package PHPCI - * @subpackage Core + * + * @author Nadir Dzhilkibaev */ class SubversionBuild extends Build {