From 31e48efd550e7e72975442fadb228941581c8559 Mon Sep 17 00:00:00 2001 From: Denis Denisov Date: Mon, 6 Feb 2017 19:38:09 +0700 Subject: [PATCH 1/3] Gogs webhook that is based github * https://gogs.io/docs/features/webhook.html --- .../Controller/WebhookController.php | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/PHPCensor/Controller/WebhookController.php b/src/PHPCensor/Controller/WebhookController.php index 8621d93e..ce813e62 100644 --- a/src/PHPCensor/Controller/WebhookController.php +++ b/src/PHPCensor/Controller/WebhookController.php @@ -24,7 +24,7 @@ use b8\HttpClient; use b8\Exception\HttpException\NotFoundException; /** - * Webhook Controller - Processes webhook pings from BitBucket, Github, Gitlab, etc. + * Webhook Controller - Processes webhook pings from BitBucket, Github, Gitlab, Gogs, etc. * * @author Dan Cryer * @author Sami Tikka @@ -92,7 +92,7 @@ class WebhookController extends Controller public function bitbucket($projectId) { $project = $this->fetchProject($projectId, 'bitbucket'); - + // Support both old services and new webhooks if ($payload = $this->getParam('payload')) { return $this->bitbucketService(json_decode($payload, true), $project); @@ -424,6 +424,65 @@ class WebhookController extends Controller return $this->createBuild($project, $commit, $branch, $committer, $commitMessage); } + /** + * Called by Gogs Webhooks: + */ + public function gogs($projectId) + { + $project = $this->fetchProject($projectId, 'gogs'); + 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 array('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 array('status' => 'ignored', 'message' => 'Unusable payload.'); + } + + /** + * Handle the payload when Gogs sends a commit webhook. + * + * @param Project $project + * @param array $payload + * @param b8\Http\Response\JsonResponse $response + * + * @return b8\Http\Response\JsonResponse + */ + 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 = array(); + $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']] = array('status' => 'failed', 'error' => $ex->getMessage()); + } + } + return array('status' => $status, 'commits' => $results); + } + return array('status' => 'ignored', 'message' => 'Unusable payload.'); + } + /** * Wrapper for creating a new build. * From cc618b0c807cd184d09b5580fc8dcfcaf6015e71 Mon Sep 17 00:00:00 2001 From: Dmitry Khomutov Date: Mon, 6 Feb 2017 19:54:44 +0700 Subject: [PATCH 2/3] Gogs webhook fixes. Issue #13 --- .../Controller/WebhookController.php | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/src/PHPCensor/Controller/WebhookController.php b/src/PHPCensor/Controller/WebhookController.php index ce813e62..8d7d7ab5 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 { @@ -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) { @@ -426,6 +414,10 @@ class WebhookController extends Controller /** * Called by Gogs Webhooks: + * + * @param string $projectId + * + * @return array */ public function gogs($projectId) { @@ -438,30 +430,31 @@ class WebhookController extends Controller $payload = json_decode($this->getParam('payload'), true); break; default: - return array('status' => 'failed', 'error' => 'Content type not supported.', 'responseCode' => 401); + 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 array('status' => 'ignored', 'message' => 'Unusable payload.'); + + return ['status' => 'ignored', 'message' => 'Unusable payload.']; } /** * Handle the payload when Gogs sends a commit webhook. * * @param Project $project - * @param array $payload - * @param b8\Http\Response\JsonResponse $response + * @param array $payload * - * @return b8\Http\Response\JsonResponse + * @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 = array(); - $status = 'failed'; + $results = []; + $status = 'failed'; foreach ($payload['commits'] as $commit) { try { $branch = str_replace('refs/heads/', '', $payload['ref']); @@ -475,12 +468,14 @@ class WebhookController extends Controller ); $status = 'ok'; } catch (Exception $ex) { - $results[$commit['id']] = array('status' => 'failed', 'error' => $ex->getMessage()); + $results[$commit['id']] = ['status' => 'failed', 'error' => $ex->getMessage()]; } } - return array('status' => $status, 'commits' => $results); + + return ['status' => $status, 'commits' => $results]; } - return array('status' => 'ignored', 'message' => 'Unusable payload.'); + + return ['status' => 'ignored', 'message' => 'Unusable payload.']; } /** From 9e478fd821e22febb1d1129cd13a3a3217f52c61 Mon Sep 17 00:00:00 2001 From: Dmitry Khomutov Date: Tue, 7 Feb 2017 19:50:09 +0700 Subject: [PATCH 3/3] Fixes for Gogs build and webhook. Issue #13 --- src/PHPCensor/BuildFactory.php | 3 +++ .../Controller/ProjectController.php | 21 ++++++++++--------- .../Controller/WebhookController.php | 8 +++---- src/PHPCensor/Helper/BaseCommandExecutor.php | 3 ++- src/PHPCensor/Model/Build/BitbucketBuild.php | 18 ++++------------ src/PHPCensor/Model/Build/GithubBuild.php | 16 ++++---------- src/PHPCensor/Model/Build/GitlabBuild.php | 16 ++++---------- src/PHPCensor/Model/Build/GogsBuild.php | 10 +++++++++ src/PHPCensor/Model/Build/LocalBuild.php | 16 ++++---------- src/PHPCensor/Model/Build/MercurialBuild.php | 12 ++--------- src/PHPCensor/Model/Build/RemoteGitBuild.php | 16 ++++---------- src/PHPCensor/Model/Build/SubversionBuild.php | 12 ++--------- 12 files changed, 54 insertions(+), 97 deletions(-) create mode 100644 src/PHPCensor/Model/Build/GogsBuild.php 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 8d7d7ab5..1a883ebd 100644 --- a/src/PHPCensor/Controller/WebhookController.php +++ b/src/PHPCensor/Controller/WebhookController.php @@ -80,7 +80,7 @@ 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')) { @@ -183,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': @@ -346,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); @@ -421,7 +421,7 @@ class WebhookController extends Controller */ public function gogs($projectId) { - $project = $this->fetchProject($projectId, 'gogs'); + $project = $this->fetchProject($projectId, ['gogs', 'remote']); switch ($_SERVER['CONTENT_TYPE']) { case 'application/json': $payload = json_decode(file_get_contents('php://input'), true); 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 {