From 8dff489e72346a17ffafb9c239c0f254f2534593 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 11 Jan 2022 02:50:35 +0000 Subject: [PATCH 01/54] * Finish task #47224. --- module/common/lang/menu.php | 45 +++++++++--------- module/group/lang/resource.php | 12 +++++ module/sonarqube/control.php | 51 ++++++++++++++++++++ module/sonarqube/lang/en.php | 10 ++++ module/sonarqube/lang/zh-cn.php | 10 ++++ module/sonarqube/model.php | 30 ++++++++++++ module/sonarqube/view/browse.html.php | 67 +++++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 21 deletions(-) create mode 100644 module/sonarqube/control.php create mode 100644 module/sonarqube/lang/en.php create mode 100644 module/sonarqube/lang/zh-cn.php create mode 100644 module/sonarqube/model.php create mode 100644 module/sonarqube/view/browse.html.php diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 3bf77d2863..b5e57d720d 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -381,22 +381,24 @@ $lang->qa->menuOrder[45] = 'automation'; $lang->qa->dividerMenu = ',bug,testtask,caselib,'; /* DevOps menu. */ -$lang->devops->menu = new stdclass(); -$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit'); -$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse", 'subModule' => 'compile,job'); -$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse"); -$lang->devops->menu->gitlab = array('link' => "GitLab|gitlab|browse", 'alias' => 'create,edit'); -$lang->devops->menu->jenkins = array('link' => "Jenkins|jenkins|browse", 'alias' => 'create,edit'); -$lang->devops->menu->maintain = array('link' => "{$lang->devops->repo}|repo|maintain", 'alias' => 'create,edit'); -$lang->devops->menu->rules = array('link' => "{$lang->devops->rules}|repo|setrules"); +$lang->devops->menu = new stdclass(); +$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit'); +$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse", 'subModule' => 'compile,job'); +$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse"); +$lang->devops->menu->gitlab = array('link' => "GitLab|gitlab|browse", 'alias' => 'create,edit'); +$lang->devops->menu->sonarqube = array('link' => "SonarQube|sonarqube|browse"); +$lang->devops->menu->jenkins = array('link' => "Jenkins|jenkins|browse", 'alias' => 'create,edit'); +$lang->devops->menu->maintain = array('link' => "{$lang->devops->repo}|repo|maintain", 'alias' => 'create,edit'); +$lang->devops->menu->rules = array('link' => "{$lang->devops->rules}|repo|setrules"); $lang->devops->menuOrder[5] = 'code'; $lang->devops->menuOrder[10] = 'compile'; $lang->devops->menuOrder[15] = 'mr'; $lang->devops->menuOrder[20] = 'gitlab'; -$lang->devops->menuOrder[25] = 'jenkins'; -$lang->devops->menuOrder[30] = 'maintain'; -$lang->devops->menuOrder[35] = 'rules'; +$lang->devops->menuOrder[25] = 'sonarqube'; +$lang->devops->menuOrder[30] = 'jenkins'; +$lang->devops->menuOrder[35] = 'maintain'; +$lang->devops->menuOrder[40] = 'rules'; /* Kanban menu. */ $lang->kanban->menu = new stdclass(); @@ -613,16 +615,17 @@ $lang->navGroup->testtask = 'qa'; $lang->navGroup->testsuite = 'qa'; $lang->navGroup->caselib = 'qa'; -$lang->navGroup->devops = 'devops'; -$lang->navGroup->repo = 'devops'; -$lang->navGroup->job = 'devops'; -$lang->navGroup->jenkins = 'devops'; -$lang->navGroup->mr = 'devops'; -$lang->navGroup->gitlab = 'devops'; -$lang->navGroup->compile = 'devops'; -$lang->navGroup->ci = 'devops'; -$lang->navGroup->svn = 'devops'; -$lang->navGroup->git = 'devops'; +$lang->navGroup->devops = 'devops'; +$lang->navGroup->repo = 'devops'; +$lang->navGroup->job = 'devops'; +$lang->navGroup->jenkins = 'devops'; +$lang->navGroup->mr = 'devops'; +$lang->navGroup->gitlab = 'devops'; +$lang->navGroup->sonarqube = 'devops'; +$lang->navGroup->compile = 'devops'; +$lang->navGroup->ci = 'devops'; +$lang->navGroup->svn = 'devops'; +$lang->navGroup->git = 'devops'; $lang->navGroup->company = 'system'; diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index bd9da48739..fe60b7c8c3 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1382,6 +1382,18 @@ $lang->gitlab->methodOrder[135] = 'browseTag'; $lang->gitlab->methodOrder[140] = 'browseTagPriv'; $lang->gitlab->methodOrder[145] = 'deleteTagPriv'; +/* SonarQube. */ +$lang->resource->sonarqube = new stdclass(); +$lang->resource->sonarqube->browse = 'browse'; +$lang->resource->sonarqube->create = 'create'; +$lang->resource->sonarqube->edit = 'edit'; +$lang->resource->sonarqube->delete = 'delete'; + +$lang->sonarqube->methodOrder[5] = 'browse'; +$lang->sonarqube->methodOrder[10] = 'create'; +$lang->sonarqube->methodOrder[15] = 'edit'; +$lang->sonarqube->methodOrder[20] = 'delete'; + /* merge request. */ $lang->resource->mr = new stdclass(); $lang->resource->mr->create = 'create'; diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php new file mode 100644 index 0000000000..079a5212ec --- /dev/null +++ b/module/sonarqube/control.php @@ -0,0 +1,51 @@ + + * @package sonarqube + * @version $Id: ${FILE_NAME} 5144 2022/1/11 8:55 上午 caoyanyi@easycorp.ltd $ + * @link http://www.zentao.net + */ +class sonarqube extends control +{ + /** + * The sonarqube constructor. + * @param string $moduleName + * @param string $methodName + */ + public function __construct($moduleName = '', $methodName = '') + { + parent::__construct($moduleName, $methodName); + + /* Optional: common::setMenuVars('devops', $this->session->repoID); */ + $this->loadModel('ci')->setMenu(); + } + + /** + * Browse sonarqube. + * + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function browse($orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $sonarqubeList = $this->sonarqube->getList($orderBy, $pager); + + $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->browse; + $this->view->sonarqubeList = $sonarqubeList; + $this->view->orderBy = $orderBy; + $this->view->pager = $pager; + + $this->display(); + } +} diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php new file mode 100644 index 0000000000..5ac24fa38a --- /dev/null +++ b/module/sonarqube/lang/en.php @@ -0,0 +1,10 @@ +sonarqube = new stdclass; +$lang->sonarqube->common = 'SonarQube'; +$lang->sonarqube->browse = 'SonarQube Browse'; +$lang->sonarqube->search = 'Search'; +$lang->sonarqube->create = 'Create SonarQube'; +$lang->sonarqube->edit = 'Edit SonarQube'; +$lang->sonarqube->delete = 'Delete SonarQube'; +$lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; +$lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php new file mode 100644 index 0000000000..215e9b4502 --- /dev/null +++ b/module/sonarqube/lang/zh-cn.php @@ -0,0 +1,10 @@ +sonarqube = new stdclass; +$lang->sonarqube->common = 'SonarQube'; +$lang->sonarqube->browse = '浏览SonarQube'; +$lang->sonarqube->search = '搜索'; +$lang->sonarqube->create = '添加SonarQube'; +$lang->sonarqube->edit = '编辑SonarQube'; +$lang->sonarqube->delete = '删除SonarQube'; +$lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; +$lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php new file mode 100644 index 0000000000..79f3f144dd --- /dev/null +++ b/module/sonarqube/model.php @@ -0,0 +1,30 @@ + + * @package sonarqube + * @version $Id: $ + * @link http://www.zentao.net + */ + +class sonarqubeModel extends model +{ + + /** + * Get sonarqube list. + * + * @param string $orderBy + * @param object $pager + * @access public + * @return array + */ + public function getList($orderBy = 'id_desc', $pager = null) + { + $sonarqubeList = $this->loadModel('pipeline')->getList('sonarqube', $orderBy, $pager); + + return $sonarqubeList; + } +} diff --git a/module/sonarqube/view/browse.html.php b/module/sonarqube/view/browse.html.php new file mode 100644 index 0000000000..9cf84d1a08 --- /dev/null +++ b/module/sonarqube/view/browse.html.php @@ -0,0 +1,67 @@ + + * @package sonarqube + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + + +
+

+ noData;?> + + createLink('sonarqube', 'create'), " " . $lang->sonarqube->create, '', "class='btn btn-info'");?> + +

