* @package job * @link https://www.zentao.net * @property jobModel $job */ class jobZen extends job { /** * 检测版本库数量。 * Check repo empty. * * @access protected * @return void */ protected function checkRepoEmpty() { $repos = $this->loadModel('repo')->getRepoPairs('devops'); if(empty($repos)) $this->locate($this->repo->createLink('create')); } /** * 获取流水线列表。 * Get job list. * * @param int $repoID * @param string $jobQuery * @param string $orderBy * @param object $pager * @access protected * @return array */ protected function getJobList($repoID, $jobQuery, $orderBy, $pager) { $this->loadModel('gitlab'); $products = $this->loadModel('product')->getPairs('nodeleted', 0, '', 'all'); $jobList = $this->job->getList($repoID, $jobQuery, $orderBy, $pager); foreach($jobList as $job) { if($job->engine == 'jenkins') { if(strpos($job->pipeline, '/job/') === 0) $job->pipeline = trim(substr($job->pipeline, 5), '/'); } else { $job->branch = empty($job->pipeline) ? '' : zget(json_decode($job->pipeline), 'reference', ''); $job->pipeline = $job->repoName; } $job->lastExec = $job->lastExec ? $job->lastExec : ''; $job->triggerType = $this->job->getTriggerConfig($job); $job->buildSpec = !empty($job->pipeline) ? urldecode($job->pipeline) . '@' . $job->jenkinsName : $job->jenkinsName; $job->engine = zget($this->lang->job->engineList, $job->engine); $job->frame = zget($this->lang->job->frameList, $job->frame); $job->productName = zget($products, $job->product, ''); } return $jobList; } /** * 返回创建或者编辑的响应。 * Return reponse after create or edit. * * @param int $repoID * @access protected * @return array */ protected function reponseAfterCreateEdit($repoID = 0) { if(dao::isError()) { $errors = dao::getError(); if($this->post->engine == 'gitlab' and isset($errors['server'])) { if(!isset($errors['repo'])) $errors['repo'][] = sprintf($this->lang->error->notempty, $this->lang->job->repoServer); unset($errors['server']); unset($errors['pipeline']); } elseif($this->post->engine == 'jenkins') { if(isset($errors['server'])) { $errors['jkServer'] = $errors['server']; unset($errors['server']); } if(isset($errors['pipeline'])) { $errors['jkTask'] = $errors['pipeline']; unset($errors['pipeline']); } } return array('result' => 'fail', 'message' => $errors); } return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => inlink('browse', 'repoID=' . ($repoID ? $repoID : $this->post->repo))); } /** * 获取svn目录。 * Get subversion dir. * * @param object $repo * @access protected * @return void */ protected function getSubversionDir($repo) { if($repo->SCM == 'Subversion') { $dirs = array(); $path = empty($repo->prefix) ? '/' : $this->loadModel('repo')->decodePath(''); $tags = $this->loadModel('svn')->getRepoTags($repo, $path); if($tags) { $dirs['/'] = $path ? $path : '/'; foreach($tags as $dirPath => $dirName) $dirs[$dirPath] = $dirPath; } $this->view->dirs = $dirs; foreach($this->lang->job->triggerTypeList as $type => $name) { if($type == 'tag') $this->lang->job->triggerTypeList[$type] = $this->lang->job->dirChange; } } } /** * 获取流水线执行数据。 * Get job compile data. * * @param object $compile * @access protected * @return void */ protected function getCompileData($compile) { $this->app->loadLang('project'); $taskID = $compile->testtask; $task = $this->loadModel('testtask')->getById($taskID); $runs = $this->testtask->getRunsForUnitCases($taskID, 'id'); $cases = array(); $runs = $this->loadModel('testcase')->appendData($runs, 'testrun'); foreach($runs as $run) $cases[$run->case] = $run; $results = $this->dao->select('*')->from(TABLE_TESTRESULT)->where('`case`')->in(array_keys($cases))->andWhere('run')->in(array_keys($runs))->fetchAll('run'); foreach($results as $result) { $runs[$result->run]->caseResult = $result->caseResult; $runs[$result->run]->xml = $result->xml; $runs[$result->run]->duration = $result->duration; } $groupCases = $this->dao->select('*')->from(TABLE_SUITECASE)->where('`case`')->in(array_keys($cases))->orderBy('case')->fetchGroup('suite', 'case'); $summary = array(); if(empty($groupCases)) $groupCases[] = $cases; foreach($groupCases as $suiteID => $groupCase) { $caseCount = 0; $failCount = 0; $duration = 0; foreach($groupCase as $caseID => $suitecase) { $case = $cases[$caseID]; $groupCases[$suiteID][$caseID] = $case; $duration += $case->duration; $caseCount ++; if($case->caseResult == 'fail') $failCount ++; } $summary[$suiteID] = sprintf($this->lang->testtask->summary, $caseCount, $failCount, $duration); } $suites = $this->loadModel('testsuite')->getUnitSuites($task->product); $this->view->groupCases = $groupCases; $this->view->suites = $suites; $this->view->summary = $summary; $this->view->taskID = $taskID; } /** * 构建搜索表单。 * Build search form. * * @param array $searchConfig * @param string|int $queryID * @param string $actionURL * @access protected * @return void */ protected function buildSearchForm($searchConfig, $queryID, $actionURL) { $searchConfig['queryID'] = (int)$queryID; $searchConfig['actionURL'] = $actionURL; if(isset($searchConfig['params']['repo'])) $searchConfig['params']['repo']['values'] = $this->loadModel('repo')->getRepoPairs(''); $searchConfig['params']['product']['values'] = $this->loadModel('product')->getPairs('nodeleted', 0, '', 'all'); $this->loadModel('search')->setSearchParams($searchConfig); } /** * 获取搜索条件。 * Get search condition. * * @param int $queryID * @access public * @return string */ public function getJobSearchQuery($queryID) { $queryName = 'jobQuery'; if($queryID) { $query = $this->loadModel('search')->getQuery($queryID); if($query) { $this->session->set($queryName, $query->sql); $this->session->set('jobForm', $query->form); } } if($this->session->$queryName === false) $this->session->set($queryName, ' 1 = 1'); $jobQuery = $this->session->$queryName; $jobQuery = preg_replace('/`(\w+)`/', 't1.`$1`', $jobQuery); return $jobQuery; } }