293 lines
9.8 KiB
PHP
Executable file
293 lines
9.8 KiB
PHP
Executable file
<?php
|
|
declare(strict_types=1);
|
|
/**
|
|
* The model file of pipeline module of ZenTaoPMS.
|
|
*
|
|
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
|
|
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
|
* @author Chenqi <chenqi@cnezsoft.com>
|
|
* @package pipeline
|
|
* @link https://www.zentao.net
|
|
*/
|
|
|
|
class pipelineModel extends model
|
|
{
|
|
/**
|
|
* 根据id获取一条服务器记录。
|
|
* Get a pipeline by id.
|
|
*
|
|
* @param int $id
|
|
* @access public
|
|
* @return object|false
|
|
*/
|
|
public function getByID(int $id): object|false
|
|
{
|
|
$pipeline = $this->dao->select('*')->from(TABLE_PIPELINE)->where('id')->eq($id)->fetch();
|
|
if($pipeline && !empty($pipeline->password)) $pipeline->password = base64_decode($pipeline->password);
|
|
return $pipeline;
|
|
}
|
|
|
|
/**
|
|
* 根据名称及类型获取一条流水线记录。
|
|
* Get a pipeline by name and type.
|
|
*
|
|
* @param string $name
|
|
* @param string $type
|
|
* @access public
|
|
* @return object|false
|
|
*/
|
|
public function getByNameAndType(string $name, string $type): object|false
|
|
{
|
|
return $this->dao->select('id')->from(TABLE_PIPELINE)->where('name')->eq($name)->andWhere('type')->eq($type)->fetch();
|
|
}
|
|
|
|
/**
|
|
* 根据url获取渠成创建的代码库。
|
|
* Get a pipeline by url which created by quickon.
|
|
*
|
|
* @param string $url
|
|
* @access public
|
|
* @return object|false
|
|
*/
|
|
public function getByUrl(string $url): object|false
|
|
{
|
|
return $this->dao->select('id')->from(TABLE_PIPELINE)->where('url')->eq($url)->andWhere('createdBy')->eq('system')->fetch();
|
|
}
|
|
|
|
/**
|
|
* 获取服务器列表。
|
|
* Get pipeline list.
|
|
*
|
|
* @param string $type
|
|
* @param string $orderBy
|
|
* @param object $pager
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getList(string $type = 'jenkins', string $orderBy = 'id_desc', object|null $pager = null): array
|
|
{
|
|
$type = strtolower($type);
|
|
return $this->dao->select('*')->from(TABLE_PIPELINE)
|
|
->where('deleted')->eq('0')
|
|
->beginIF($type)->AndWhere('type')->in($type)->fi()
|
|
->orderBy($orderBy)
|
|
->page($pager)
|
|
->fetchAll('id');
|
|
}
|
|
|
|
/**
|
|
* 获取服务器列表。
|
|
* Get pipeline pairs.
|
|
*
|
|
* @param string $type
|
|
* @param bool $checkOnline
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getPairs(string $type = '', bool $checkOnline = false): array
|
|
{
|
|
$type = strtolower($type);
|
|
if(!$this->config->inQuickon || !$checkOnline)
|
|
{
|
|
return $this->dao->select('id,name')->from(TABLE_PIPELINE)
|
|
->where('deleted')->eq('0')
|
|
->beginIF($type)->andWhere('type')->in($type)->fi()
|
|
->orderBy('id_desc')
|
|
->fetchPairs('id', 'name');
|
|
}
|
|
|
|
$serverList = $this->getList($type);
|
|
$instanceList = $this->loadModel('instance')->getList();
|
|
$statusList = $this->loadModel('cne')->batchQueryStatus($instanceList);
|
|
$runningApps = array();
|
|
foreach($instanceList as $instance)
|
|
{
|
|
$statusData = zget($statusList, $instance->k8name, '');
|
|
if($statusData && $statusData->status == 'running') $runningApps[$instance->id] = $instance->domain;
|
|
}
|
|
|
|
$serverPairs = array();
|
|
foreach($serverList as $server)
|
|
{
|
|
if($server->createdBy == 'system')
|
|
{
|
|
if($server->instanceID && isset($runningApps[$server->instanceID]))
|
|
{
|
|
$serverPairs[$server->id] = $server->name;
|
|
continue;
|
|
}
|
|
|
|
foreach($runningApps as $domain)
|
|
{
|
|
if(strpos($server->url, $domain) !== false)
|
|
{
|
|
$serverPairs[$server->id] = $server->name;
|
|
continue 2;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
$serverPairs[$server->id] = $server->name;
|
|
}
|
|
return $serverPairs;
|
|
}
|
|
|
|
/**
|
|
* 创建服务器。
|
|
* Create a server.
|
|
*
|
|
* @param object $server
|
|
* @access public
|
|
* @return int|false
|
|
*/
|
|
public function create(object $server): int|false
|
|
{
|
|
if(!empty($server->appType)) $server->type = $server->appType;
|
|
unset($server->appType);
|
|
$server->url = rtrim($server->url, '/');
|
|
|
|
if(isset($server->password)) $server->password = base64_encode($server->password);
|
|
|
|
$this->dao->insert(TABLE_PIPELINE)->data($server)
|
|
->batchCheck($this->config->pipeline->create->requiredFields, 'notempty')
|
|
->batchCheck("url", 'URL')
|
|
->check('name', 'unique', "`type` = '$server->type'")
|
|
->checkIF($server->type == 'jenkins', 'account', 'notempty')
|
|
->checkIF($server->type == 'jenkins' && !$server->token, 'password', 'notempty')
|
|
->checkIF($server->type == 'jenkins' && !$server->password, 'token', 'notempty')
|
|
->autoCheck()
|
|
->exec();
|
|
if(dao::isError()) return false;
|
|
|
|
return $this->dao->lastInsertId();
|
|
}
|
|
|
|
/**
|
|
* 更新服务器。
|
|
* Update a server.
|
|
*
|
|
* @param int $id
|
|
* @param object $server
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
public function update(int $id, object $server): bool
|
|
{
|
|
$type = $this->dao->select('type')->from(TABLE_PIPELINE)->where('id')->eq($id)->fetch('type');
|
|
$server->url = rtrim($server->url, '/');
|
|
if(isset($server->password)) $server->password = base64_encode($server->password);
|
|
|
|
$this->dao->update(TABLE_PIPELINE)->data($server)
|
|
->batchCheck($this->config->pipeline->edit->requiredFields, 'notempty')
|
|
->batchCheck("url", 'URL')
|
|
->check('name', 'unique', "`type` = '$type' and id <> $id")
|
|
->checkIF($type == 'jenkins', 'account', 'notempty')
|
|
->checkIF($type == 'jenkins' and !$server->token, 'password', 'notempty')
|
|
->checkIF($type == 'jenkins' and !$server->password, 'token', 'notempty')
|
|
->autoCheck()
|
|
->where('id')->eq($id)
|
|
->exec();
|
|
|
|
return !dao::isError();
|
|
}
|
|
|
|
/**
|
|
* 删除服务器。
|
|
* Delete one record.
|
|
*
|
|
* @param string $id the id to be deleted
|
|
* @param string $type the action object
|
|
* @access public
|
|
* @return int|bool
|
|
*/
|
|
public function deleteByObject(int $id, string $type = 'gitlab'): int|bool
|
|
{
|
|
if(in_array($type, array('gitlab', 'gitea', 'gogs')))
|
|
{
|
|
$repo = $this->dao->select('*')->from(TABLE_REPO)
|
|
->where('deleted')->eq('0')
|
|
->andWhere('SCM')->eq(ucfirst($type))
|
|
->andWhere('serviceHost')->eq($id)
|
|
->fetch();
|
|
if($repo) return false;
|
|
}
|
|
elseif($type == 'sonarqube')
|
|
{
|
|
$job = $this->dao->select('id,name,repo,deleted')->from(TABLE_JOB)
|
|
->where('frame')->eq('sonarqube')
|
|
->andWhere('server')->eq($id)
|
|
->andWhere('deleted')->eq('0')
|
|
->fetch();
|
|
if($job) return false;
|
|
}
|
|
|
|
$server = $this->fetchByID($id);
|
|
if(!$server) return false;
|
|
|
|
$this->dao->update(TABLE_PIPELINE)->set('deleted')->eq(1)->where('id')->eq($id)->exec();
|
|
|
|
$this->loadModel('action')->create($type, $id, 'deleted', '', $server->instanceID ? 0 : 1);
|
|
return $this->dao->lastInsertID();
|
|
}
|
|
|
|
/**
|
|
* 获取禅道用户绑定的第三方账号。
|
|
* Get user binded third party accounts.
|
|
*
|
|
* @param int $providerID
|
|
* @param string $providerType gitlab, gitea, gogs
|
|
* @param string $fields key, value
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getUserBindedPairs(int $providerID, string $providerType, string $fields = 'account,openID'): array
|
|
{
|
|
$providerType = strtolower($providerType);
|
|
return $this->dao->select($fields)->from(TABLE_OAUTH)
|
|
->where('providerType')->eq($providerType)
|
|
->andWhere('providerID')->eq($providerID)
|
|
->fetchPairs();
|
|
}
|
|
|
|
/**
|
|
* 根据服务器ID和禅道账号获取禅道用户绑定的第三方账号。
|
|
* Get user binded third party accounts.
|
|
*
|
|
* @param int $providerID
|
|
* @param string $providerType gitlab, gitea, gogs
|
|
* @param string $zentaoAccount
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public function getOpenIdByAccount(int $providerID, string $providerType, string $zentaoAccount): string
|
|
{
|
|
$providerType = strtolower($providerType);
|
|
return (string)$this->dao->select('openID')->from(TABLE_OAUTH)
|
|
->where('providerType')->eq($providerType)
|
|
->andWhere('providerID')->eq($providerID)
|
|
->andWhere('account')->eq($zentaoAccount)
|
|
->fetch('openID');
|
|
}
|
|
|
|
/**
|
|
* 根据禅道账号获取禅道用户绑定的第三方服务器和账号信息。
|
|
* Get user binded third party accounts.
|
|
*
|
|
* @param string $providerType gitlab, gitea, gogs
|
|
* @param string $account
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getProviderPairsByAccount(string $providerType, string $account = ''): array
|
|
{
|
|
$providerType = strtolower($providerType);
|
|
if(!$account) $account = $this->app->user->account;
|
|
|
|
return $this->dao->select('providerID,openID')->from(TABLE_OAUTH)
|
|
->where('providerType')->eq($providerType)
|
|
->andWhere('account')->eq($account)
|
|
->fetchPairs('providerID');
|
|
}
|
|
}
|