+
+ +
+
+ + + + recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?> + + + + + + + + $sonarqube): ?> + + + + + + + + +
sonarqube->id);?>sonarqube->name);?>sonarqube->url);?>actions;?>
">name;?>url;?> + ", '',"title='{$lang->sonarqube->browseProject}' class='btn btn-primary'"); + common::printLink('sonarqube', 'browseGroup', "sonarqubeID=$id", " ", '', "title='{$lang->sonarqube->browseGroup}' class='btn btn-primary'"); + common::printLink('sonarqube', 'edit', "sonarqubeID=$id", " ", '',"title='{$lang->sonarqube->edit}' class='btn btn-primary'"); + common::printLink('sonarqube', 'browseUser', "sonarqubeID=$id", " ", '', "title='{$lang->sonarqube->browseUser}' class='btn' ,'disabled'"); + common::printLink('sonarqube', 'bindUser', "id=$id", " ", '', "title='{$lang->sonarqube->bindUser}' class='btn' ,'disabled'"); + if(common::hasPriv('sonarqube', 'delete')) echo html::a($this->createLink('sonarqube', 'delete', "sonarqubeID=$id"), '', 'hiddenwin', "title='{$lang->sonarqube->delete}' class='btn'"); + ?> +
+ + + +
+
+ + From 1e80904680bb0ac0f10fce64f527f040cc25e6cc Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 11 Jan 2022 05:20:18 +0000 Subject: [PATCH 02/54] * Modify page btn. --- module/sonarqube/view/browse.html.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/module/sonarqube/view/browse.html.php b/module/sonarqube/view/browse.html.php index 9cf84d1a08..505b2ce183 100644 --- a/module/sonarqube/view/browse.html.php +++ b/module/sonarqube/view/browse.html.php @@ -42,15 +42,12 @@ $sonarqube): ?> - ">name;?> + name;?> url;?> ", '',"title='{$lang->sonarqube->browseProject}' class='btn btn-primary'"); - common::printLink('sonarqube', 'browseGroup', "sonarqubeID=$id", " ", '', "title='{$lang->sonarqube->browseGroup}' class='btn btn-primary'"); common::printLink('sonarqube', 'edit', "sonarqubeID=$id", " ", '',"title='{$lang->sonarqube->edit}' class='btn btn-primary'"); - common::printLink('sonarqube', 'browseUser', "sonarqubeID=$id", " ", '', "title='{$lang->sonarqube->browseUser}' class='btn' ,'disabled'"); - common::printLink('sonarqube', 'bindUser', "id=$id", " ", '', "title='{$lang->sonarqube->bindUser}' class='btn' ,'disabled'"); if(common::hasPriv('sonarqube', 'delete')) echo html::a($this->createLink('sonarqube', 'delete', "sonarqubeID=$id"), '', 'hiddenwin', "title='{$lang->sonarqube->delete}' class='btn'"); ?> From a0669db9beeb063112c80f714eb7e5282ad249cf Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 11 Jan 2022 15:55:32 +0800 Subject: [PATCH 03/54] * Fix error when pre merge. --- module/repo/model.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/repo/model.php b/module/repo/model.php index d1302ee9a2..4a3245d85c 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -424,7 +424,7 @@ class repoModel extends model /* Convert to id by url. */ $this->loadModel('gitlab'); - $url = strtolower($url); + $url = str_replace('https://', 'http://', strtolower($url)); $matches = array(); foreach($gitlabs as $gitlabID => $gitlab) { @@ -435,7 +435,8 @@ class repoModel extends model $projects = $this->gitlab->apiGetProjects($gitlabID); foreach($projects as $project) { - if((!$isSSH and strtolower($project->http_url_to_repo) == $url) or ($isSSH and strtolower($project->ssh_url_to_repo) == $url)) + $urlToRepo = str_replace('https://', 'http://', strtolower($project->http_url_to_repo)); + if((!$isSSH and $urlToRepo == $url) or ($isSSH and strtolower($project->ssh_url_to_repo) == $url)) { $matched->gitlab = $gitlabID; $matched->project = $project->id; From 322dcddfabfda1c7bc2fd4bd6ff91426446ede9a Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 11 Jan 2022 09:44:13 +0000 Subject: [PATCH 04/54] * Finish task#47226 --- module/sonarqube/control.php | 52 +++++++++++++++++++++++++++ module/sonarqube/css/create.css | 1 + module/sonarqube/lang/en.php | 21 +++++++++++ module/sonarqube/lang/zh-cn.php | 21 +++++++++++ module/sonarqube/model.php | 15 ++++++++ module/sonarqube/view/create.html.php | 52 +++++++++++++++++++++++++++ 6 files changed, 162 insertions(+) create mode 100644 module/sonarqube/css/create.css create mode 100644 module/sonarqube/view/create.html.php diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 079a5212ec..1bce8757e9 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -48,4 +48,56 @@ class sonarqube extends control $this->display(); } + + /** + * create a sonarqube. + * + * @access public + * @return void + */ + public function create() + { + if($_POST) + { + $this->checkToken(); + $sonarqubeID = $this->loadModel('pipeline')->create('sonarqube'); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + $this->loadModel('action'); + $actionID = $this->action->create('sonarqube', $sonarqubeID, 'created'); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); + } + + $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->lblCreate; + + $this->display(); + } + + /** + * Check post info. + * + * @access protected + * @return void + */ + protected function checkToken() + { + $sonarqube = fixer::input('post')->get(); + $this->dao->update('sonarqube')->data($sonarqube) + ->check('name', 'notempty') + ->check('url', 'notempty') + ->check('account', 'notempty') + ->check('password', 'notempty'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + if(strpos($sonarqube->url, 'http') !== 0) return $this->send(array('result' => 'fail', 'message' => array('url' => array($this->lang->sonarqube->hostError)))); + + /* Check name and url unique. */ + $isExist = $this->dao->select('*')->from(TABLE_PIPELINE)->where("name='{$sonarqube->name}' or url='{$sonarqube->url}'")->fetch(); + if($isExist) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->repeatError)); + + $token = base64_encode("{$sonarqube->account}:{$sonarqube->password}"); + $result = $this->sonarqube->apiValidate($sonarqube->url, $token); + + if(!isset($result->valid) or !$result->valid) return $this->send(array('result' => 'fail', 'message' => array('token' => array($this->lang->sonarqube->validError)))); + $this->post->set('token', $token); + } } diff --git a/module/sonarqube/css/create.css b/module/sonarqube/css/create.css new file mode 100644 index 0000000000..f30cf17aeb --- /dev/null +++ b/module/sonarqube/css/create.css @@ -0,0 +1 @@ +.table-form .c-name {width: 130px;} diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index 5ac24fa38a..825fb03bac 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -8,3 +8,24 @@ $lang->sonarqube->edit = 'Edit SonarQube'; $lang->sonarqube->delete = 'Delete SonarQube'; $lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; + +$lang->sonarqube->id = 'ID'; +$lang->sonarqube->name = "{$lang->sonarqube->common} Name"; +$lang->sonarqube->url = 'URL'; +$lang->sonarqube->account = 'Username'; +$lang->sonarqube->password = 'Password'; +$lang->sonarqube->token = 'Token'; +$lang->sonarqube->defaultProject = 'Default Project'; +$lang->sonarqube->private = 'MD5 Verify'; + +$lang->sonarqube->lblCreate = 'Create SonarQube Server'; +$lang->sonarqube->desc = 'Description'; +$lang->sonarqube->createSuccess = 'Create success'; + +$lang->sonarqube->placeholder = new stdclass; +$lang->sonarqube->placeholder->name = ''; +$lang->sonarqube->placeholder->url = "Please fill in the access address of the SonarQube Server homepage, as: https://sonarqube.zentao.net."; + +$lang->sonarqube->repeatError = 'Server name or server address already exists!'; +$lang->sonarqube->validError = 'Sonarqube user authority authentication failed!'; +$lang->sonarqube->hostError = "Invalid SonarQube service address."; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 215e9b4502..417e23b466 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -8,3 +8,24 @@ $lang->sonarqube->edit = '编辑SonarQube'; $lang->sonarqube->delete = '删除SonarQube'; $lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; + +$lang->sonarqube->id = 'ID'; +$lang->sonarqube->name = "{$lang->sonarqube->common}名称"; +$lang->sonarqube->url = '服务地址'; +$lang->sonarqube->account = '用户名'; +$lang->sonarqube->password = '密码'; +$lang->sonarqube->token = 'Token'; +$lang->sonarqube->defaultProject = '默认项目'; +$lang->sonarqube->private = 'MD5验证'; + +$lang->sonarqube->lblCreate = '添加SonarQube服务器'; +$lang->sonarqube->desc = '描述'; +$lang->sonarqube->createSuccess = "创建成功"; + +$lang->sonarqube->placeholder = new stdclass; +$lang->sonarqube->placeholder->name = ''; +$lang->sonarqube->placeholder->url = "请填写SonarQube Server首页的访问地址,如:https://sonarqube.zentao.net。"; + +$lang->sonarqube->repeatError = "服务器名称或服务器地址已存在!"; +$lang->sonarqube->validError = "SonarQube 用户权限认证失败!"; +$lang->sonarqube->hostError = "无效的SonarQube服务地址。"; diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 79f3f144dd..5f3765586a 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -27,4 +27,19 @@ class sonarqubeModel extends model return $sonarqubeList; } + + /** + * check sonarqube valid + * + * @param string $host + * @param string $token + * @access public + * @return array + */ + public function apiValidate($host, $token) + { + $url = rtrim($host, '/') . "/api/authentication/validate"; + $header = 'Authorization: Basic ' . $token; + return json_decode(commonModel::http($url, null, array(), $header)); + } } diff --git a/module/sonarqube/view/create.html.php b/module/sonarqube/view/create.html.php new file mode 100644 index 0000000000..8def4808da --- /dev/null +++ b/module/sonarqube/view/create.html.php @@ -0,0 +1,52 @@ + + * @package sonarqube + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + +
+
+
+
+

sonarqube->lblCreate;?>

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
sonarqube->name;?>sonarqube->placeholder->name}'");?>
sonarqube->url;?>sonarqube->placeholder->url}'");?>
sonarqube->account;?>
sonarqube->password;?>
+ + goback, '', 'class="btn btn-wide"');?> +
+
+
+
+
+ From e2988a12120a007346f93165b8939211ba527ee7 Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 11 Jan 2022 09:48:18 +0000 Subject: [PATCH 05/54] * Adjust code --- module/sonarqube/view/create.html.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/module/sonarqube/view/create.html.php b/module/sonarqube/view/create.html.php index 8def4808da..5daf0da4d8 100644 --- a/module/sonarqube/view/create.html.php +++ b/module/sonarqube/view/create.html.php @@ -2,16 +2,15 @@ /** * The create view file of sonarqube module of ZenTaoPMS. * - * @copyright Copyright 2009-2017 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) - * @author Gang Liu + * @author Gang Zeng * @package sonarqube * @version $Id$ * @link http://www.zentao.net */ ?> -
From ca95618c5c773c11976f9c55e57e1f8a2d60fe4d Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 11 Jan 2022 10:10:52 +0000 Subject: [PATCH 06/54] * Adjust code --- module/sonarqube/model.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 5f3765586a..91b529ba19 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -28,6 +28,24 @@ class sonarqubeModel extends model return $sonarqubeList; } + /** + * Get sonarqube api base url and header by id. + * + * @param int $id + * @access public + * @return array + */ + public function getApiBase($id) + { + $sonarqube = $this->loadModel('pipeline')->getByID($id); + if(!$sonarqube) return ''; + + $url = rtrim($sonarqube->url, '/') . '/api/%s'; + $header[] = 'Authorization: Basic ' . $sonarqube->token; + + return array($url, $header); + } + /** * check sonarqube valid * From 8285477ef15a8ddbd1dd8f80a7eee41ec5c87e30 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 01:11:35 +0000 Subject: [PATCH 07/54] * Adjust language --- module/sonarqube/control.php | 2 +- module/sonarqube/lang/en.php | 2 +- module/sonarqube/lang/zh-cn.php | 2 +- module/sonarqube/view/create.html.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 1bce8757e9..84897e9fb5 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -68,7 +68,7 @@ class sonarqube extends control return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); } - $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->lblCreate; + $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->createServer; $this->display(); } diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index 825fb03bac..5ebc459551 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -18,7 +18,7 @@ $lang->sonarqube->token = 'Token'; $lang->sonarqube->defaultProject = 'Default Project'; $lang->sonarqube->private = 'MD5 Verify'; -$lang->sonarqube->lblCreate = 'Create SonarQube Server'; +$lang->sonarqube->createServer = 'Create SonarQube Server'; $lang->sonarqube->desc = 'Description'; $lang->sonarqube->createSuccess = 'Create success'; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 417e23b466..392d69840b 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -18,7 +18,7 @@ $lang->sonarqube->token = 'Token'; $lang->sonarqube->defaultProject = '默认项目'; $lang->sonarqube->private = 'MD5验证'; -$lang->sonarqube->lblCreate = '添加SonarQube服务器'; +$lang->sonarqube->createServer = '添加SonarQube服务器'; $lang->sonarqube->desc = '描述'; $lang->sonarqube->createSuccess = "创建成功"; diff --git a/module/sonarqube/view/create.html.php b/module/sonarqube/view/create.html.php index 5daf0da4d8..21b72b46e9 100644 --- a/module/sonarqube/view/create.html.php +++ b/module/sonarqube/view/create.html.php @@ -15,7 +15,7 @@
-

sonarqube->lblCreate;?>

+

sonarqube->createServer;?>

From e69be078a35765f5ef6bcf8d39aa3274dfd80f78 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 01:46:35 +0000 Subject: [PATCH 08/54] * Adjust code --- module/sonarqube/config.php | 5 +++++ module/sonarqube/control.php | 6 +----- module/sonarqube/view/create.html.php | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 module/sonarqube/config.php diff --git a/module/sonarqube/config.php b/module/sonarqube/config.php new file mode 100644 index 0000000000..32f0451daf --- /dev/null +++ b/module/sonarqube/config.php @@ -0,0 +1,5 @@ +sonarqube = new stdclass(); + +$config->sonarqube->create = new stdclass(); +$config->sonarqube->create->requiredFields = 'name,url,account,password'; diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 84897e9fb5..f6dd4434cc 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -82,11 +82,7 @@ class sonarqube extends control protected function checkToken() { $sonarqube = fixer::input('post')->get(); - $this->dao->update('sonarqube')->data($sonarqube) - ->check('name', 'notempty') - ->check('url', 'notempty') - ->check('account', 'notempty') - ->check('password', 'notempty'); + $this->dao->update('sonarqube')->data($sonarqube)->batchCheck($this->config->sonarqube->create->requiredFields, 'notempty'); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if(strpos($sonarqube->url, 'http') !== 0) return $this->send(array('result' => 'fail', 'message' => array('url' => array($this->lang->sonarqube->hostError)))); diff --git a/module/sonarqube/view/create.html.php b/module/sonarqube/view/create.html.php index 21b72b46e9..15253bb19e 100644 --- a/module/sonarqube/view/create.html.php +++ b/module/sonarqube/view/create.html.php @@ -21,20 +21,20 @@
- + - + - + - + From 8f5032d898e461240b58e573b9783af763d01a81 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 02:41:27 +0000 Subject: [PATCH 09/54] * Finish task#47228 --- module/group/lang/resource.php | 10 ++++++---- module/sonarqube/lang/en.php | 2 ++ module/sonarqube/lang/zh-cn.php | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index fe60b7c8c3..7949388c3c 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1384,15 +1384,17 @@ $lang->gitlab->methodOrder[145] = 'deleteTagPriv'; /* SonarQube. */ $lang->resource->sonarqube = new stdclass(); -$lang->resource->sonarqube->browse = 'browse'; -$lang->resource->sonarqube->create = 'create'; -$lang->resource->sonarqube->edit = 'edit'; -$lang->resource->sonarqube->delete = 'delete'; +$lang->resource->sonarqube->browse = 'browse'; +$lang->resource->sonarqube->create = 'create'; +$lang->resource->sonarqube->edit = 'edit'; +$lang->resource->sonarqube->delete = 'delete'; +$lang->resource->sonarqube->browseProject = 'browseProject'; $lang->sonarqube->methodOrder[5] = 'browse'; $lang->sonarqube->methodOrder[10] = 'create'; $lang->sonarqube->methodOrder[15] = 'edit'; $lang->sonarqube->methodOrder[20] = 'delete'; +$lang->sonarqube->methodOrder[25] = 'browseProject'; /* merge request. */ $lang->resource->mr = new stdclass(); diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index 5ebc459551..6e776c323d 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -9,6 +9,8 @@ $lang->sonarqube->delete = 'Delete SonarQube'; $lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; +$lang->sonarqube->browseProject = "SonarQube Project List"; + $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common} Name"; $lang->sonarqube->url = 'URL'; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 392d69840b..693e4fd547 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -9,6 +9,8 @@ $lang->sonarqube->delete = '删除SonarQube'; $lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; +$lang->sonarqube->browseProject = "SonarQube项目列表"; + $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common}名称"; $lang->sonarqube->url = '服务地址'; From b80539559522ad94a6b19193be9614823fefff0f Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 03:11:22 +0000 Subject: [PATCH 10/54] * Adjust code --- module/sonarqube/lang/en.php | 1 - module/sonarqube/lang/zh-cn.php | 1 - 2 files changed, 2 deletions(-) diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index 6e776c323d..f1dd3b27a2 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -8,7 +8,6 @@ $lang->sonarqube->edit = 'Edit SonarQube'; $lang->sonarqube->delete = 'Delete SonarQube'; $lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; - $lang->sonarqube->browseProject = "SonarQube Project List"; $lang->sonarqube->id = 'ID'; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 693e4fd547..f43239afb6 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -8,7 +8,6 @@ $lang->sonarqube->edit = '编辑SonarQube'; $lang->sonarqube->delete = '删除SonarQube'; $lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; - $lang->sonarqube->browseProject = "SonarQube项目列表"; $lang->sonarqube->id = 'ID'; From 5359525b4ccbd49384fc33ac7f36679a030c8dfb Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 03:12:38 +0000 Subject: [PATCH 11/54] * Adjust code --- module/sonarqube/lang/zh-cn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index f43239afb6..dea6c84c2d 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -8,7 +8,7 @@ $lang->sonarqube->edit = '编辑SonarQube'; $lang->sonarqube->delete = '删除SonarQube'; $lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; -$lang->sonarqube->browseProject = "SonarQube项目列表"; +$lang->sonarqube->browseProject = "SonarQube项目列表"; $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common}名称"; From c5aaae3eb8235f3c145cca120408ce087f66c858 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Wed, 12 Jan 2022 14:16:34 +0800 Subject: [PATCH 12/54] * Finish task #47233. --- db/update16.1.sql | 2 ++ module/action/lang/en.php | 1 + module/action/lang/zh-cn.php | 1 + module/group/lang/resource.php | 24 +++++++++++++----------- module/job/control.php | 1 + module/repo/control.php | 14 ++++++++------ module/repo/view/maintain.html.php | 7 ++++++- module/sonarqube/control.php | 15 +++++++++++++-- module/sonarqube/lang/en.php | 1 + module/sonarqube/lang/zh-cn.php | 1 + 10 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 db/update16.1.sql diff --git a/db/update16.1.sql b/db/update16.1.sql new file mode 100644 index 0000000000..6644596c3b --- /dev/null +++ b/db/update16.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE `zt_job` ADD `sonarqubeServer` mediumint(8) unsigned NOT NULL AFTER `triggerType`; +ALTER TABLE `zt_job` ADD `projectKey` varchar(255) NOT NULL AFTER `sonarqubeServer`; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 93f9ddca4d..b739065286 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -329,6 +329,7 @@ $lang->action->label->finishedbychild = 'finished'; $lang->action->label->closedbychild = 'closed'; $lang->action->label->activatedbychild = 'activated'; $lang->action->label->createchild = 'activated'; +$lang->action->label->executed = 'executed'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 13e034b34c..851e8f58f4 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -329,6 +329,7 @@ $lang->action->label->finishedbychild = '完成了'; $lang->action->label->closedbychild = '关闭了'; $lang->action->label->activatedbychild = '激活了'; $lang->action->label->createchild = '激活了'; +$lang->action->label->executed = '执行了'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 7949388c3c..4918fb2d72 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1389,12 +1389,14 @@ $lang->resource->sonarqube->create = 'create'; $lang->resource->sonarqube->edit = 'edit'; $lang->resource->sonarqube->delete = 'delete'; $lang->resource->sonarqube->browseProject = 'browseProject'; +$lang->resource->sonarqube->execJob = 'execJob'; -$lang->sonarqube->methodOrder[5] = 'browse'; -$lang->sonarqube->methodOrder[10] = 'create'; -$lang->sonarqube->methodOrder[15] = 'edit'; -$lang->sonarqube->methodOrder[20] = 'delete'; -$lang->sonarqube->methodOrder[25] = 'browseProject'; +$lang->sonarqube->methodOrder[5] = 'browse'; +$lang->sonarqube->methodOrder[10] = 'create'; +$lang->sonarqube->methodOrder[15] = 'edit'; +$lang->sonarqube->methodOrder[20] = 'delete'; +$lang->sonarqube->methodOrder[25] = 'browseProject'; +$lang->sonarqube->methodOrder[30] = 'execJob'; /* merge request. */ $lang->resource->mr = new stdclass(); @@ -1740,12 +1742,12 @@ $lang->backup->methodOrder[25] = 'setting'; $lang->backup->methodOrder[30] = 'rmPHPHeader'; $lang->resource->cron = new stdclass(); -$lang->resource->cron->index = 'index'; -$lang->resource->cron->turnon = 'turnon'; -$lang->resource->cron->create = 'createAction'; -$lang->resource->cron->edit = 'edit'; -$lang->resource->cron->toggle = 'toggle'; -$lang->resource->cron->delete = 'delete'; +$lang->resource->cron->index = 'index'; +$lang->resource->cron->turnon = 'turnon'; +$lang->resource->cron->create = 'createAction'; +$lang->resource->cron->edit = 'edit'; +$lang->resource->cron->toggle = 'toggle'; +$lang->resource->cron->delete = 'delete'; $lang->resource->cron->openProcess = 'restart'; $lang->cron->methodOrder[5] = 'index'; diff --git a/module/job/control.php b/module/job/control.php index 961f71c525..efeccd4376 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -323,6 +323,7 @@ class job extends control if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $this->app->loadLang('compile'); + $this->loadModel('action')->create('job', $id, 'executed'); return $this->send(array('result' => 'success', 'message' => sprintf($this->lang->job->sendExec, zget($this->lang->compile->statusList, $compile->status)))); } diff --git a/module/repo/control.php b/module/repo/control.php index e1d3e0c407..b11b87ba8b 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -83,7 +83,8 @@ class repo extends control $repoID = $this->repo->saveState(0, $objectID); if($this->viewType !== 'json') $this->commonAction($repoID, $objectID); - $repoList = $this->repo->getList(0, '', $orderBy); + $repoList = $this->repo->getList(0, '', $orderBy); + //$sonarRepoList = $this->loadModel('sonarqube')->getSonarqubeByRepo(array_keys($repoList)); /* Pager. */ $this->app->loadClass('pager', $static = true); @@ -95,11 +96,12 @@ class repo extends control $this->view->position[] = $this->lang->repo->common; $this->view->position[] = $this->lang->repo->browse; - $this->view->orderBy = $orderBy; - $this->view->objectID = $objectID; - $this->view->pager = $pager; - $this->view->repoList = empty($repoList) ? $repoList: $repoList[$pageID - 1];; - $this->view->products = $this->loadModel('product')->getPairs(); + $this->view->orderBy = $orderBy; + $this->view->objectID = $objectID; + $this->view->pager = $pager; + $this->view->repoList = empty($repoList) ? $repoList: $repoList[$pageID - 1];; + $this->view->products = $this->loadModel('product')->getPairs(); + //$this->view->sonarRepoList = $sonarRepoList; $this->display(); } diff --git a/module/repo/view/maintain.html.php b/module/repo/view/maintain.html.php index f4f083953d..33ea5cdc56 100644 --- a/module/repo/view/maintain.html.php +++ b/module/repo/view/maintain.html.php @@ -27,7 +27,7 @@ - + @@ -59,6 +59,11 @@ common::printIcon('gitlab', 'createWebhook', "repoID=$repo->id", '', 'list', 'change', 'hiddenwin'); common::printIcon('gitlab', 'importIssue', "repo={$repo->id}", '', 'list', 'link'); } + if(isset($sonarRepoList[$repo->id])) + { + $jobID = $sonarRepoList[$repo->id]->id; + common::printIcon('sonarqube', 'execJob', "jobID=$jobID", '', 'list', 'sonarqube', 'hiddenwin'); + } common::printIcon('repo', 'delete', "repoID=$repo->id&objectID=$objectID", '', 'list', 'trash', 'hiddenwin'); ?> diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index f6dd4434cc..18c887290e 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -63,8 +63,7 @@ class sonarqube extends control $sonarqubeID = $this->loadModel('pipeline')->create('sonarqube'); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - $this->loadModel('action'); - $actionID = $this->action->create('sonarqube', $sonarqubeID, 'created'); + $actionID = $this->loadModel('action')->create('sonarqube', $sonarqubeID, 'created'); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); } @@ -96,4 +95,16 @@ class sonarqube extends control if(!isset($result->valid) or !$result->valid) return $this->send(array('result' => 'fail', 'message' => array('token' => array($this->lang->sonarqube->validError)))); $this->post->set('token', $token); } + + /** + * Exec job. + * + * @param int $jobID + * @access public + * @return void + */ + public function execJob($jobID) + { + echo $this->fetch('job', 'exec', "jobID=$jobID"); + } } diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index f1dd3b27a2..c562bdbdb1 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -9,6 +9,7 @@ $lang->sonarqube->delete = 'Delete SonarQube'; $lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; $lang->sonarqube->browseProject = "SonarQube Project List"; +$lang->sonarqube->execJob = "Exec SonarQube Job"; $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common} Name"; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index dea6c84c2d..306938acfc 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -9,6 +9,7 @@ $lang->sonarqube->delete = '删除SonarQube'; $lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; $lang->sonarqube->browseProject = "SonarQube项目列表"; +$lang->sonarqube->execJob = "执行SonarQube任务"; $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common}名称"; From b3ff9202a22e65c2a18f46c3afa812afd3f51f58 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Wed, 12 Jan 2022 14:38:06 +0800 Subject: [PATCH 13/54] * Finish task #47233. --- module/repo/control.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/repo/control.php b/module/repo/control.php index b11b87ba8b..5d7cdff573 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -84,7 +84,7 @@ class repo extends control if($this->viewType !== 'json') $this->commonAction($repoID, $objectID); $repoList = $this->repo->getList(0, '', $orderBy); - //$sonarRepoList = $this->loadModel('sonarqube')->getSonarqubeByRepo(array_keys($repoList)); + $sonarRepoList = $this->loadModel('sonarqube')->getSonarqubeByRepo(array_keys($repoList)); /* Pager. */ $this->app->loadClass('pager', $static = true); @@ -101,7 +101,7 @@ class repo extends control $this->view->pager = $pager; $this->view->repoList = empty($repoList) ? $repoList: $repoList[$pageID - 1];; $this->view->products = $this->loadModel('product')->getPairs(); - //$this->view->sonarRepoList = $sonarRepoList; + $this->view->sonarRepoList = $sonarRepoList; $this->display(); } From 9da6e4b9c04e110f94d7dd907bd80057ea719816 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Wed, 12 Jan 2022 06:44:54 +0000 Subject: [PATCH 14/54] * Finish task #47221. --- module/job/control.php | 43 ++++++++---- module/job/js/create.js | 81 ++++++++++++++++++++++ module/job/js/edit.js | 84 +++++++++++++++++++++++ module/job/lang/en.php | 97 ++++++++++++++------------- module/job/lang/zh-cn.php | 97 ++++++++++++++------------- module/job/model.php | 62 ++++++++++++++++- module/job/view/create.html.php | 25 ++++++- module/job/view/edit.html.php | 26 ++++++- module/sonarqube/control.php | 20 +++++- module/sonarqube/model.php | 11 +++ module/sonarqube/view/browse.html.php | 2 +- 11 files changed, 433 insertions(+), 115 deletions(-) diff --git a/module/job/control.php b/module/job/control.php index 961f71c525..a3f8553d47 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -120,7 +120,8 @@ class job extends control $this->view->repoTypes = $repoTypes; $this->view->products = array(0 => '') + $this->loadModel('product')->getProductPairsByProject($this->projectID); - $this->view->jenkinsServerList = array('' => '') + $this->loadModel('jenkins')->getPairs(); + $this->view->jenkinsServerList = array('' => '') + $this->loadModel('jenkins')->getPairs(); + $this->view->sonarqubeServerList = array('' => '') + $this->loadModel('sonarqube')->getPairs(); $this->display(); } @@ -189,17 +190,18 @@ class job extends control if($jobProduct and $jobProduct->deleted == 0) $products += array($job->product => $jobProduct->name); } - $this->view->title = $this->lang->ci->job . $this->lang->colon . $this->lang->job->edit; - $this->view->position[] = html::a(inlink('browse'), $this->lang->ci->job); - $this->view->position[] = $this->lang->job->edit; - $this->view->repoPairs = $repoPairs; - $this->view->gitlabRepos = $gitlabRepos; - $this->view->repoTypes = $repoTypes; - $this->view->repoType = zget($repoTypes, $job->repo, 'Git'); - $this->view->job = $job; - $this->view->products = array(0 => '') + $products; - $this->view->jenkinsServerList = $this->loadModel('jenkins')->getPairs(); - $this->view->pipelines = $this->jenkins->getTasks($job->server); + $this->view->title = $this->lang->ci->job . $this->lang->colon . $this->lang->job->edit; + $this->view->position[] = html::a(inlink('browse'), $this->lang->ci->job); + $this->view->position[] = $this->lang->job->edit; + $this->view->repoPairs = $repoPairs; + $this->view->gitlabRepos = $gitlabRepos; + $this->view->repoTypes = $repoTypes; + $this->view->repoType = zget($repoTypes, $job->repo, 'Git'); + $this->view->job = $job; + $this->view->products = array(0 => '') + $products; + $this->view->jenkinsServerList = $this->loadModel('jenkins')->getPairs(); + $this->view->sonarqubeServerList = array('' => '') + $this->loadModel('sonarqube')->getPairs(); + $this->view->pipelines = $this->jenkins->getTasks($job->server); $this->display(); } @@ -414,4 +416,21 @@ class job extends control $this->send(array('result' => 'success', 'type' => strtolower($repo->SCM))); } + /** + * Ajax check SonarQube linked by repoID. + * + * @param int $repoID + * @access public + * @return void + */ + public function ajaxCheckSonarqubeLink($repoID, $jobID = 0) + { + $repo = $this->loadModel('job')->getSonarqubeByRepo(array($repoID), $jobID); + if(!empty($repo)) + { + $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); + $this->send(array('result' => 'fail', 'message' => $message)); + } + $this->send(array('result' => 'success', 'message' => '')); + } } diff --git a/module/job/js/create.js b/module/job/js/create.js index 635ce8abc2..f126d0490e 100644 --- a/module/job/js/create.js +++ b/module/job/js/create.js @@ -1,5 +1,49 @@ $(document).ready(function() { + /* + * Get frame select. + * param string engine eg. jenkins|gitlab + */ + function getFrameSelect(engine) + { + $('#frameBox .input-group').empty(); + $('#frameBox .input-group').append("
"); + html = "'; + + $('#frameBox .loading').remove(); + $('#frameBox .input-group').append(html); + $('#frameBox #frame').chosen(); + } + getFrameSelect(''); + + /* + * Check sonarqube linked. + */ + function checkSonarquebLink() + { + var repoID = $('#repo').val(); + var frame = $('#frame').val(); + + if(frame != 'sonarqube' || repoID == 0) return false; + + $.getJSON(createLink('job', 'ajaxCheckSonarqubeLink', 'repoID=' + repoID), function(result) + { + if(result.result != 'success') + { + alert(result.message); + $('#repo').val(0).trigger('chosen:updated'); + $('#reference').val('').trigger('chosen:updated'); + $('.reference').hide(); + return false; + } + }) + } + $(document).on('change', '#repo', function() { var repoID = $(this).val(); @@ -63,6 +107,9 @@ $(document).ready(function() $('#triggerggerType option[value=tag]').html(data.type == 'gitlab' ? buildTag : dirChange).trigger('chosen:updated'); } }); + + /* Check exists sonarqube data. */ + checkSonarquebLink(); }); $(document).on('change', '[name^=svnDir]', function() @@ -139,6 +186,39 @@ $(document).ready(function() $('#jenkinsServerTR #jkTask').chosen({drop_direction: 'auto'}); }) + /* There has been a problem with handling the prompt label. */ + $('#jkTaskLabel').remove(); + }) + + $(document).on('change', '#frame', function() + { + var frame = $(this).val(); + if(frame == 'sonarqube') + { + $('tr.sonarqube').removeClass('hide'); + + /* Check exists sonarqube data. */ + checkSonarquebLink(); + } + else + { + $('tr.sonarqube').addClass('hide'); + } + }) + + $(document).on('change', '#sonarqubeServer', function() + { + var sonarqubeID = $(this).val(); + $('#sonarProject #projectKey').remove(); + $('#sonarProject #projectKey_chosen').remove(); + $('#sonarProject .input-group').append("
"); + $.getJSON(createLink('sonarqube', 'ajaxGetProjectList', 'sonarqubeID=' + sonarqubeID), function(html) + { + $('#sonarProject .loading').remove(); + $('#sonarProject .input-group').append(html); + + $('#sonarProject #projectKey').chosen({drop_direction: 'auto'}); + }) }) var scheduleOption = ""; @@ -161,6 +241,7 @@ $(document).ready(function() $('tr.gitlabRepo').hide(); $('tr.commonRepo').show(); } + getFrameSelect(engine); }); $('#engine').change(); diff --git a/module/job/js/edit.js b/module/job/js/edit.js index f91c2aef1b..cdcc48f8d4 100644 --- a/module/job/js/edit.js +++ b/module/job/js/edit.js @@ -1,5 +1,52 @@ $(document).ready(function() { + /* + * Get frame select. + * param string engine eg. jenkins|gitlab + */ + function getFrameSelect() + { + $('#frameBox .input-group').empty(); + $('#frameBox .input-group').append("
"); + html = "'; + + $('#frameBox .loading').remove(); + $('#frameBox .input-group').append(html); + $('#frameBox #frame').chosen(); + } + getFrameSelect(); + + /* Check sonarqube linked. */ + function checkSonarquebLink() + { + var repoID = $('#repo').val(); + var frame = $('#frame').val(); + + if(frame != 'sonarqube' || repoID == 0) return false; + + $.getJSON(createLink('job', 'ajaxCheckSonarqubeLink', 'repoID=' + repoID + '&jobID=' + job.id), function(result) + { + if(result.result != 'success') + { + alert(result.message); + $('#repo').val(0).trigger('chosen:updated'); + $('#reference').val('').trigger('chosen:updated'); + $('.reference').hide(); + return false; + } + }) + } + $('#gitlabRepo').change(function() { $('#repo').val($(this).val()).change(); @@ -45,6 +92,9 @@ $(document).ready(function() $('#svnDirBox #svnDir').chosen(); }) } + + /* Check exists sonarqube data. */ + checkSonarquebLink(); }) $(document).on('change', '[name^=svnDir]', function() @@ -124,6 +174,39 @@ $(document).ready(function() $('#jenkinsServerTR #jkTask').val(jkTask).chosen(); }) + /* There has been a problem with handling the prompt label. */ + $('#jkTaskLabel').remove(); + }) + + $(document).on('change', '#frame', function() + { + var frame = $(this).val(); + if(frame == 'sonarqube') + { + $('tr.sonarqube').removeClass('hide'); + + /* Check exists sonarqube data. */ + checkSonarquebLink(); + } + else + { + $('tr.sonarqube').addClass('hide'); + } + }) + + $(document).on('change', '#sonarqubeServer', function() + { + var sonarqubeID = $(this).val(); + $('#sonarProject #projectKey').remove(); + $('#sonarProject #projectKey_chosen').remove(); + $('#sonarProject .input-group').append("
"); + $.getJSON(createLink('sonarqube', 'ajaxGetProjectList', 'sonarqubeID=' + sonarqubeID), function(html) + { + $('#sonarProject .loading').remove(); + $('#sonarProject .input-group').append(html); + + $('#sonarProject #projectKey').chosen({drop_direction: 'auto'}); + }) }) var scheduleOption = ""; @@ -169,6 +252,7 @@ $(document).ready(function() $('#engine').change(); $('#jkServer').change(); + $('#frame').change(); $('#triggerType').change(); }); diff --git a/module/job/lang/en.php b/module/job/lang/en.php index f2353087d6..5aa7bb3833 100644 --- a/module/job/lang/en.php +++ b/module/job/lang/en.php @@ -14,46 +14,50 @@ $lang->job->execSuccess = 'Build success'; $lang->job->browseAction = 'Job List'; -$lang->job->id = 'ID'; -$lang->job->name = 'Name'; -$lang->job->repo = 'Repo'; -$lang->job->product = $lang->productCommon; -$lang->job->svnDir = 'SVN Tag Watch Path'; -$lang->job->jenkins = 'Jenkins'; -$lang->job->jkHost = 'Jenkins Server'; -$lang->job->jkJob = 'Jenkins Task'; -$lang->job->buildSpec = 'Build Target'; // 'pipeline@server' -$lang->job->engine = 'Engine'; -$lang->job->server = 'Server'; -$lang->job->pipeline = 'Pipeline'; -$lang->job->buildType = 'Build Type'; -$lang->job->frame = 'Frame'; -$lang->job->triggerType = 'Trigger'; -$lang->job->atDay = 'Custom Days'; -$lang->job->atTime = 'At Time'; -$lang->job->lastStatus = 'Last Status'; -$lang->job->lastExec = 'Last Executed'; -$lang->job->comment = 'Match Keywords'; -$lang->job->customParam = 'Custom build parameters'; -$lang->job->paramName = 'Name'; -$lang->job->paramValue = 'Value'; -$lang->job->custom = 'Custom'; -$lang->job->createdBy = 'Created By'; -$lang->job->createdDate = 'Created Date'; -$lang->job->editedBy = 'Edited By'; -$lang->job->editedDate = 'Edited Date'; -$lang->job->lastTag = 'Last Tag'; -$lang->job->deleted = 'Deleted'; -$lang->job->repoServer = 'Repo Server'; +$lang->job->id = 'ID'; +$lang->job->name = 'Name'; +$lang->job->repo = 'Repo'; +$lang->job->product = $lang->productCommon; +$lang->job->svnDir = 'SVN Tag Watch Path'; +$lang->job->jenkins = 'Jenkins'; +$lang->job->jkHost = 'Jenkins Server'; +$lang->job->jkJob = 'Jenkins Task'; +$lang->job->buildSpec = 'Build Target'; // 'pipeline@server' +$lang->job->engine = 'Engine'; +$lang->job->server = 'Server'; +$lang->job->pipeline = 'Pipeline'; +$lang->job->buildType = 'Build Type'; +$lang->job->frame = 'Frame'; +$lang->job->triggerType = 'Trigger'; +$lang->job->atDay = 'Custom Days'; +$lang->job->atTime = 'At Time'; +$lang->job->lastStatus = 'Last Status'; +$lang->job->lastExec = 'Last Executed'; +$lang->job->comment = 'Match Keywords'; +$lang->job->customParam = 'Custom build parameters'; +$lang->job->paramName = 'Name'; +$lang->job->paramValue = 'Value'; +$lang->job->custom = 'Custom'; +$lang->job->createdBy = 'Created By'; +$lang->job->createdDate = 'Created Date'; +$lang->job->editedBy = 'Edited By'; +$lang->job->editedDate = 'Edited Date'; +$lang->job->lastTag = 'Last Tag'; +$lang->job->deleted = 'Deleted'; +$lang->job->repoServer = 'Repo Server'; +$lang->job->sonarqubeServer = 'SonarQube Server'; +$lang->job->projectKey = 'SonarQube Project'; $lang->job->lblBasic = 'Basic Info'; -$lang->job->example = 'e.g.'; -$lang->job->commitEx = "Used to match the keywords used to create a compile. Multiple keywords are separated by ','"; -$lang->job->cronSample = 'e.g. 0 0 2 * * 2-6/1 means 2:00 a.m. every weekday.'; -$lang->job->sendExec = 'Send execute request success.'; -$lang->job->inputName = 'Please enter parameter name.'; -$lang->job->invalidName = 'The parameter name should be letters, numbers or underlines.'; +$lang->job->example = 'e.g.'; +$lang->job->commitEx = "Used to match the keywords used to create a compile. Multiple keywords are separated by ','"; +$lang->job->cronSample = 'e.g. 0 0 2 * * 2-6/1 means 2:00 a.m. every weekday.'; +$lang->job->sendExec = 'Send execute request success.'; +$lang->job->inputName = 'Please enter parameter name.'; +$lang->job->invalidName = 'The parameter name should be letters, numbers or underlines.'; +$lang->job->repoExists = 'This repository has a build task associated with it『%s』'; +$lang->job->mustUseJenkins = 'SonarQube frame is only used if the build engine is JenKins.'; $lang->job->buildTypeList['build'] = 'Only Build'; $lang->job->buildTypeList['buildAndDeploy'] = 'Build And Deploy'; @@ -63,15 +67,16 @@ $lang->job->triggerTypeList['tag'] = 'Tag'; $lang->job->triggerTypeList['commit'] = 'Code Commit'; $lang->job->triggerTypeList['schedule'] = 'Schedule'; -$lang->job->frameList[''] = ''; -$lang->job->frameList['junit'] = 'JUnit'; -$lang->job->frameList['testng'] = 'TestNG'; -$lang->job->frameList['phpunit'] = 'PHPUnit'; -$lang->job->frameList['pytest'] = 'Pytest'; -$lang->job->frameList['jtest'] = 'JTest'; -$lang->job->frameList['cppunit'] = 'CppUnit'; -$lang->job->frameList['gtest'] = 'GTest'; -$lang->job->frameList['qtest'] = 'QTest'; +$lang->job->frameList[''] = ''; +$lang->job->frameList['junit'] = 'JUnit'; +$lang->job->frameList['testng'] = 'TestNG'; +$lang->job->frameList['phpunit'] = 'PHPUnit'; +$lang->job->frameList['pytest'] = 'Pytest'; +$lang->job->frameList['jtest'] = 'JTest'; +$lang->job->frameList['cppunit'] = 'CppUnit'; +$lang->job->frameList['gtest'] = 'GTest'; +$lang->job->frameList['qtest'] = 'QTest'; +$lang->job->frameList['sonarqube'] = 'SonarQube'; $lang->job->paramValueList[''] = ''; $lang->job->paramValueList['$zentao_version'] = 'Current version'; diff --git a/module/job/lang/zh-cn.php b/module/job/lang/zh-cn.php index 780ec84159..1994eab804 100644 --- a/module/job/lang/zh-cn.php +++ b/module/job/lang/zh-cn.php @@ -14,46 +14,50 @@ $lang->job->execSuccess = '执行成功'; $lang->job->browseAction = '构建任务列表'; -$lang->job->id = 'ID'; -$lang->job->name = '名称'; -$lang->job->repo = '代码库'; -$lang->job->product = '关联' . $lang->productCommon; -$lang->job->svnDir = 'SVN监控路径'; -$lang->job->jenkins = 'Jenkins'; -$lang->job->jkHost = 'Jenkins服务器'; -$lang->job->jkJob = 'Jenkins任务'; -$lang->job->buildSpec = '构建对象'; // 'pipeline@server' -$lang->job->engine = '构建引擎'; -$lang->job->server = '服务器'; -$lang->job->pipeline = '流水线'; -$lang->job->buildType = '构建类型'; -$lang->job->frame = '工具/框架'; -$lang->job->triggerType = '触发方式'; -$lang->job->atDay = '自定义日期'; -$lang->job->atTime = '执行时间'; -$lang->job->lastStatus = '最后执行状态'; -$lang->job->lastExec = '最后执行时间'; -$lang->job->comment = '匹配关键字'; -$lang->job->customParam = '自定义构建参数'; -$lang->job->paramName = '名称'; -$lang->job->paramValue = '值'; -$lang->job->custom = '自定义'; -$lang->job->createdBy = '由谁创建'; -$lang->job->createdDate = '创建日期'; -$lang->job->editedBy = '由谁编辑'; -$lang->job->editedDate = '编辑日期'; -$lang->job->lastTag = '最后标签'; -$lang->job->deleted = '已删除'; -$lang->job->repoServer = '版本库服务器'; +$lang->job->id = 'ID'; +$lang->job->name = '名称'; +$lang->job->repo = '代码库'; +$lang->job->product = '关联' . $lang->productCommon; +$lang->job->svnDir = 'SVN监控路径'; +$lang->job->jenkins = 'Jenkins'; +$lang->job->jkHost = 'Jenkins服务器'; +$lang->job->jkJob = 'Jenkins任务'; +$lang->job->buildSpec = '构建对象'; // 'pipeline@server' +$lang->job->engine = '构建引擎'; +$lang->job->server = '服务器'; +$lang->job->pipeline = '流水线'; +$lang->job->buildType = '构建类型'; +$lang->job->frame = '工具/框架'; +$lang->job->triggerType = '触发方式'; +$lang->job->atDay = '自定义日期'; +$lang->job->atTime = '执行时间'; +$lang->job->lastStatus = '最后执行状态'; +$lang->job->lastExec = '最后执行时间'; +$lang->job->comment = '匹配关键字'; +$lang->job->customParam = '自定义构建参数'; +$lang->job->paramName = '名称'; +$lang->job->paramValue = '值'; +$lang->job->custom = '自定义'; +$lang->job->createdBy = '由谁创建'; +$lang->job->createdDate = '创建日期'; +$lang->job->editedBy = '由谁编辑'; +$lang->job->editedDate = '编辑日期'; +$lang->job->lastTag = '最后标签'; +$lang->job->deleted = '已删除'; +$lang->job->repoServer = '版本库服务器'; +$lang->job->sonarqubeServer = 'SonarQube服务器'; +$lang->job->projectKey = 'SonarQube项目'; $lang->job->lblBasic = '基本信息'; -$lang->job->example = '举例'; -$lang->job->commitEx = "用于匹配创建构建任务的关键字,多个关键字用','分割"; -$lang->job->cronSample = '如 0 0 2 * * 2-6/1 表示每个工作日凌晨2点'; -$lang->job->sendExec = '发送执行请求成功!执行结果:%s'; -$lang->job->inputName = '请输入参数名称。'; -$lang->job->invalidName = '参数名称应该是英文字母、数字或下划线的组合。'; +$lang->job->example = '举例'; +$lang->job->commitEx = "用于匹配创建构建任务的关键字,多个关键字用','分割"; +$lang->job->cronSample = '如 0 0 2 * * 2-6/1 表示每个工作日凌晨2点'; +$lang->job->sendExec = '发送执行请求成功!执行结果:%s'; +$lang->job->inputName = '请输入参数名称。'; +$lang->job->invalidName = '参数名称应该是英文字母、数字或下划线的组合。'; +$lang->job->repoExists = '此版本库已关联构建任务『%s』'; +$lang->job->mustUseJenkins = 'SonarQube工具/框架仅在构建引擎为JenKins的情况下使用'; $lang->job->buildTypeList['build'] = '仅构建'; $lang->job->buildTypeList['buildAndDeploy'] = '构建部署'; @@ -63,15 +67,16 @@ $lang->job->triggerTypeList['tag'] = '打标签'; $lang->job->triggerTypeList['commit'] = '提交注释包含关键字'; $lang->job->triggerTypeList['schedule'] = '定时计划'; -$lang->job->frameList[''] = ''; -$lang->job->frameList['junit'] = 'JUnit'; -$lang->job->frameList['testng'] = 'TestNG'; -$lang->job->frameList['phpunit'] = 'PHPUnit'; -$lang->job->frameList['pytest'] = 'Pytest'; -$lang->job->frameList['jtest'] = 'JTest'; -$lang->job->frameList['cppunit'] = 'CppUnit'; -$lang->job->frameList['gtest'] = 'GTest'; -$lang->job->frameList['qtest'] = 'QTest'; +$lang->job->frameList[''] = ''; +$lang->job->frameList['junit'] = 'JUnit'; +$lang->job->frameList['testng'] = 'TestNG'; +$lang->job->frameList['phpunit'] = 'PHPUnit'; +$lang->job->frameList['pytest'] = 'Pytest'; +$lang->job->frameList['jtest'] = 'JTest'; +$lang->job->frameList['cppunit'] = 'CppUnit'; +$lang->job->frameList['gtest'] = 'GTest'; +$lang->job->frameList['qtest'] = 'QTest'; +$lang->job->frameList['sonarqube'] = 'SonarQube'; $lang->job->paramValueList[''] = ''; $lang->job->paramValueList['$zentao_version'] = '当前版本号'; diff --git a/module/job/model.php b/module/job/model.php index 97673d40cc..279aa5631d 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -156,7 +156,8 @@ class jobModel extends model public function create() { $job = fixer::input('post') - ->setDefault('atDay', '') + ->setDefault('atDay,projectKey', '') + ->setDefault('sonarqubeServer', 0) ->add('createdBy', $this->app->user->account) ->add('createdDate', helper::now()) ->remove('repoType,reference') @@ -181,6 +182,24 @@ class jobModel extends model unset($job->jkTask); unset($job->gitlabRepo); + /* SonarQube tool is only used if the engine is JenKins. */ + if($job->engine != 'jenkins' and $job->frame == 'sonarqube') + { + dao::$errors[]['frame'] = $this->lang->job->mustUseJenkins; + return false; + } + + if($job->repo > 0 and $job->frame == 'sonarqube') + { + $sonarqubeJob = $this->getSonarqubeByRepo(array($job->repo)); + if(!empty($sonarqubeJob)) + { + $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); + dao::$errors[]['repo'] = $message; + return false; + } + } + if($job->triggerType == 'schedule') $job->atDay = empty($_POST['atDay']) ? '' : join(',', $this->post->atDay); $job->svnDir = ''; @@ -219,6 +238,7 @@ class jobModel extends model ->batchCheckIF($job->triggerType === 'schedule', "atDay,atTime", 'notempty') ->batchCheckIF($job->triggerType === 'commit', "comment", 'notempty') ->batchCheckIF(($this->post->repoType == 'Subversion' and $job->triggerType == 'tag'), "svnDir", 'notempty') + ->batchCheckIF($job->frame === 'sonarqube', "sonarqubeServer,projectKey", 'notempty') ->autoCheck() ->exec(); if(dao::isError()) return false; @@ -268,6 +288,24 @@ class jobModel extends model unset($job->jkTask); unset($job->gitlabRepo); + /* SonarQube tool is only used if the engine is JenKins. */ + if($job->engine != 'jenkins' and $job->frame == 'sonarqube') + { + dao::$errors[] = $this->lang->job->mustUseJenkins; + return false; + } + + if($job->repo > 0 and $job->frame == 'sonarqube') + { + $sonarqubeJob = $this->getSonarqubeByRepo(array($job->repo), $id); + if(!empty($sonarqubeJob)) + { + $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); + dao::$errors[]['repo'] = $message; + return false; + } + } + if($job->triggerType == 'schedule') $job->atDay = empty($_POST['atDay']) ? '' : join(',', $this->post->atDay); $job->svnDir = ''; @@ -304,11 +342,10 @@ class jobModel extends model $this->dao->update(TABLE_JOB)->data($job) ->batchCheck($this->config->job->edit->requiredFields, 'notempty') - ->batchCheckIF($job->triggerType === 'schedule', "atDay,atTime", 'notempty') ->batchCheckIF($job->triggerType === 'commit', "comment", 'notempty') ->batchCheckIF(($this->post->repoType == 'Subversion' and $job->triggerType == 'tag'), "svnDir", 'notempty') - + ->batchCheckIF($job->frame === 'sonarqube', "sonarqubeServer,projectKey", 'notempty') ->autoCheck() ->where('id')->eq($id) ->exec(); @@ -539,4 +576,23 @@ class jobModel extends model return ''; } + + /** + * Get sonarqube by RepoID. + * + * @param array $repoIDList + * @access public + * @return array + */ + public function getSonarqubeByRepo($repoIDList, $jobID = 0) + { + return $this->dao->select('id,name,repo')->from(TABLE_JOB) + ->where('deleted')->eq('0') + ->andWhere('frame')->eq('sonarqube') + ->andWhere('repo')->in($repoIDList) + ->beginIF($jobID > 0) + ->andWhere('id')->ne($jobID) + ->fi() + ->fetchAll('repo'); + } } diff --git a/module/job/view/create.html.php b/module/job/view/create.html.php index ac885915c0..9877deea00 100644 --- a/module/job/view/create.html.php +++ b/module/job/view/create.html.php @@ -16,6 +16,7 @@ job->dirChange);?> job->buildTag);?> +job->frameList);?>
@@ -26,7 +27,7 @@
sonarqube->name;?>sonarqube->placeholder->name}'");?>sonarqube->placeholder->name}'");?>
sonarqube->url;?>sonarqube->placeholder->url}'");?>sonarqube->placeholder->url}'");?>
sonarqube->account;?>
sonarqube->password;?>
repo->name); ?> repo->product); ?> repo->path; ?>actions; ?>actions; ?>
- + @@ -51,9 +52,13 @@ - + - + @@ -68,6 +73,20 @@ + + + + + + + + + + diff --git a/module/job/view/edit.html.php b/module/job/view/edit.html.php index 863e03f716..7703d31190 100644 --- a/module/job/view/edit.html.php +++ b/module/job/view/edit.html.php @@ -18,6 +18,8 @@ job->dirChange);?> job->buildTag);?> pipeline);?> + +job->frameList);?>
@@ -28,7 +30,7 @@
job->name; ?>job->name; ?>
job->product; ?>
job->frame; ?>job->frameList, '', "class='form-control chosen'"); ?> +
+ ''), '', "class='form-control chosen'"); ?> +
+
job->triggerType; ?>
job->sonarqubeServer;?>
job->projectKey;?> +
+ ''), '', "class='form-control chosen' required");?> +
+
job->comment;?>
- + @@ -50,9 +52,13 @@ - + - + @@ -88,6 +94,20 @@ + + + + + + + + + + diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 079a5212ec..3c72d6faaf 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -20,7 +20,7 @@ class sonarqube extends control { parent::__construct($moduleName, $methodName); - /* Optional: common::setMenuVars('devops', $this->session->repoID); */ + /* Optional: common::setMenuVars('devops', $this->session->projectID); */ $this->loadModel('ci')->setMenu(); } @@ -48,4 +48,22 @@ class sonarqube extends control $this->display(); } + + /** + * Ajax get project list. + * + * @param int $engine + * @access public + * @return void + */ + public function ajaxGetProjectList($sonarqubeID) + { + $projectList = $this->loadModel('sonarqube')->getList($sonarqubeID); + $projectPairs = array(0 => ''); + foreach($projectList as $project) + { + $projectPairs[$project->id] = $project->name; + } + echo html::select('projectKey', $projectPairs, '', "class='form-control chosen' required"); + } } diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 79f3f144dd..9c546dda95 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -27,4 +27,15 @@ class sonarqubeModel extends model return $sonarqubeList; } + + /** + * Get sonarqube pairs. + * + * @access public + * @return array + */ + public function getPairs() + { + return $this->loadModel('pipeline')->getPairs('sonarqube'); + } } diff --git a/module/sonarqube/view/browse.html.php b/module/sonarqube/view/browse.html.php index 505b2ce183..3048164339 100644 --- a/module/sonarqube/view/browse.html.php +++ b/module/sonarqube/view/browse.html.php @@ -35,7 +35,7 @@ - + From 0046f0289e7c7e4ba45b9d6027eaac8dc5cbd61e Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Wed, 12 Jan 2022 07:00:14 +0000 Subject: [PATCH 15/54] * Adjust codes. --- module/job/js/create.js | 8 ++++---- module/job/js/edit.js | 14 +++++++------- module/job/model.php | 4 +--- module/sonarqube/control.php | 13 ------------- 4 files changed, 12 insertions(+), 27 deletions(-) diff --git a/module/job/js/create.js b/module/job/js/create.js index f126d0490e..225b2d83b6 100644 --- a/module/job/js/create.js +++ b/module/job/js/create.js @@ -8,10 +8,10 @@ $(document).ready(function() { $('#frameBox .input-group').empty(); $('#frameBox .input-group').append("
"); - html = ""; + for(frame in frameList) { - if(engine == 'jenkins' || code != 'sonarqube') html += ""; + if(engine == 'jenkins' || frame != 'sonarqube') html += ""; } html += ''; @@ -186,6 +186,7 @@ $(document).ready(function() $('#jenkinsServerTR #jkTask').chosen({drop_direction: 'auto'}); }) + /* There has been a problem with handling the prompt label. */ $('#jkTaskLabel').remove(); }) @@ -216,7 +217,6 @@ $(document).ready(function() { $('#sonarProject .loading').remove(); $('#sonarProject .input-group').append(html); - $('#sonarProject #projectKey').chosen({drop_direction: 'auto'}); }) }) diff --git a/module/job/js/edit.js b/module/job/js/edit.js index cdcc48f8d4..0f799e31a2 100644 --- a/module/job/js/edit.js +++ b/module/job/js/edit.js @@ -8,14 +8,14 @@ $(document).ready(function() { $('#frameBox .input-group').empty(); $('#frameBox .input-group').append("
"); - html = ""; + for(frame in frameList) { - if(job.engine == 'jenkins' || code != 'sonarqube') + if(job.engine == 'jenkins' || frame != 'sonarqube') { - html += "
job->name;?>job->name;?> name, "class='form-control'");?>
job->product;?> product, "class='form-control chosen'");?>
job->frame;?>job->frameList, $job->frame, "class='form-control chosen'");?> +
+ ''), '', "class='form-control chosen'"); ?> +
+
job->triggerType;?>
job->sonarqubeServer;?>sonarqubeServer, "class='form-control chosen' required");?>
job->projectKey;?> +
+ ''), '', "class='form-control chosen' required");?> +
+
job->comment;?> comment, "class='form-control'");?>sonarqube->id);?> sonarqube->name);?> sonarqube->url);?>actions;?>actions;?>
+ recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?> + + + + + + + + + $sonarqubeProject): ?> + + + + + + + +
sonarqube->projectName);?>sonarqube->projectlastAnalysis);?>actions;?>
name;?>lastAnalysisDate, 0, 10);?> + createLink('sonarqube', 'deleteProject', "sonarqubeID=$sonarqubeID&project=$sonarqubeProject->key"), '', 'hiddenwin', "title='{$lang->sonarqube->deleteProject}' class='btn'"); + ?> +
+ + + + +
+ + From ff23d0118b48fdca07ba0778632492f61c9e1d89 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 09:18:50 +0000 Subject: [PATCH 19/54] * Adjust code --- module/sonarqube/js/browseproject.js | 2 +- module/sonarqube/view/browseproject.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/sonarqube/js/browseproject.js b/module/sonarqube/js/browseproject.js index 8c831b927c..edf62386c8 100644 --- a/module/sonarqube/js/browseproject.js +++ b/module/sonarqube/js/browseproject.js @@ -18,5 +18,5 @@ $(document).ready(function() */ function triggerSearch() { - $("#sonarqubeprojectForm").submit(); + $("#sonarqubeProjectForm").submit(); } diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php index 79b6529543..fa11fbda08 100644 --- a/module/sonarqube/view/browseproject.html.php +++ b/module/sonarqube/view/browseproject.html.php @@ -22,7 +22,7 @@
-
+ sonarqube->placeholderSearch}' style='display: inline-block;width:auto;margin:0 10px'");?> sonarqube->search?>
From e0fa6d70179c262d8a680be675fa0d8ceaf433b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E6=98=A5?= <563917701@qq.com> Date: Wed, 12 Jan 2022 09:19:54 +0000 Subject: [PATCH 20/54] Update model.php --- module/sonarqube/model.php | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index f0188a540a..183f75f7f6 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -71,16 +71,4 @@ class sonarqubeModel extends model $header = 'Authorization: Basic ' . $token; return json_decode(commonModel::http($url, null, array(), $header)); } - - /** - * Get a sonarqube by id. - * - * @param int $sonarqubeID - * @access public - * @return object - */ - public function getByID($sonarqubeID) - { - return $this->loadModel('pipeline')->getByID($sonarqubeID); - } } From 7679a54e9e069d13af264a754fc5edb6600c67ce Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 12 Jan 2022 09:22:12 +0000 Subject: [PATCH 21/54] * Adjust code --- module/sonarqube/view/browseproject.html.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php index fa11fbda08..e53afcd5b8 100644 --- a/module/sonarqube/view/browseproject.html.php +++ b/module/sonarqube/view/browseproject.html.php @@ -2,17 +2,15 @@ /** * The browse view file of sonarqube module of ZenTaoPMS. * - * @copyright Copyright 2009-2017 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) - * @author Gang Liu + * @author Gang Zeng * @package sonarqube * @version $Id$ * @link http://www.zentao.net */ ?> -recTotal}&recPerPage={$pager->recPerPage}&pageID=1")?> - +
+ From c2d30bc92faceeb4b954fd0a7c61ef30d4aa5b11 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Thu, 13 Jan 2022 07:43:16 +0000 Subject: [PATCH 28/54] * Modify project param. --- module/job/js/edit.js | 2 +- module/sonarqube/control.php | 2 +- module/sonarqube/model.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/job/js/edit.js b/module/job/js/edit.js index 70437e7c94..a319c9dfd5 100644 --- a/module/job/js/edit.js +++ b/module/job/js/edit.js @@ -198,7 +198,7 @@ $(document).ready(function() $(document).on('change', '#sonarqubeServer', function() { var sonarqubeID = $(this).val(); - var projectKey = sonarqubeID == job.sonarqubeServer ? btoa(job.projectKey) : ''; + var projectKey = sonarqubeID == job.sonarqubeServer ? job.projectKey.replace(/-/g, '*') : ''; $('#sonarProject #projectKey').remove(); $('#sonarProject #projectKey_chosen').remove(); $('#sonarProject .input-group').append("
"); diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index e25e7cbedd..a0e23934b0 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -65,7 +65,7 @@ class sonarqube extends control $projectPairs = array('' => ''); foreach($projectList as $project) $projectPairs[$project->key] = $project->name; - echo html::select('projectKey', $projectPairs, base64_decode($projectKey), "class='form-control chosen'"); + echo html::select('projectKey', $projectPairs, str_replace('*', '-', $projectKey), "class='form-control chosen'"); } /** diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 926e7e9ca1..fa63d830cd 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -90,7 +90,7 @@ class sonarqubeModel extends model for($i = 2; $i <= $total; $i++) { $url = sprintf($url, 'projects/search?ps=500&p=' . $i); - $pageData = json_decode(commonModel::http($url, null, array(), $header[0])); + $pageData = json_decode(commonModel::http($url, null, array(), $header)); $projectList += zget($pageData, 'components', array()); } return (array)$projectList; From 4bf49c5da7cdb7a20da0eb86301e9c08b1a3899d Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 13 Jan 2022 16:25:56 +0800 Subject: [PATCH 29/54] * Finish task #47232. --- module/action/lang/en.php | 1 + module/action/lang/zh-cn.php | 1 + module/company/view/dynamic.html.php | 8 +++++++- module/job/model.php | 8 ++++---- module/sonarqube/control.php | 21 +++++++++++++++++++++ module/sonarqube/lang/en.php | 15 ++++++++------- module/sonarqube/lang/zh-cn.php | 9 +++++---- module/sonarqube/model.php | 18 ++++++++++++++++++ 8 files changed, 65 insertions(+), 16 deletions(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 6a151aa4f7..667f8b7bbb 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -135,6 +135,7 @@ $lang->action->objectTypes['kanbanlane'] = 'Kanban Lane'; $lang->action->objectTypes['kanbancolumn'] = 'Kanban Column'; $lang->action->objectTypes['kanbancard'] = 'Kanban Card'; $lang->action->objectTypes['sonarqube'] = 'SonarQube Server'; +$lang->action->objectTypes['sonarqubeproject'] = 'SonarQube Project'; /* Used to describe operation history. */ $lang->action->desc = new stdclass(); diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 6422067636..e6fe49531b 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -135,6 +135,7 @@ $lang->action->objectTypes['kanbanlane'] = '看板泳道'; $lang->action->objectTypes['kanbancolumn'] = '看板列'; $lang->action->objectTypes['kanbancard'] = '看板卡片'; $lang->action->objectTypes['sonarqube'] = 'SonarQube服务器'; +$lang->action->objectTypes['sonarqubeproject'] = 'SonarQube项目'; /* 用来描述操作历史记录。*/ $lang->action->desc = new stdclass(); diff --git a/module/company/view/dynamic.html.php b/module/company/view/dynamic.html.php index ab820eed0b..d07b63407d 100644 --- a/module/company/view/dynamic.html.php +++ b/module/company/view/dynamic.html.php @@ -66,10 +66,14 @@ objectType == 'meeting') $tab = $action->project ? "data-app='project'" : "data-app='my'";?> objectName)) + if(empty($action->objectName) and $action->objectID) { echo '#' . $action->objectID; } + elseif(empty($action->objectID) and $action->extra) + { + echo $action->extra; + } elseif(empty($action->objectLink)) { echo $action->objectName; @@ -79,8 +83,10 @@ echo html::a($action->objectLink, $action->objectName, '', $tab); } ?> + objectID):?> objectID;?> +
diff --git a/module/job/model.php b/module/job/model.php index 8806a75d67..3fdded8db6 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -183,13 +183,13 @@ class jobModel extends model unset($job->gitlabRepo); /* SonarQube tool is only used if the engine is JenKins. */ - if($job->engine != 'jenkins' and $job->frame == 'sonarqube') + if($job->engine != 'jenkins' and $job->frame == 'sonarqube') { dao::$errors[]['frame'] = $this->lang->job->mustUseJenkins; return false; } - if($job->repo > 0 and $job->frame == 'sonarqube') + if($job->repo > 0 and $job->frame == 'sonarqube') { $sonarqubeJob = $this->getSonarqubeByRepo(array($job->repo)); if(!empty($sonarqubeJob)) @@ -289,13 +289,13 @@ class jobModel extends model unset($job->gitlabRepo); /* SonarQube tool is only used if the engine is JenKins. */ - if($job->engine != 'jenkins' and $job->frame == 'sonarqube') + if($job->engine != 'jenkins' and $job->frame == 'sonarqube') { dao::$errors[] = $this->lang->job->mustUseJenkins; return false; } - if($job->repo > 0 and $job->frame == 'sonarqube') + if($job->repo > 0 and $job->frame == 'sonarqube') { $sonarqubeJob = $this->getSonarqubeByRepo(array($job->repo), $id); if(!empty($sonarqubeJob)) diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 67535faa78..9baceb72de 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -175,4 +175,25 @@ class sonarqube extends control $this->view->orderBy = $orderBy; $this->display(); } + + /** + * Delete project. + * + * @param int $sonarqubeID + * @param string $projectKey + * @param string $confirm + * @access public + * @return void + */ + public function deleteProject($sonarqubeID, $projectKey, $confirm = 'no') + { + if($confirm != 'yes') die(js::confirm($this->lang->sonarqube->confirmDeleteProject, inlink('deleteProject', "sonarqubeID=$sonarqubeID&projectKey=$projectKey&confirm=yes"))); + + $reponse = $this->sonarqube->apiDeleteProject($sonarqubeID, $projectKey); + + if(isset($reponse->errors)) return print(js::alert($reponse->errors[0]->msg)); + + $this->loadModel('action')->create('sonarqubeproject', 0, 'deleted', '', $projectKey); + return print(js::reload('parent')); + } } diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index e997769888..eabcba69c7 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -6,13 +6,13 @@ $lang->sonarqube->search = 'Search'; $lang->sonarqube->create = 'Create SonarQube'; $lang->sonarqube->edit = 'Edit SonarQube'; $lang->sonarqube->delete = 'Delete SonarQube'; -$lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; $lang->sonarqube->browseProject = "SonarQube Project List"; $lang->sonarqube->createProject = "Create SonarQube Project"; $lang->sonarqube->deleteProject = "Delete SonarQube Project"; $lang->sonarqube->placeholderSearch = 'Project name'; $lang->sonarqube->execJob = "Exec SonarQube Job"; +$lang->sonarqube->desc = 'Description'; $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common} Name"; @@ -23,17 +23,18 @@ $lang->sonarqube->token = 'Token'; $lang->sonarqube->defaultProject = 'Default Project'; $lang->sonarqube->private = 'MD5 Verify'; -$lang->sonarqube->createServer = 'Create SonarQube Server'; -$lang->sonarqube->desc = 'Description'; -$lang->sonarqube->createSuccess = 'Create success'; +$lang->sonarqube->createServer = 'Create SonarQube Server'; +$lang->sonarqube->createSuccess = 'Create success'; $lang->sonarqube->placeholder = new stdclass; $lang->sonarqube->placeholder->name = ''; $lang->sonarqube->placeholder->url = "Please fill in the access address of the SonarQube Server homepage, as: https://sonarqube.zentao.net."; -$lang->sonarqube->repeatError = 'Server name or server address already exists!'; -$lang->sonarqube->validError = 'Sonarqube user authority authentication failed!'; -$lang->sonarqube->hostError = "Invalid SonarQube service address."; +$lang->sonarqube->repeatError = 'Server name or server address already exists!'; +$lang->sonarqube->validError = 'Sonarqube user authority authentication failed!'; +$lang->sonarqube->hostError = "Invalid SonarQube service address."; +$lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; +$lang->sonarqube->confirmDeleteProject = 'Do you want to delete this SonarQube project?'; $lang->sonarqube->projectName = 'Project Name'; $lang->sonarqube->projectlastAnalysis = 'Last analysis time'; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 5a91d937d2..f22481ae0e 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -6,7 +6,6 @@ $lang->sonarqube->search = '搜索'; $lang->sonarqube->create = '添加SonarQube'; $lang->sonarqube->edit = '编辑SonarQube'; $lang->sonarqube->delete = '删除SonarQube'; -$lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; $lang->sonarqube->browseProject = "SonarQube项目列表"; $lang->sonarqube->createProject = "创建SonarQube项目"; @@ -31,9 +30,11 @@ $lang->sonarqube->placeholder = new stdclass; $lang->sonarqube->placeholder->name = ''; $lang->sonarqube->placeholder->url = "请填写SonarQube Server首页的访问地址,如:https://sonarqube.zentao.net。"; -$lang->sonarqube->repeatError = "服务器名称或服务器地址已存在!"; -$lang->sonarqube->validError = "SonarQube 用户权限认证失败!"; -$lang->sonarqube->hostError = "无效的SonarQube服务地址。"; +$lang->sonarqube->repeatError = "服务器名称或服务器地址已存在!"; +$lang->sonarqube->validError = "SonarQube 用户权限认证失败!"; +$lang->sonarqube->hostError = "无效的SonarQube服务地址。"; +$lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; +$lang->sonarqube->confirmDeleteProject = '确认删除该SonarQube项目吗?'; $lang->sonarqube->projectName = '项目名称'; $lang->sonarqube->projectlastAnalysis = '最后执行时间'; diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 089061f014..46f33d075d 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -109,4 +109,22 @@ class sonarqubeModel extends model return $allResults; } + + /** + * Delete sonarqube project by api. + * + * @param int $sonarqubeID + * @param int $projectKey + * @access public + * @return bool|object + */ + public function apiDeleteProject($sonarqubeID, $projectKey) + { + list($apiRoot, $header) = $this->getApiBase($sonarqubeID); + if(!$apiRoot) return false; + + $url = sprintf($apiRoot, "projects/delete?project=$projectKey"); + $result = json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'POST'), $header)); + return $result; + } } From 3fcc07af28f3cc3f4478f5411d21c42c24c72a61 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 13 Jan 2022 16:55:22 +0800 Subject: [PATCH 30/54] * Adjsut code. --- module/sonarqube/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 18c140fdad..9552a47881 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -60,7 +60,7 @@ class sonarqube extends control */ public function ajaxGetProjectList($sonarqubeID, $projectKey = '') { - $projectList = $this->loadModel('sonarqube')->getAllProjectList($sonarqubeID); + $projectList = $this->loadModel('sonarqube')->apiGetProjects($sonarqubeID); $projectPairs = array('' => ''); foreach($projectList as $project) $projectPairs[$project->key] = $project->name; From 2263ecf9a4e48e0f91cd884dbc7c9b8e68495743 Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 13 Jan 2022 09:02:59 +0000 Subject: [PATCH 31/54] * Adjust code --- module/sonarqube/control.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index f84333e39a..9bb891d738 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -92,14 +92,10 @@ class sonarqube extends control if(strpos($sonarqube->url, 'http') !== 0) return $this->send(array('result' => 'fail', 'message' => array('url' => array($this->lang->sonarqube->hostError)))); /* Check name and url unique. */ - if(empty($sonarqubeID)) - { - $existSonarQube = $this->dao->select('*')->from(TABLE_PIPELINE)->where("type='sonarqube' and (name='{$sonarqube->name}' or url='{$sonarqube->url}')")->fetch(); - } - else - { - $existSonarQube = $this->dao->select('*')->from(TABLE_PIPELINE)->where("id!={$sonarqubeID} and type='sonarqube' and (name='{$sonarqube->name}' or url='{$sonarqube->url}')")->fetch(); - } + $existSonarQube = $this->dao->select('*')->from(TABLE_PIPELINE) + ->where("type='sonarqube' and (name='{$sonarqube->name}' or url='{$sonarqube->url}')") + ->beginIF(!empty($sonarqubeID))->andWhere('id')->ne($sonarqubeID)->fi() + ->fetch(); if(isset($existSonarQube->name) and $existSonarQube->name == $sonarqube->name) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->nameRepeatError)); if(isset($existSonarQube->url) and $existSonarQube->url== $sonarqube->url) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->urlRepeatError)); From e0b65585d769283f4e8c09ee5127fb7805c29c59 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 13 Jan 2022 17:22:05 +0800 Subject: [PATCH 32/54] * Finish task #47232. --- module/sonarqube/control.php | 4 +++- module/sonarqube/view/browseproject.html.php | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 9baceb72de..89da1b558e 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -189,7 +189,9 @@ class sonarqube extends control { if($confirm != 'yes') die(js::confirm($this->lang->sonarqube->confirmDeleteProject, inlink('deleteProject', "sonarqubeID=$sonarqubeID&projectKey=$projectKey&confirm=yes"))); - $reponse = $this->sonarqube->apiDeleteProject($sonarqubeID, $projectKey); + /* Fix error when request type is PATH_INFO and the tag name contains '-'.*/ + $projectKey = str_replace('*', '-', $projectKey); + $reponse = $this->sonarqube->apiDeleteProject($sonarqubeID, $projectKey); if(isset($reponse->errors)) return print(js::alert($reponse->errors[0]->msg)); diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php index e53afcd5b8..bd18482b39 100644 --- a/module/sonarqube/view/browseproject.html.php +++ b/module/sonarqube/view/browseproject.html.php @@ -58,7 +58,9 @@ lastAnalysisDate, 0, 10);?> createLink('sonarqube', 'deleteProject', "sonarqubeID=$sonarqubeID&project=$sonarqubeProject->key"), '', 'hiddenwin', "title='{$lang->sonarqube->deleteProject}' class='btn'"); + /* Fix error when request type is PATH_INFO and the project key contains '-'.*/ + $projectKey = str_replace('-', '*', $sonarqubeProject->key); + if(common::hasPriv('sonarqube', 'deleteProject')) echo html::a($this->createLink('sonarqube', 'deleteProject', "sonarqubeID=$sonarqubeID&project=$projectKey"), '', 'hiddenwin', "title='{$lang->sonarqube->deleteProject}' class='btn'"); ?> From 0fc8a059b8b64754bce9bc9e11343b0ae2ce4668 Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 13 Jan 2022 09:32:02 +0000 Subject: [PATCH 33/54] * Adjust code --- module/sonarqube/view/browseproject.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php index 31d866f8f6..c75b3ae4b7 100644 --- a/module/sonarqube/view/browseproject.html.php +++ b/module/sonarqube/view/browseproject.html.php @@ -60,7 +60,7 @@ lastAnalysisDate, 0, 10);?> createLink('sonarqube', 'deleteProject', "sonarqubeID=$sonarqubeID&project=$sonarqubeProject->key"), '', 'hiddenwin', "title='{$lang->sonarqube->deleteProject}' class='btn'"); + common::printLink('sonarqube', 'deleteProject', "sonarqubeID=$sonarqubeID&project=$sonarqubeProject->key", " ", 'hiddenwin', "title='{$lang->sonarqube->deleteProject}' class='btn btn-primary'"); ?> From 770bba77191548efeab60395d5959050e020c428 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 14 Jan 2022 01:19:40 +0000 Subject: [PATCH 34/54] * Modify trash locate. --- module/action/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/action/config.php b/module/action/config.php index 4a34009243..940dbfaf97 100755 --- a/module/action/config.php +++ b/module/action/config.php @@ -56,4 +56,4 @@ $config->action->majorList['execution'] = array('opened', 'edited'); $config->action->needGetProjectType = 'build,task,bug,case,testcase,caselib,testtask,testsuite,testreport,doc,issue,release,risk,design,opportunity,trainplan,gapanalysis,researchplan,researchreport,'; $config->action->needGetRelateField = ',story,productplan,release,task,build,bug,case,testtask,testreport,doc,doclib,issue,risk,opportunity,trainplan,gapanalysis,team,whitelist,researchplan,researchreport,meeting,kanbanlane,kanbancolumn,'; -$config->action->noLinkModules = ',doclib,module,webhook,gitlab,pipeline,jenkins,kanban,kanbanspace,kanbancolumn,kanbanlane,kanbanregion,kanbancard,execution,project,'; +$config->action->noLinkModules = ',doclib,module,webhook,gitlab,sonarqube,pipeline,jenkins,kanban,kanbanspace,kanbancolumn,kanbanlane,kanbanregion,kanbancard,execution,project,'; From f8f71f59af0aefc6eaea7456e0d842ad3826b55d Mon Sep 17 00:00:00 2001 From: liyuchun Date: Fri, 14 Jan 2022 09:21:04 +0800 Subject: [PATCH 35/54] * Finish task #47233. --- module/job/model.php | 18 ++++++++++++++++++ module/sonarqube/control.php | 8 +++++++- module/sonarqube/view/browseproject.html.php | 5 +++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/module/job/model.php b/module/job/model.php index 3fdded8db6..bf4b7e9b24 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -593,4 +593,22 @@ class jobModel extends model ->beginIF($jobID > 0)->andWhere('id')->ne($jobID)->fi() ->fetchAll('repo'); } + + /** + * Get job pairs by sonarqube projectkeys. + * + * @param int $sonarqubeID + * @param array $projectKeys + * @access public + * @return array + */ + public function getJobBySonarqubeProject($sonarqubeID, $projectKeys = array()) + { + return $this->dao->select('projectKey,id')->from(TABLE_JOB) + ->where('deleted')->eq(0) + ->andWhere('frame')->eq('sonarqube') + ->andWhere('sonarqubeServer')->eq($sonarqubeID) + ->andWhere('projectKey')->in($projectKeys) + ->fetchPairs(); + } } diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index e49eb0276e..d14caa9713 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -201,7 +201,12 @@ class sonarqube extends control $keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); $sonarqubeProjectList = $this->sonarqube->apiGetProjects($sonarqubeID, $keyword); - foreach($sonarqubeProjectList as $key => $sonarqubeProject) !isset($sonarqubeProject->lastAnalysisDate) ? $sonarqubeProject->lastAnalysisDate = '' : ''; + $projectKeyList = array(); + foreach($sonarqubeProjectList as $key => $sonarqubeProject) + { + if(!isset($sonarqubeProject->lastAnalysisDate)) $sonarqubeProject->lastAnalysisDate = ''; + $projectKeyList[] = $sonarqubeProject->key; + } /* Data sort. */ list($order, $sort) = explode('_', $orderBy); @@ -221,6 +226,7 @@ class sonarqube extends control $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->browseProject; $this->view->sonarqubeID = $sonarqubeID; $this->view->sonarqubeProjectList = empty($sonarqubeProjectList) ? $sonarqubeProjectList: $sonarqubeProjectList[$pageID - 1]; + $this->view->projectJobPairs = $this->loadModel('job')->getJobBySonarqubeProject($sonarqubeID, $projectKeyList); $this->view->orderBy = $orderBy; $this->display(); } diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php index e5b8b19bb6..f5995930d7 100644 --- a/module/sonarqube/view/browseproject.html.php +++ b/module/sonarqube/view/browseproject.html.php @@ -63,6 +63,11 @@ /* Fix error when request type is PATH_INFO and the project key contains '-'.*/ $projectKey = str_replace('-', '*', $sonarqubeProject->key); common::printLink('sonarqube', 'deleteProject', "sonarqubeID=$sonarqubeID&project=$projectKey", " ", 'hiddenwin', "title='{$lang->sonarqube->deleteProject}' class='btn btn-primary'"); + if(isset($projectJobPairs[$sonarqubeProject->key])) + { + $jobID = $projectJobPairs[$sonarqubeProject->key]; + common::printIcon('sonarqube', 'execJob', "jobID=$jobID", '', 'list', 'sonarqube', 'hiddenwin'); + } ?> From f8ef544d94d276d8c4d441eac1913fbd6376642e Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 14 Jan 2022 01:54:48 +0000 Subject: [PATCH 36/54] * Adjust code and fix bugs --- module/group/lang/resource.php | 2 -- module/sonarqube/control.php | 9 ++++++--- module/sonarqube/view/browseproject.html.php | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index dfc9a16248..c9c462dcbb 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1389,7 +1389,6 @@ $lang->resource->sonarqube->create = 'create'; $lang->resource->sonarqube->edit = 'edit'; $lang->resource->sonarqube->delete = 'delete'; $lang->resource->sonarqube->browseProject = 'browseProject'; -$lang->resource->sonarqube->createProject = 'createProject'; $lang->resource->sonarqube->deleteProject = 'deleteProject'; $lang->resource->sonarqube->execJob = 'execJob'; @@ -1398,7 +1397,6 @@ $lang->sonarqube->methodOrder[10] = 'create'; $lang->sonarqube->methodOrder[15] = 'edit'; $lang->sonarqube->methodOrder[20] = 'delete'; $lang->sonarqube->methodOrder[25] = 'browseProject'; -$lang->sonarqube->methodOrder[30] = 'createProject'; $lang->sonarqube->methodOrder[35] = 'deleteProject'; $lang->sonarqube->methodOrder[40] = 'execJob'; diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index d14caa9713..c28cd62e5d 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -101,17 +101,20 @@ class sonarqube extends control protected function checkToken($sonarqubeID = 0) { $sonarqube = fixer::input('post')->get(); - $this->dao->update('sonarqube')->data($sonarqube)->batchCheck(empty($sonarqubeID) ? $this->config->sonarqube->create->requiredFields : $this->config->sonarqube->edit->requiredFields, 'notempty'); + $this->dao->update('sonarqube')->data($sonarqube) + ->batchCheck(empty($sonarqubeID) ? $this->config->sonarqube->create->requiredFields : $this->config->sonarqube->edit->requiredFields, 'notempty') + ->batchCheck("url", 'URL'); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if(strpos($sonarqube->url, 'http') !== 0) return $this->send(array('result' => 'fail', 'message' => array('url' => array($this->lang->sonarqube->hostError)))); /* Check name and url unique. */ $existSonarQube = $this->dao->select('*')->from(TABLE_PIPELINE) ->where("type='sonarqube' and (name='{$sonarqube->name}' or url='{$sonarqube->url}')") + ->andWhere('deleted')->eq('0') ->beginIF(!empty($sonarqubeID))->andWhere('id')->ne($sonarqubeID)->fi() ->fetch(); if(isset($existSonarQube->name) and $existSonarQube->name == $sonarqube->name) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->nameRepeatError)); - if(isset($existSonarQube->url) and $existSonarQube->url== $sonarqube->url) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->urlRepeatError)); + if(isset($existSonarQube->url) and $existSonarQube->url == $sonarqube->url) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->urlRepeatError)); $token = base64_encode("{$sonarqube->account}:{$sonarqube->password}"); $result = $this->sonarqube->apiValidate($sonarqube->url, $token); @@ -225,7 +228,7 @@ class sonarqube extends control $this->view->pager = $pager; $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->browseProject; $this->view->sonarqubeID = $sonarqubeID; - $this->view->sonarqubeProjectList = empty($sonarqubeProjectList) ? $sonarqubeProjectList: $sonarqubeProjectList[$pageID - 1]; + $this->view->sonarqubeProjectList = (empty($sonarqubeProjectList) or empty($sonarqubeProjectList[$pageID - 1])) ? array() : $sonarqubeProjectList[$pageID - 1]; $this->view->projectJobPairs = $this->loadModel('job')->getJobBySonarqubeProject($sonarqubeID, $projectKeyList); $this->view->orderBy = $orderBy; $this->display(); diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php index f5995930d7..f068913912 100644 --- a/module/sonarqube/view/browseproject.html.php +++ b/module/sonarqube/view/browseproject.html.php @@ -26,7 +26,7 @@
-
+
" . $lang->sonarqube->createProject, '', "class='btn btn-primary'");?>
@@ -35,7 +35,7 @@

noData;?> - createLink('sonarqube', 'createProject', "sonarqubeID=$sonarqubeID"), " " . $lang->sonarqube->createProject, '', "class='btn btn-info'");?> + createLink('sonarqube', 'createProject', "sonarqubeID=$sonarqubeID"), " " . $lang->sonarqube->createProject, '', "class='btn btn-info'");?>

From 48bdba2a968ae1bedbc4eaa007cc989522fb996a Mon Sep 17 00:00:00 2001 From: liyuchun Date: Fri, 14 Jan 2022 10:47:41 +0800 Subject: [PATCH 37/54] * Fix error. --- module/pipeline/model.php | 8 ++++---- module/sonarqube/control.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/module/pipeline/model.php b/module/pipeline/model.php index 458811ee5e..1e42120602 100644 --- a/module/pipeline/model.php +++ b/module/pipeline/model.php @@ -76,7 +76,7 @@ class pipelineModel extends model ->add('private',md5(rand(10,113450))) ->add('createdBy', $this->app->user->account) ->add('createdDate', helper::now()) - ->trim('token') + ->trim('url,token,account,password') ->skipSpecial('url,token,account,password') ->get(); if($type == 'gitlab') $pipeline->url = rtrim($pipeline->url, '/'); @@ -105,7 +105,7 @@ class pipelineModel extends model $pipeline = fixer::input('post') ->add('editedBy', $this->app->user->account) ->add('editedDate', helper::now()) - ->trim('token') + ->trim('url,token,account,password') ->skipSpecial('url,token,account,password') ->get(); @@ -127,9 +127,9 @@ class pipelineModel extends model * Delete one record. * * @param string $id the id to be deleted - * @param string $object the action object + * @param string $object the action object * @access public - * @return int + * @return int */ public function delete($id, $object = 'gitlab') { diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index d14caa9713..bcdda4b11a 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -100,7 +100,7 @@ class sonarqube extends control */ protected function checkToken($sonarqubeID = 0) { - $sonarqube = fixer::input('post')->get(); + $sonarqube = fixer::input('post')->trim('url,token,account,password')->get(); $this->dao->update('sonarqube')->data($sonarqube)->batchCheck(empty($sonarqubeID) ? $this->config->sonarqube->create->requiredFields : $this->config->sonarqube->edit->requiredFields, 'notempty'); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if(strpos($sonarqube->url, 'http') !== 0) return $this->send(array('result' => 'fail', 'message' => array('url' => array($this->lang->sonarqube->hostError)))); From 41b7d853d354858962a3f6f546667babe6d494e1 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 14 Jan 2022 03:16:55 +0000 Subject: [PATCH 38/54] * Fix bug #18454. --- module/sonarqube/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 46f33d075d..854d6bd657 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -60,7 +60,7 @@ class sonarqubeModel extends model public function getApiBase($sonarqubeID) { $sonarqube = $this->getByID($sonarqubeID); - if(!$sonarqube) return ''; + if(!$sonarqube) return array('', array('')); $url = rtrim($sonarqube->url, '/') . '/api/%s'; $header[] = 'Authorization: Basic ' . $sonarqube->token; From 0be41abb83249c05a69792fd8749a30adcd5fe12 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 14 Jan 2022 03:22:47 +0000 Subject: [PATCH 39/54] * Fix bug #18442. --- module/job/js/create.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/module/job/js/create.js b/module/job/js/create.js index 3bff90333d..d147f5fc70 100644 --- a/module/job/js/create.js +++ b/module/job/js/create.js @@ -18,6 +18,8 @@ $(document).ready(function() $('#frameBox .loading').remove(); $('#frameBox .input-group').append(html); $('#frameBox #frame').chosen(); + + $('#frame').change(); } getFrameSelect(''); @@ -241,10 +243,10 @@ $(document).ready(function() $('tr.gitlabRepo').hide(); $('tr.commonRepo').show(); } + getFrameSelect(engine); }); $('#engine').change(); - $('#triggerType').change(); }); From 19905f7edac054c45914eaf250e95dfef78f92b2 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Fri, 14 Jan 2022 11:26:28 +0800 Subject: [PATCH 40/54] * Fix bug #18450,18447. --- module/action/lang/en.php | 6 ++++++ module/action/lang/zh-cn.php | 6 ++++++ module/job/control.php | 6 +++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 7cda117c50..3e631bf71f 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -571,6 +571,12 @@ $lang->action->dynamicAction->user['loginxuanxuan'] = 'Login Desktop'; $lang->action->dynamicAction->entry['created'] = 'Add Application'; $lang->action->dynamicAction->entry['edited'] = 'Edit Application'; +$lang->action->dynamicAction->job['created'] = 'Create Job'; +$lang->action->dynamicAction->job['edited'] = 'Edit Job'; +$lang->action->dynamicAction->job['executed'] = 'Execute Job'; +$lang->action->dynamicAction->job['deleted'] = 'Delete Job'; +$lang->action->dynamicAction->job['undeleted'] = 'Undelete Job'; + $lang->action->dynamicAction->sonarqube['created'] = 'Create SonarQube Server'; $lang->action->dynamicAction->sonarqube['edited'] = 'Edit SonarQube Server'; $lang->action->dynamicAction->sonarqube['deleted'] = 'Delete SonarQube Server'; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index eded439ac1..ffc2876bf6 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -571,6 +571,12 @@ $lang->action->dynamicAction->user['loginxuanxuan'] = '登录客户端'; $lang->action->dynamicAction->entry['created'] = '添加应用'; $lang->action->dynamicAction->entry['edited'] = '编辑应用'; +$lang->action->dynamicAction->job['created'] = '创建构建任务'; +$lang->action->dynamicAction->job['edited'] = '编辑构建任务'; +$lang->action->dynamicAction->job['executed'] = '执行构建任务'; +$lang->action->dynamicAction->job['deleted'] = '删除构建任务'; +$lang->action->dynamicAction->job['undeleted'] = '还原构建任务'; + $lang->action->dynamicAction->sonarqube['created'] = '创建SonarQube服务器'; $lang->action->dynamicAction->sonarqube['edited'] = '设置SonarQube服务器'; $lang->action->dynamicAction->sonarqube['deleted'] = '删除SonarQube服务器'; diff --git a/module/job/control.php b/module/job/control.php index d3ed975c64..53f900220c 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -88,6 +88,8 @@ class job extends control } return $this->send(array('result' => 'fail', 'message' => $errors)); } + + $this->loadModel('action')->create('job', $jobID, 'created'); if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $jobID)); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); } @@ -163,6 +165,8 @@ class job extends control } return $this->send(array('result' => 'fail', 'message' => $errors)); } + + $this->loadModel('action')->create('job', $id, 'edited'); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); } @@ -427,7 +431,7 @@ class job extends control public function ajaxCheckSonarqubeLink($repoID, $jobID = 0) { $repo = $this->loadModel('job')->getSonarqubeByRepo(array($repoID), $jobID); - if(!empty($repo)) + if(!empty($repo)) { $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); $this->send(array('result' => 'fail', 'message' => $message)); From 20f291b9b2c4ea1fcdbb8cd02ced6092cac8349e Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 14 Jan 2022 06:52:35 +0000 Subject: [PATCH 41/54] * Fix bug #18448. --- module/job/control.php | 6 +++--- module/job/lang/en.php | 1 + module/job/lang/zh-cn.php | 1 + module/job/model.php | 31 +++++++++++++++++++++++++++---- module/sonarqube/control.php | 10 ++++++++-- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/module/job/control.php b/module/job/control.php index d3ed975c64..53343533dc 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -121,7 +121,7 @@ class job extends control $this->view->products = array(0 => '') + $this->loadModel('product')->getProductPairsByProject($this->projectID); $this->view->jenkinsServerList = array('' => '') + $this->loadModel('jenkins')->getPairs(); - $this->view->sonarqubeServerList = array('' => '') + $this->loadModel('sonarqube')->getPairs(); + $this->view->sonarqubeServerList = array('') + $this->loadModel('sonarqube')->getPairs(); $this->display(); } @@ -198,9 +198,9 @@ class job extends control $this->view->repoTypes = $repoTypes; $this->view->repoType = zget($repoTypes, $job->repo, 'Git'); $this->view->job = $job; - $this->view->products = array(0 => '') + $products; + $this->view->products = array('') + $products; $this->view->jenkinsServerList = $this->loadModel('jenkins')->getPairs(); - $this->view->sonarqubeServerList = array('' => '') + $this->loadModel('sonarqube')->getPairs(); + $this->view->sonarqubeServerList = array('') + $this->loadModel('sonarqube')->getPairs(); $this->view->pipelines = $this->jenkins->getTasks($job->server); $this->display(); diff --git a/module/job/lang/en.php b/module/job/lang/en.php index 5aa7bb3833..bb21e8847e 100644 --- a/module/job/lang/en.php +++ b/module/job/lang/en.php @@ -57,6 +57,7 @@ $lang->job->sendExec = 'Send execute request success.'; $lang->job->inputName = 'Please enter parameter name.'; $lang->job->invalidName = 'The parameter name should be letters, numbers or underlines.'; $lang->job->repoExists = 'This repository has a build task associated with it『%s』'; +$lang->job->projectExists = 'This SonarQube Project has a build task associated with it『%s』'; $lang->job->mustUseJenkins = 'SonarQube frame is only used if the build engine is JenKins.'; $lang->job->buildTypeList['build'] = 'Only Build'; diff --git a/module/job/lang/zh-cn.php b/module/job/lang/zh-cn.php index 1994eab804..a109e455bb 100644 --- a/module/job/lang/zh-cn.php +++ b/module/job/lang/zh-cn.php @@ -57,6 +57,7 @@ $lang->job->sendExec = '发送执行请求成功!执行结果:%s'; $lang->job->inputName = '请输入参数名称。'; $lang->job->invalidName = '参数名称应该是英文字母、数字或下划线的组合。'; $lang->job->repoExists = '此版本库已关联构建任务『%s』'; +$lang->job->projectExists = '此SonarQube项目已关联构建任务『%s』'; $lang->job->mustUseJenkins = 'SonarQube工具/框架仅在构建引擎为JenKins的情况下使用'; $lang->job->buildTypeList['build'] = '仅构建'; diff --git a/module/job/model.php b/module/job/model.php index bf4b7e9b24..7a72790577 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -194,12 +194,23 @@ class jobModel extends model $sonarqubeJob = $this->getSonarqubeByRepo(array($job->repo)); if(!empty($sonarqubeJob)) { - $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); + $message = sprintf($this->lang->job->repoExists, $sonarqubeJob[$job->repo]->id . '-' . $sonarqubeJob[$job->repo]->name); dao::$errors[]['repo'] = $message; return false; } } + if(!empty($job->projectKey) and $job->frame == 'sonarqube') + { + $projectList = $this->getJobBySonarqubeProject($job->sonarqubeServer, array($job->projectKey)); + if(!empty($projectList)) + { + $message = sprintf($this->lang->job->projectExists, $projectList[$job->projectKey]->id); + dao::$errors[]['projectKey'] = $message; + return false; + } + } + if($job->triggerType == 'schedule') $job->atDay = empty($_POST['atDay']) ? '' : join(',', $this->post->atDay); $job->svnDir = ''; @@ -300,12 +311,23 @@ class jobModel extends model $sonarqubeJob = $this->getSonarqubeByRepo(array($job->repo), $id); if(!empty($sonarqubeJob)) { - $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); + $message = sprintf($this->lang->job->repoExists, $sonarqubeJob[$job->repo]->id . '-' . $sonarqubeJob[$job->repo]->name); dao::$errors[]['repo'] = $message; return false; } } + if(!empty($job->projectKey) and $job->frame == 'sonarqube') + { + $projectList = $this->getJobBySonarqubeProject($job->sonarqubeServer, array($job->projectKey)); + if(!empty($projectList) && $projectList[$job->projectKey]->id != $id) + { + $message = sprintf($this->lang->job->projectExists, $projectList[$job->projectKey]->id); + dao::$errors[]['projectKey'] = $message; + return false; + } + } + if($job->triggerType == 'schedule') $job->atDay = empty($_POST['atDay']) ? '' : join(',', $this->post->atDay); $job->svnDir = ''; @@ -599,16 +621,17 @@ class jobModel extends model * * @param int $sonarqubeID * @param array $projectKeys + * @param bool $emptyShowAll * @access public * @return array */ - public function getJobBySonarqubeProject($sonarqubeID, $projectKeys = array()) + public function getJobBySonarqubeProject($sonarqubeID, $projectKeys = array(), $emptyShowAll = false) { return $this->dao->select('projectKey,id')->from(TABLE_JOB) ->where('deleted')->eq(0) ->andWhere('frame')->eq('sonarqube') ->andWhere('sonarqubeServer')->eq($sonarqubeID) - ->andWhere('projectKey')->in($projectKeys) + ->beginIF(!empty($projectKeys) or !$emptyShowAll)->andWhere('projectKey')->in($projectKeys)->fi() ->fetchPairs(); } } diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 84b57e577b..c0e3d22fac 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -60,10 +60,16 @@ class sonarqube extends control */ public function ajaxGetProjectList($sonarqubeID, $projectKey = '') { - $projectList = $this->loadModel('sonarqube')->apiGetProjects($sonarqubeID); + $jobPairs = $this->loadModel('job')->getJobBySonarqubeProject($sonarqubeID, array(), true); + $existsProject = array_diff(array_keys($jobPairs), array($projectKey)); + + $projectList = $this->sonarqube->apiGetProjects($sonarqubeID); $projectPairs = array('' => ''); - foreach($projectList as $project) $projectPairs[$project->key] = $project->name; + foreach($projectList as $project) + { + if(!empty($project) and !in_array($project->key, $existsProject)) $projectPairs[$project->key] = $project->name; + } echo html::select('projectKey', $projectPairs, str_replace('*', '-', $projectKey), "class='form-control chosen'"); } From 3630c5f718594e5b3237e1f276c97a0bbe6cbf9d Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 14 Jan 2022 09:09:25 +0000 Subject: [PATCH 42/54] * Unit test --- test/data/pipeline.yaml | 18 +++++++------- test/data/zentao/config.php | 2 +- test/model/sonarqube/apigetprojects.php | 32 +++++++++++++++++++++++++ test/model/sonarqube/getapibase.php | 25 +++++++++++++++++++ 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 test/model/sonarqube/apigetprojects.php create mode 100644 test/model/sonarqube/getapibase.php diff --git a/test/data/pipeline.yaml b/test/data/pipeline.yaml index 1f79677b14..db7e26cd29 100644 --- a/test/data/pipeline.yaml +++ b/test/data/pipeline.yaml @@ -3,24 +3,24 @@ author: Zeng gang version: "1.0" fields: - field: id - range: 1 + range: 1-2 - field: type - range: gitlab + range: gitlabi,sonarqube - field: name - range: gitlab服务器 + range: gitlab服务器,sonarqube服务器 - field: url - range: [http://192.168.1.161:51080] + range: [http://192.168.1.161:51080],[http://192.168.1.161:59001] - field: account - range: [] + range: [],[admin] - field: password - range: [] + range: [],[UDJzc3cwcmQ=] - field: token - range: x88fZokrp5hShia2jyBN + range: x88fZokrp5hShia2jyBN,YWRtaW46UDJzc3cwcmQ= - field: private - range: 08bcc98f75d7d40053dc80722bdc117b + range: 08bcc98f75d7d40053dc80722bdc117b,228b25587479f2fc7570428e8bcbabdc - field: createdBy range: admin - field: createdDate - range: [2021-12-09 11:23:35] + range: [2021-12-09 11:23:35],[2022-01-12 08:47:37] - field: deleted range: 0 diff --git a/test/data/zentao/config.php b/test/data/zentao/config.php index 9352cfc25a..57e122eb98 100644 --- a/test/data/zentao/config.php +++ b/test/data/zentao/config.php @@ -16,6 +16,6 @@ $builder->branch = array('rows' => 240, 'extends' => array('branch')); $builder->build = array('rows' => 8, 'extends' => array('build')); $builder->release = array('rows' => 8, 'extends' => array('release')); -$builder->pipeline = array('rows' => 1, 'extends' => array('pipeline')); +$builder->pipeline = array('rows' => 2, 'extends' => array('pipeline')); $builder->repo = array('rows' => 1, 'extends' => array('repo')); $builder->mr = array('rows' => 1, 'extends' => array('mr')); diff --git a/test/model/sonarqube/apigetprojects.php b/test/model/sonarqube/apigetprojects.php new file mode 100644 index 0000000000..77404afa4c --- /dev/null +++ b/test/model/sonarqube/apigetprojects.php @@ -0,0 +1,32 @@ +#!/usr/bin/env php +> 1 +通过sonarqubeID,获取SonarQube项目数量 >> 1 +通过sonarqubeID,关键字,搜索获取SonarQube项目 >> 1 +当sonarqubeID为0时,获取SonarQube项目列表 >> return empty + +*/ + +$sonarqube = $tester->loadModel('sonarqube'); + +$sonarqubeID = 2; +$result = $sonarqube->apiGetProjects($sonarqubeID); +r(isset($result[0]->name)) && p() && e(1); //通过sonarqubeID,获取SonarQube项目列表 +r(count($result) > 0) && p() && e(1); //通过sonarqubeID,获取SonarQube项目数量 + +$keyword = '02'; +$result = $sonarqube->apiGetProjects($sonarqubeID, $keyword); +r(strpos($result[0]->name, '02') !== false) && p() && e(1); //通过sonarqubeID,关键字,搜索获取SonarQube项目 + +$sonarqubeID = 0; +$result = $sonarqube->apiGetProjects($sonarqubeID); +if(empty($result)) $result = 'return empty'; +r($result) && p() && e('return empty'); //当sonarqubeID为0时,获取SonarQube项目列表 diff --git a/test/model/sonarqube/getapibase.php b/test/model/sonarqube/getapibase.php new file mode 100644 index 0000000000..1bd28ff870 --- /dev/null +++ b/test/model/sonarqube/getapibase.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +> http://192.168.1.161:59001/api/%s +当sonarqubeID为0时,获取SonarQube url和header >> return empty + +*/ + +$sonarqube = $tester->loadModel('sonarqube'); + +$sonarqubeID = 2; +list($apiRoot, $header) = $sonarqube->getApiBase($sonarqubeID); +r($apiRoot) && p() && e('http://192.168.1.161:59001/api/%s'); //通过sonarqubeID,获取SonarQube url和header + +$sonarqubeID = 0; +list($apiRoot, $header) = $sonarqube->getApiBase($sonarqubeID); +if(empty($apiRoot)) $result = 'return empty'; +r($result) && p() && e('return empty'); //当sonarqubeID为0时,获取SonarQube url和header From 07ba811bc2597e5ed4585152b46a11f3a87ec768 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Mon, 17 Jan 2022 01:22:51 +0000 Subject: [PATCH 43/54] * Modify trash data tips. --- module/job/control.php | 4 ++-- module/job/lang/en.php | 1 + module/job/lang/zh-cn.php | 1 + module/job/model.php | 10 ++++++---- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/module/job/control.php b/module/job/control.php index 53343533dc..061d5a9195 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -426,10 +426,10 @@ class job extends control */ public function ajaxCheckSonarqubeLink($repoID, $jobID = 0) { - $repo = $this->loadModel('job')->getSonarqubeByRepo(array($repoID), $jobID); + $repo = $this->loadModel('job')->getSonarqubeByRepo(array($repoID), $jobID, true); if(!empty($repo)) { - $message = sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); + $message = $repo[$repoID]->deleted ? $this->lang->job->jobIsDeleted : sprintf($this->lang->job->repoExists, $repo[$repoID]->id . '-' . $repo[$repoID]->name); $this->send(array('result' => 'fail', 'message' => $message)); } $this->send(array('result' => 'success', 'message' => '')); diff --git a/module/job/lang/en.php b/module/job/lang/en.php index bb21e8847e..e8b58344a5 100644 --- a/module/job/lang/en.php +++ b/module/job/lang/en.php @@ -59,6 +59,7 @@ $lang->job->invalidName = 'The parameter name should be letters, numbers or u $lang->job->repoExists = 'This repository has a build task associated with it『%s』'; $lang->job->projectExists = 'This SonarQube Project has a build task associated with it『%s』'; $lang->job->mustUseJenkins = 'SonarQube frame is only used if the build engine is JenKins.'; +$lang->job->jobIsDeleted = 'This repository is associated with a build task, please view the data from the recycle bin'; $lang->job->buildTypeList['build'] = 'Only Build'; $lang->job->buildTypeList['buildAndDeploy'] = 'Build And Deploy'; diff --git a/module/job/lang/zh-cn.php b/module/job/lang/zh-cn.php index a109e455bb..5f7bb63f04 100644 --- a/module/job/lang/zh-cn.php +++ b/module/job/lang/zh-cn.php @@ -59,6 +59,7 @@ $lang->job->invalidName = '参数名称应该是英文字母、数字或下 $lang->job->repoExists = '此版本库已关联构建任务『%s』'; $lang->job->projectExists = '此SonarQube项目已关联构建任务『%s』'; $lang->job->mustUseJenkins = 'SonarQube工具/框架仅在构建引擎为JenKins的情况下使用'; +$lang->job->jobIsDeleted = '此版本库已关联构建任务,请从回收站查看数据'; $lang->job->buildTypeList['build'] = '仅构建'; $lang->job->buildTypeList['buildAndDeploy'] = '构建部署'; diff --git a/module/job/model.php b/module/job/model.php index 7a72790577..1e416f67da 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -603,15 +603,17 @@ class jobModel extends model * Get sonarqube by RepoID. * * @param array $repoIDList + * @param int $jobID + * @param bool $showDeleted * @access public * @return array */ - public function getSonarqubeByRepo($repoIDList, $jobID = 0) + public function getSonarqubeByRepo($repoIDList, $jobID = 0, $showDeleted = false) { - return $this->dao->select('id,name,repo')->from(TABLE_JOB) - ->where('deleted')->eq('0') - ->andWhere('frame')->eq('sonarqube') + return $this->dao->select('id,name,repo,deleted')->from(TABLE_JOB) + ->where('frame')->eq('sonarqube') ->andWhere('repo')->in($repoIDList) + ->beginIF(!$showDeleted)->andWhere('deleted')->eq('0')->fi() ->beginIF($jobID > 0)->andWhere('id')->ne($jobID)->fi() ->fetchAll('repo'); } From 46fda606475e236124637e5bf27efec9f7de0df3 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Mon, 17 Jan 2022 01:57:23 +0000 Subject: [PATCH 44/54] * Modify return value. --- module/sonarqube/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 854d6bd657..ebdbddc79c 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -60,7 +60,7 @@ class sonarqubeModel extends model public function getApiBase($sonarqubeID) { $sonarqube = $this->getByID($sonarqubeID); - if(!$sonarqube) return array('', array('')); + if(!$sonarqube) return array('', array()); $url = rtrim($sonarqube->url, '/') . '/api/%s'; $header[] = 'Authorization: Basic ' . $sonarqube->token; From 5724bd4fc5c6733b88af7999ad6f2d9793b98ea6 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Mon, 17 Jan 2022 13:37:11 +0800 Subject: [PATCH 45/54] * Fix bug #18435,#18437. --- module/action/lang/en.php | 2 ++ module/action/lang/zh-cn.php | 2 ++ module/block/view/dynamic.html.php | 1 + module/common/lang/menu.php | 23 ++++++++++++----------- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 3e631bf71f..bde1c19b3d 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -581,6 +581,8 @@ $lang->action->dynamicAction->sonarqube['created'] = 'Create SonarQube Server'; $lang->action->dynamicAction->sonarqube['edited'] = 'Edit SonarQube Server'; $lang->action->dynamicAction->sonarqube['deleted'] = 'Delete SonarQube Server'; +$lang->action->dynamicAction->sonarqubeproject['deleted'] = 'Delete SonarQube Project'; + $lang->action->dynamicAction->gitlab['created'] = 'Create GitLab Server'; $lang->action->dynamicAction->gitlab['edited'] = 'Edit GitLab Server'; $lang->action->dynamicAction->gitlab['deleted'] = 'Delete GitLab Server'; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index ffc2876bf6..98679d3045 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -581,6 +581,8 @@ $lang->action->dynamicAction->sonarqube['created'] = '创建SonarQube服务器'; $lang->action->dynamicAction->sonarqube['edited'] = '设置SonarQube服务器'; $lang->action->dynamicAction->sonarqube['deleted'] = '删除SonarQube服务器'; +$lang->action->dynamicAction->sonarqubeproject['deleted'] = '删除SonarQube项目'; + $lang->action->dynamicAction->gitlab['created'] = '创建GitLab服务器'; $lang->action->dynamicAction->gitlab['edited'] = '设置GitLab服务器'; $lang->action->dynamicAction->gitlab['deleted'] = '删除GitLab服务器'; diff --git a/module/block/view/dynamic.html.php b/module/block/view/dynamic.html.php index 215bb804d3..51f529e8fe 100644 --- a/module/block/view/dynamic.html.php +++ b/module/block/view/dynamic.html.php @@ -13,6 +13,7 @@ { $user = zget($users, $action->actor); if($action->action == 'login' or $action->action == 'logout') $action->objectName = $action->objectLabel = ''; + if($action->objectType == 'sonarqubeproject') $action->objectName = $action->extra; $class = $action->major ? "class='active'" : ''; echo "
  • "; if($action->objectLink) printf($lang->block->dynamicInfo, $action->date, $user, $action->actionLabel, $action->objectLabel, $action->objectLink, $action->objectName, $action->objectName); diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index b5e57d720d..b8cdbda169 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -615,17 +615,18 @@ $lang->navGroup->testtask = 'qa'; $lang->navGroup->testsuite = 'qa'; $lang->navGroup->caselib = 'qa'; -$lang->navGroup->devops = 'devops'; -$lang->navGroup->repo = 'devops'; -$lang->navGroup->job = 'devops'; -$lang->navGroup->jenkins = 'devops'; -$lang->navGroup->mr = 'devops'; -$lang->navGroup->gitlab = 'devops'; -$lang->navGroup->sonarqube = 'devops'; -$lang->navGroup->compile = 'devops'; -$lang->navGroup->ci = 'devops'; -$lang->navGroup->svn = 'devops'; -$lang->navGroup->git = 'devops'; +$lang->navGroup->devops = 'devops'; +$lang->navGroup->repo = 'devops'; +$lang->navGroup->job = 'devops'; +$lang->navGroup->jenkins = 'devops'; +$lang->navGroup->mr = 'devops'; +$lang->navGroup->gitlab = 'devops'; +$lang->navGroup->sonarqube = 'devops'; +$lang->navGroup->sonarqubeproject = 'devops'; +$lang->navGroup->compile = 'devops'; +$lang->navGroup->ci = 'devops'; +$lang->navGroup->svn = 'devops'; +$lang->navGroup->git = 'devops'; $lang->navGroup->company = 'system'; From 4b0d2e842a8ccbea8f8081d5f45c628c11ce50aa Mon Sep 17 00:00:00 2001 From: zenggang Date: Mon, 17 Jan 2022 06:49:36 +0000 Subject: [PATCH 46/54] * Fix bug#18456,18393,18392 --- module/mr/model.php | 1 + module/mr/view/view.html.php | 3 ++- module/sonarqube/lang/en.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/module/mr/model.php b/module/mr/model.php index 83863e4ebf..5565966381 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -258,6 +258,7 @@ class mrModel extends model { $MR = fixer::input('post') ->setDefault('jobID', 0) + ->setDefault('compileID', 0) ->setDefault('repoID', 0) ->setDefault('removeSourceBranch','0') ->setDefault('needCI', 0) diff --git a/module/mr/view/view.html.php b/module/mr/view/view.html.php index 1e7ba4295a..019476a3d1 100644 --- a/module/mr/view/view.html.php +++ b/module/mr/view/view.html.php @@ -133,7 +133,8 @@ - + app->getClientLang(), array('zh-cn','zh-tw')) ? 'w-90px' : 'w-100px'; ?> + diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index 3dba13e166..40e678bd27 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -33,7 +33,7 @@ $lang->sonarqube->placeholder->url = "Please fill in the access address of the $lang->sonarqube->nameRepeatError = "Server name already exists!"; $lang->sonarqube->urlRepeatError = 'Server address already exists!'; -$lang->sonarqube->validError = 'Sonarqube user authority authentication failed!'; +$lang->sonarqube->validError = 'SonarQube user authority authentication failed!'; $lang->sonarqube->hostError = "Invalid SonarQube service address."; $lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->confirmDeleteProject = 'Do you want to delete this SonarQube project?'; From f82a59604bad943d4e23ac6fc85ed394c9114f4f Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Mon, 17 Jan 2022 06:53:53 +0000 Subject: [PATCH 47/54] * Modify common function. --- module/job/control.php | 4 ++-- module/job/model.php | 7 ++++--- module/sonarqube/control.php | 18 ++++++++-------- module/sonarqube/model.php | 40 +----------------------------------- test/data/pipeline.yaml | 2 +- 5 files changed, 17 insertions(+), 54 deletions(-) diff --git a/module/job/control.php b/module/job/control.php index ba504da717..332b0a695a 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -123,7 +123,7 @@ class job extends control $this->view->products = array(0 => '') + $this->loadModel('product')->getProductPairsByProject($this->projectID); $this->view->jenkinsServerList = array('' => '') + $this->loadModel('jenkins')->getPairs(); - $this->view->sonarqubeServerList = array('') + $this->loadModel('sonarqube')->getPairs(); + $this->view->sonarqubeServerList = array('') + $this->loadModel('pipeline')->getPairs('sonarqube'); $this->display(); } @@ -204,7 +204,7 @@ class job extends control $this->view->job = $job; $this->view->products = array('') + $products; $this->view->jenkinsServerList = $this->loadModel('jenkins')->getPairs(); - $this->view->sonarqubeServerList = array('') + $this->loadModel('sonarqube')->getPairs(); + $this->view->sonarqubeServerList = array('') + $this->loadModel('pipeline')->getPairs('sonarqube'); $this->view->pipelines = $this->jenkins->getTasks($job->server); $this->display(); diff --git a/module/job/model.php b/module/job/model.php index 1e416f67da..d9b60f64b5 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -624,15 +624,16 @@ class jobModel extends model * @param int $sonarqubeID * @param array $projectKeys * @param bool $emptyShowAll + * @param bool $showDeleted * @access public * @return array */ - public function getJobBySonarqubeProject($sonarqubeID, $projectKeys = array(), $emptyShowAll = false) + public function getJobBySonarqubeProject($sonarqubeID, $projectKeys = array(), $emptyShowAll = false, $showDeleted = false) { return $this->dao->select('projectKey,id')->from(TABLE_JOB) - ->where('deleted')->eq(0) - ->andWhere('frame')->eq('sonarqube') + ->where('frame')->eq('sonarqube') ->andWhere('sonarqubeServer')->eq($sonarqubeID) + ->beginIF(!$showDeleted)->andWhere('deleted')->eq('0')->fi() ->beginIF(!empty($projectKeys) or !$emptyShowAll)->andWhere('projectKey')->in($projectKeys)->fi() ->fetchPairs(); } diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index c0e3d22fac..0750efef68 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -40,7 +40,7 @@ class sonarqube extends control $this->app->loadClass('pager', $static = true); $pager = new pager($recTotal, $recPerPage, $pageID); - $sonarqubeList = $this->sonarqube->getList($orderBy, $pager); + $sonarqubeList = $this->loadModel('pipeline')->getList('sonarqube', $orderBy, $pager); $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->browse; $this->view->sonarqubeList = $sonarqubeList; @@ -60,7 +60,7 @@ class sonarqube extends control */ public function ajaxGetProjectList($sonarqubeID, $projectKey = '') { - $jobPairs = $this->loadModel('job')->getJobBySonarqubeProject($sonarqubeID, array(), true); + $jobPairs = $this->loadModel('job')->getJobBySonarqubeProject($sonarqubeID, array(), true, true); $existsProject = array_diff(array_keys($jobPairs), array($projectKey)); $projectList = $this->sonarqube->apiGetProjects($sonarqubeID); @@ -138,13 +138,13 @@ class sonarqube extends control */ public function edit($sonarqubeID) { - $oldSonarQube = $this->sonarqube->getByID($sonarqubeID); + $oldSonarQube = $this->loadModel('pipeline')->getByID($sonarqubeID); if($_POST) { $this->checkToken($sonarqubeID); - $this->loadModel('pipeline')->update($sonarqubeID); - $sonarqube = $this->sonarqube->getByID($sonarqubeID); + $this->pipeline->update($sonarqubeID); + $sonarqube = $this->pipeline->getByID($sonarqubeID); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $this->loadModel('action'); @@ -171,11 +171,11 @@ class sonarqube extends control { if($confirm != 'yes') die(js::confirm($this->lang->sonarqube->confirmDelete, inlink('delete', "sonarqubeID=$sonarqubeID&confirm=yes"))); - $oldSonarQube = $this->sonarqube->getByID($sonarqubeID); + $oldSonarQube = $this->loadModel('pipeline')->getByID($sonarqubeID); $this->loadModel('action'); - $actionID = $this->loadModel('pipeline')->delete($sonarqubeID, 'sonarqube'); + $actionID = $this->pipeline->delete($sonarqubeID, 'sonarqube'); - $sonarQube = $this->sonarqube->getByID($sonarqubeID); + $sonarQube = $this->pipeline->getByID($sonarqubeID); $changes = common::createChanges($oldSonarQube, $sonarQube); $this->action->logHistory($actionID, $changes); echo js::reload('parent'); @@ -229,7 +229,7 @@ class sonarqube extends control $pager = new pager($recTotal, $recPerPage, $pageID); $sonarqubeProjectList = array_chunk($sonarqubeProjectList, $pager->recPerPage); - $this->view->sonarqube = $this->sonarqube->getByID($sonarqubeID); + $this->view->sonarqube = $this->loadModel('pipeline')->getByID($sonarqubeID); $this->view->keyword = urldecode(urldecode($keyword)); $this->view->pager = $pager; $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->browseProject; diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index ebdbddc79c..04b0a1012d 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -12,44 +12,6 @@ class sonarqubeModel extends model { - /** - * Get a sonarqube by id. - * - * @param int $id - * @access public - * @return object - */ - public function getByID($id) - { - return $this->loadModel('pipeline')->getByID($id); - } - - /** - * Get sonarqube list. - * - * @param string $orderBy - * @param object $pager - * @access public - * @return array - */ - public function getList($orderBy = 'id_desc', $pager = null) - { - $sonarqubeList = $this->loadModel('pipeline')->getList('sonarqube', $orderBy, $pager); - - return $sonarqubeList; - } - - /** - * Get sonarqube pairs. - * - * @access public - * @return array - */ - public function getPairs() - { - return $this->loadModel('pipeline')->getPairs('sonarqube'); - } - /** * Get sonarqube api base url and header by id. * @@ -59,7 +21,7 @@ class sonarqubeModel extends model */ public function getApiBase($sonarqubeID) { - $sonarqube = $this->getByID($sonarqubeID); + $sonarqube = $this->loadModel('pipeline')->getByID($sonarqubeID); if(!$sonarqube) return array('', array()); $url = rtrim($sonarqube->url, '/') . '/api/%s'; diff --git a/test/data/pipeline.yaml b/test/data/pipeline.yaml index db7e26cd29..60ad7e0b48 100644 --- a/test/data/pipeline.yaml +++ b/test/data/pipeline.yaml @@ -5,7 +5,7 @@ fields: - field: id range: 1-2 - field: type - range: gitlabi,sonarqube + range: gitlab,sonarqube - field: name range: gitlab服务器,sonarqube服务器 - field: url From 27b848d6f8a4ae2d9ed483538ce7d648001f36b5 Mon Sep 17 00:00:00 2001 From: zenggang Date: Mon, 17 Jan 2022 09:12:17 +0000 Subject: [PATCH 48/54] * unit test --- test/model/gitlab/apicreatebranch.php | 7 ++++-- test/model/gitlab/apicreatebranchpriv.php | 1 + test/model/gitlab/apideletetagpriv.php | 5 ++-- test/model/gitlab/apigetbranches.php | 14 +++++------ test/model/gitlab/apigetsinglebranchpriv.php | 6 ++--- test/model/gitlab/apigettagprivs.php | 4 ++-- test/model/sonarqube/apivalidate.php | 25 ++++++++++++++++++++ test/model/sonarqube/getbyid.php | 25 ++++++++++++++++++++ 8 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 test/model/sonarqube/apivalidate.php create mode 100644 test/model/sonarqube/getbyid.php diff --git a/test/model/gitlab/apicreatebranch.php b/test/model/gitlab/apicreatebranch.php index 3d42a3d7a0..2136ed0726 100755 --- a/test/model/gitlab/apicreatebranch.php +++ b/test/model/gitlab/apicreatebranch.php @@ -11,7 +11,7 @@ pid=1 使用空的gitlabID、projectID、分支对象创建GitLab分支 >> return false 使用空的gitlabID、projectID,正确的分支对象创建GitLab分支 >> return null 使用正确的gitlabID、分支信息,错误的projectID创建分支 >> 404 Project Not Found -使用正确的gitlabID,projectID,分支对象创建GitLab分支 >> test_branch17 +使用正确的gitlabID,projectID,分支对象创建GitLab分支 >> 1 使用重复的分支信息创建分支 >> Branch already exists */ @@ -36,5 +36,8 @@ $gitlabID = 1; r($gitlab->apiCreateBranch($gitlabID, $projectID, $branch)) && p('message') && e('404 Project Not Found'); //使用正确的gitlabID、分支信息,错误的projectID创建分支 $projectID = 1555; -r($gitlab->apiCreateBranch($gitlabID, $projectID, $branch)) && p('name') && e($branch->branch); //通过gitlabID,projectID,分支对象正确创建GitLab分支 +$result = $gitlab->apiCreateBranch($gitlabID, $projectID, $branch); +if(!empty($result->name) and $result->name == $branch->branch) $result = true; +if(!empty($result->message) and $result->message == 'Branch already exists') $result = true; +r($result) && p() && e(1); //通过gitlabID,projectID,分支对象正确创建GitLab分支 r($gitlab->apiCreateBranch($gitlabID, $projectID, $branch)) && p('message') && e('Branch already exists'); //使用重复的分支信息创建分支 diff --git a/test/model/gitlab/apicreatebranchpriv.php b/test/model/gitlab/apicreatebranchpriv.php index 5199077991..13f298a261 100755 --- a/test/model/gitlab/apicreatebranchpriv.php +++ b/test/model/gitlab/apicreatebranchpriv.php @@ -40,6 +40,7 @@ if($result === false) $result = 'return false'; r($result) && p() && e('return false'); //使用正确的gitlabID、保护分支信息,错误的projectID创建保护分支 $projectID = 966; +$gitlab->apiDeleteBranchPriv($gitlabID, $projectID, $branch->name); r($gitlab->apiCreateBranchPriv($gitlabID, $projectID, $branch)) && p('name') && e($branch->name); //通过gitlabID,projectID,保护分支对象正确创建GitLab保护分支 r($gitlab->apiCreateBranchPriv($gitlabID, $projectID, $branch)) && p('message') && e("Protected branch 'master' already exists"); //使用重复的保护分支信息创建保护分支 diff --git a/test/model/gitlab/apideletetagpriv.php b/test/model/gitlab/apideletetagpriv.php index 5454d31f5f..423bdc0dbc 100644 --- a/test/model/gitlab/apideletetagpriv.php +++ b/test/model/gitlab/apideletetagpriv.php @@ -35,7 +35,8 @@ $tag = 'masters'; $result = $gitlab->apiDeleteTagPriv($gitlabID, $projectID, $tag); r($result) && p('message') && e('404 Not found'); //使用错误的保护标签信息删除保护标签 -$tag = '2021/12/30'; -$result = $gitlab->apiDeleteTagPriv($gitlabID, $projectID, $tag); +$projectID = 1555; +$tag = 'test_tag1'; +$result = $gitlab->apiDeleteTagPriv($gitlabID, $projectID, $tag); if(!$result or substr($result->message, 0, 2) == '20') $result = 'return true'; r($result) && p() && e('return true'); //通过gitlabID,projectID,标签名称正确删除保护标签 diff --git a/test/model/gitlab/apigetbranches.php b/test/model/gitlab/apigetbranches.php index 643d88daa0..80621acb82 100755 --- a/test/model/gitlab/apigetbranches.php +++ b/test/model/gitlab/apigetbranches.php @@ -8,11 +8,11 @@ title=测试 gitlabModel::apiGetBranches(); cid=1 pid=1 -通过gitlabID,projectID,获取GitLab分支列表 >> branch1 -通过gitlabID,projectID,获取GitLab分支数量 >> 3 -当前项目没有分支时,获取GitLab分支列表 >> 0 +通过gitlabID,projectID,获取GitLab分支列表 >> 1 +通过gitlabID,projectID,获取GitLab分支数量 >> 1 +当前项目没有分支时,获取GitLab分支列表 >> 0 当gitlabID存在,projectID不存在时,获取GitLab分支列表 >> 404 Project Not Found -当gitlabID,projectID都为0时,获取GitLab分支列表 >> return empty +当gitlabID,projectID都为0时,获取GitLab分支列表 >> return empty */ @@ -21,11 +21,11 @@ $gitlab = $tester->loadModel('gitlab'); $gitlabID = 1; $projectID = 1552; $result = $gitlab->apiGetBranches($gitlabID, $projectID); -r($result) && p('0:name') && e('branch1'); //通过gitlabID,projectID,获取GitLab分支列表 -r(count($result)) && p() && e(3); //通过gitlabID,projectID,获取GitLab分支数量 +r(isset(array_shift($result)->name)) && p() && e(1); //通过gitlabID,projectID,获取GitLab分支列表 +r(count($result) > 0) && p() && e(1); //通过gitlabID,projectID,获取GitLab分支数量 $gitlabID = 1; -$projectID = 1570; +$projectID = 959; r(count($gitlab->apiGetBranches($gitlabID, $projectID))) && p() && e(0); //当前项目没有分支时,获取GitLab分支列表 $gitlabID = 1; diff --git a/test/model/gitlab/apigetsinglebranchpriv.php b/test/model/gitlab/apigetsinglebranchpriv.php index d9f2f4d12e..6ea3c8f5e1 100644 --- a/test/model/gitlab/apigetsinglebranchpriv.php +++ b/test/model/gitlab/apigetsinglebranchpriv.php @@ -10,8 +10,8 @@ pid=1 使用空的gitlabID、projectID、保护分支获取保护分支 >> return false 使用正确的gitlabID、保护分支信息,错误的projectID获取保护分支 >> 404 Project Not Found -使用正确的gitlabID,projectID,保护分支获取保护分支 >> master -使用错误的保护分支信息获取保护分支 >> 404 Not found +使用正确的gitlabID,projectID,保护分支获取保护分支 >> master +使用错误的保护分支信息获取保护分支 >> 404 Not found */ @@ -30,7 +30,7 @@ $branch = 'master'; $result = $gitlab->apiGetSingleBranchPriv($gitlabID, $projectID, $branch); r($result) && p('message') && e('404 Project Not Found'); //使用正确的gitlabID、保护分支信息,错误的projectID获取保护分支 -$projectID = 1565; +$projectID = 1552; $result = $gitlab->apiGetSingleBranchPriv($gitlabID, $projectID, $branch); r($result) && p('name') && e('master'); //通过gitlabID,projectID,分支名称正确获取保护分支 diff --git a/test/model/gitlab/apigettagprivs.php b/test/model/gitlab/apigettagprivs.php index 70fda76503..09b7e7b5ac 100644 --- a/test/model/gitlab/apigettagprivs.php +++ b/test/model/gitlab/apigettagprivs.php @@ -21,8 +21,8 @@ $gitlab = $tester->loadModel('gitlab'); $gitlabID = 1; $projectID = 1552; $result = $gitlab->apiGetTagPrivs($gitlabID, $projectID); -r(isset($result[0]->name)) && p() && e(1); //通过gitlabID,projectID,获取GitLab标签保护列表 -r(count($result) > 0) && p() && e(1); //通过gitlabID,projectID,获取GitLab标签保护数量 +r(isset(array_shift($result)->name)) && p() && e(1); //通过gitlabID,projectID,获取GitLab标签保护列表 +r(count($result) > 0) && p() && e(1); //通过gitlabID,projectID,获取GitLab标签保护数量 $gitlabID = 1; $projectID = 1570; diff --git a/test/model/sonarqube/apivalidate.php b/test/model/sonarqube/apivalidate.php new file mode 100644 index 0000000000..e860b2d0c9 --- /dev/null +++ b/test/model/sonarqube/apivalidate.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +> 1 +通过正确的host,错误的token获取api权限 >> return false + +*/ + +$sonarqube = $tester->loadModel('sonarqube'); + +$sonarqubeID = 2; +$sonarqubeServer = $sonarqube->getByID($sonarqubeID); +$result = $sonarqube->apiValidate($sonarqubeServer->url, $sonarqubeServer->token); +r($result) && p('valid') && e(1); //通过host,token检验api权限 + +$result = $sonarqube->apiValidate($sonarqubeServer->url, $sonarqubeServer->token . 'a'); +if($result->valid == false) $result = 'return false'; +r($result) && p('') && e(''); //通过正确的host,错误的token获取api权限 diff --git a/test/model/sonarqube/getbyid.php b/test/model/sonarqube/getbyid.php new file mode 100644 index 0000000000..de3b3deb55 --- /dev/null +++ b/test/model/sonarqube/getbyid.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +> sonarqube服务器 +通过空的id获取sonarqube服务器 >> return empty + +*/ + +$sonarqube = $tester->loadModel('sonarqube'); + +$sonarqubeID = 2; +$sonarqubeServer = $sonarqube->getByID($sonarqubeID); +r($sonarqubeServer) && p('name') && e('sonarqube服务器'); //通过id获取sonarqube服务器 + +$sonarqubeID = 0; +$sonarqubeServer = $sonarqube->getByID($sonarqubeID); +if(empty($sonarqubeServer)) $result = 'return empty'; +r($result) && p() && e('return empty'); //通过空的id获取sonarqube服务器 From 72d551598b66ed2aea9fa0dba2d2e1ff5360ac07 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 18 Jan 2022 09:03:24 +0800 Subject: [PATCH 49/54] * Adjsut unit case. --- test/model/gitlab/createbranch.php | 8 ++++- test/model/gitlab/createtag.php | 7 +++- test/model/mr/apicreate.php | 4 +-- test/model/sonarqube/apideleteproject.php | 42 +++++++++++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 test/model/sonarqube/apideleteproject.php diff --git a/test/model/gitlab/createbranch.php b/test/model/gitlab/createbranch.php index b89f6dab69..e12aabab11 100755 --- a/test/model/gitlab/createbranch.php +++ b/test/model/gitlab/createbranch.php @@ -40,7 +40,13 @@ r($result) && p() && e('return false'); //使用正确的gitlabID、分支信息 dao::$errors = array(); $projectID = 1555; -$result = $gitlab->createBranch($gitlabID, $projectID); + +/* Delete branches with the same name. */ +$apiRoot = $gitlab->getApiRoot($gitlabID); +$url = sprintf($apiRoot, "/projects/{$projectID}/repository/branches/{$_POST['branch']}"); +commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE')); + +$result = $gitlab->createBranch($gitlabID, $projectID); if($result === true) $result = 'return true'; r($result) && p() && e('return true'); //通过gitlabID,projectID,分支对象正确创建GitLab分支 diff --git a/test/model/gitlab/createtag.php b/test/model/gitlab/createtag.php index 756dcdfa0a..eecadec592 100755 --- a/test/model/gitlab/createtag.php +++ b/test/model/gitlab/createtag.php @@ -40,7 +40,12 @@ r($result) && p() && e('return false'); //使用正确的gitlabID、标签信息 dao::$errors = array(); $projectID = 1555; -$result = $gitlab->createTag($gitlabID, $projectID); + +/* Delete branches with the same name. */ +$gitlab->apiDeleteTagPriv($gitlabID, $projectID, $_POST['tag_name']); +$gitlab->apiDeleteTag($gitlabID, $projectID, $_POST['tag_name']); + +$result = $gitlab->createTag($gitlabID, $projectID); if($result === true) $result = 'return true'; r($result) && p() && e('return true'); //通过gitlabID,projectID,标签对象正确创建GitLab标签 diff --git a/test/model/mr/apicreate.php b/test/model/mr/apicreate.php index 2a775f0a84..129f749a6d 100644 --- a/test/model/mr/apicreate.php +++ b/test/model/mr/apicreate.php @@ -10,7 +10,7 @@ pid=0 使用空的RepoUrl数据创建 >> fail 使用正确的RepoUrl,错误的分支数据创建mr请求 >> fail -使用源分支和目标分支一样的数据创建mr请求 >> success +使用源分支和目标分支一样的数据创建mr请求 >> success 使用正确的数据创建mr请求 >> success */ @@ -28,7 +28,7 @@ r($result) && p() && e('fail'); //使用空的RepoUrl数据创建 dao::$errors = array(); $_POST['data']['RepoUrl'] = 'http://192.168.1.161:51080/root/azalea723test.git'; -$_POST['data']['DiffMsg'] = ''; +$_POST['data']['DiffMsg'] = ''; $_POST['data']['RepoSrcBranch'] = ''; $_POST['data']['RepoDistBranch'] = ''; $_POST['data']['MergeStatus'] = '1'; diff --git a/test/model/sonarqube/apideleteproject.php b/test/model/sonarqube/apideleteproject.php new file mode 100644 index 0000000000..ddf5835ff4 --- /dev/null +++ b/test/model/sonarqube/apideleteproject.php @@ -0,0 +1,42 @@ +#!/usr/bin/env php +> return false +正确的sonarqubeID,空的projectKey,删除SonarQube项目 >> The 'project' parameter is missing +正确的sonarqubeID,不存在的projectKey,删除SonarQube项目 >> Project 'no_project' not found +正确的sonarqubeID、projectKey,删除SonarQube项目 >> return true + +*/ + +$sonarqube = $tester->loadModel('sonarqube'); + +$sonarqubeID = 0; +$projectKey = ''; +$result = $sonarqube->apiDeleteProject($sonarqubeID, $projectKey); +if($result === false) $result = 'return false'; +r($result) && p() && e('return false'); //通过不正确的sonarqubeID、projectKey,删除SonarQube项目 + +$sonarqubeID = 2; +$projectKey = ''; +$result = $sonarqube->apiDeleteProject($sonarqubeID, $projectKey); +r($result->errors) && p('0:msg') && e("The 'project' parameter is missing"); //正确的sonarqubeID,空的projectKey,删除SonarQube项目 + +$projectKey = 'no_project'; +$result = $sonarqube->apiDeleteProject($sonarqubeID, $projectKey); +r($result->errors) && p('0:msg') && e("Project 'no_project' not found"); //正确的sonarqubeID,不存在的projectKey,删除SonarQube项目 + +$projectKey = 'new_project'; +list($apiRoot, $header) = $sonarqube->getApiBase($sonarqubeID); +$url = sprintf($apiRoot, "projects/create?name=$projectKey&project=$projectKey"); +commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'POST'), $header); + +$result = $sonarqube->apiDeleteProject($sonarqubeID, $projectKey); +if($result === null) $result = 'return true'; +r($result) && p() && e("return true"); //正确的sonarqubeID、projectKey,删除SonarQube项目 From 223ae8be3d46defd65fd417b3b42ac42ee033cc9 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 18 Jan 2022 09:06:07 +0800 Subject: [PATCH 50/54] * Adjust comment. --- test/model/gitlab/createtag.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/model/gitlab/createtag.php b/test/model/gitlab/createtag.php index eecadec592..f61022862c 100755 --- a/test/model/gitlab/createtag.php +++ b/test/model/gitlab/createtag.php @@ -41,7 +41,7 @@ r($result) && p() && e('return false'); //使用正确的gitlabID、标签信息 dao::$errors = array(); $projectID = 1555; -/* Delete branches with the same name. */ +/* Delete tags with the same name. */ $gitlab->apiDeleteTagPriv($gitlabID, $projectID, $_POST['tag_name']); $gitlab->apiDeleteTag($gitlabID, $projectID, $_POST['tag_name']); From fbc3d00e7d5eda3d9e0e19ae387629cd0c42dc89 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 18 Jan 2022 09:14:41 +0800 Subject: [PATCH 51/54] * Fix bug #18437. --- module/my/view/dynamic.html.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module/my/view/dynamic.html.php b/module/my/view/dynamic.html.php index 5546dd3f2b..586b526f79 100644 --- a/module/my/view/dynamic.html.php +++ b/module/my/view/dynamic.html.php @@ -64,6 +64,10 @@ { echo '#' . $action->objectID; } + elseif(empty($action->objectID) and $action->extra) + { + echo $action->extra; + } elseif(empty($action->objectLink)) { echo $action->objectName; @@ -73,8 +77,10 @@ echo html::a($action->objectLink, $action->objectName, '', $tab); } ?> + objectID):?> objectID;?> + From c886988d62b505cb3decc761f605abeaa4f138ed Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 18 Jan 2022 03:20:14 +0000 Subject: [PATCH 52/54] * Fix bug#18327 --- module/repo/control.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/module/repo/control.php b/module/repo/control.php index b7891517fe..1b601e3722 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -405,8 +405,6 @@ class repo extends control /* Cache infos. */ if($refresh or !$cacheFile or !file_exists($cacheFile) or (time() - filemtime($cacheFile)) / 60 > $this->config->repo->cacheTime) { - $this->repo->syncCommit($repoID, $branchID); - /* Get cache infos. */ $infos = $this->scm->ls($path, $revision); From 1f9d135210d781c3a64ee7b2bbcc4cc9c7590fa1 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 18 Jan 2022 05:39:54 +0000 Subject: [PATCH 53/54] * Modify tips label style. --- module/job/js/create.js | 3 +++ module/job/js/edit.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/module/job/js/create.js b/module/job/js/create.js index d147f5fc70..cd188907e9 100644 --- a/module/job/js/create.js +++ b/module/job/js/create.js @@ -221,6 +221,9 @@ $(document).ready(function() $('#sonarProject .input-group').append(html); $('#sonarProject #projectKey').chosen({drop_direction: 'auto'}); }) + + /* There has been a problem with handling the prompt label. */ + $('#projectKeyLabel').remove(); }) var scheduleOption = ""; diff --git a/module/job/js/edit.js b/module/job/js/edit.js index a319c9dfd5..66066ae271 100644 --- a/module/job/js/edit.js +++ b/module/job/js/edit.js @@ -208,6 +208,9 @@ $(document).ready(function() $('#sonarProject .input-group').append(html); $('#sonarProject #projectKey').chosen({drop_direction: 'auto'}); }) + + /* There has been a problem with handling the prompt label. */ + $('#projectKeyLabel').remove(); }) var scheduleOption = ""; From 91506974087b68de807b5f148a351a61684b549b Mon Sep 17 00:00:00 2001 From: mayue Date: Wed, 19 Jan 2022 16:59:00 +0800 Subject: [PATCH 54/54] * Finish task #47979. --- module/kanban/view/space.html.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/kanban/view/space.html.php b/module/kanban/view/space.html.php index 1354a492e7..398f92e89c 100644 --- a/module/kanban/view/space.html.php +++ b/module/kanban/view/space.html.php @@ -44,7 +44,6 @@ kanban->closed;?> name;?> - kanbans) ? count($space->kanbans) : '';?>
    job->common;?>job->common;?> name;?>