2014-07-14 17:02:36 +02:00
|
|
|
<?php
|
|
|
|
|
2016-07-19 20:28:11 +02:00
|
|
|
namespace PHPCensor\Service;
|
2014-07-14 17:02:36 +02:00
|
|
|
|
2018-03-04 09:56:02 +01:00
|
|
|
use PHPCensor\Config;
|
2015-10-05 13:13:22 +02:00
|
|
|
use Pheanstalk\Pheanstalk;
|
|
|
|
use Pheanstalk\PheanstalkInterface;
|
2016-07-19 20:28:11 +02:00
|
|
|
use PHPCensor\BuildFactory;
|
|
|
|
use PHPCensor\Model\Build;
|
|
|
|
use PHPCensor\Model\Project;
|
|
|
|
use PHPCensor\Store\BuildStore;
|
2014-07-14 17:02:36 +02:00
|
|
|
|
2014-12-08 12:25:33 +01:00
|
|
|
/**
|
|
|
|
* The build service handles the creation, duplication and deletion of builds.
|
|
|
|
*/
|
2014-07-14 17:02:36 +02:00
|
|
|
class BuildService
|
|
|
|
{
|
|
|
|
/**
|
2016-07-21 19:20:59 +02:00
|
|
|
* @var \PHPCensor\Store\BuildStore
|
2014-07-14 17:02:36 +02:00
|
|
|
*/
|
|
|
|
protected $buildStore;
|
|
|
|
|
2016-06-23 12:28:42 +02:00
|
|
|
/**
|
2017-11-05 15:48:36 +01:00
|
|
|
* @var boolean
|
2016-06-23 12:28:42 +02:00
|
|
|
*/
|
|
|
|
public $queueError = false;
|
|
|
|
|
2014-07-14 17:02:36 +02:00
|
|
|
/**
|
|
|
|
* @param BuildStore $buildStore
|
|
|
|
*/
|
|
|
|
public function __construct(BuildStore $buildStore)
|
|
|
|
{
|
|
|
|
$this->buildStore = $buildStore;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-04-01 06:32:39 +02:00
|
|
|
* @param Project $project
|
|
|
|
* @param string $environment
|
2017-04-13 17:00:29 +02:00
|
|
|
* @param string $commitId
|
2014-07-14 17:02:36 +02:00
|
|
|
* @param string|null $branch
|
2017-04-22 15:02:24 +02:00
|
|
|
* @param string|null $tag
|
2014-07-14 17:02:36 +02:00
|
|
|
* @param string|null $committerEmail
|
|
|
|
* @param string|null $commitMessage
|
2017-04-13 17:00:29 +02:00
|
|
|
* @param integer $source
|
2017-10-15 16:58:36 +02:00
|
|
|
* @param integer $userId
|
2018-03-09 19:00:53 +01:00
|
|
|
* @param array|null $extra
|
2017-11-05 15:48:36 +01:00
|
|
|
*
|
2016-07-21 19:20:59 +02:00
|
|
|
* @return \PHPCensor\Model\Build
|
2014-07-14 17:02:36 +02:00
|
|
|
*/
|
|
|
|
public function createBuild(
|
|
|
|
Project $project,
|
2017-03-23 13:53:24 +01:00
|
|
|
$environment,
|
2017-04-13 17:00:29 +02:00
|
|
|
$commitId = '',
|
2014-07-14 17:02:36 +02:00
|
|
|
$branch = null,
|
2017-04-22 15:02:24 +02:00
|
|
|
$tag = null,
|
2014-07-14 17:02:36 +02:00
|
|
|
$committerEmail = null,
|
|
|
|
$commitMessage = null,
|
2017-04-13 17:00:29 +02:00
|
|
|
$source = Build::SOURCE_UNKNOWN,
|
2017-10-15 16:58:36 +02:00
|
|
|
$userId = 0,
|
2014-07-14 17:02:36 +02:00
|
|
|
$extra = null
|
2014-07-23 15:54:49 +02:00
|
|
|
) {
|
2014-07-14 17:02:36 +02:00
|
|
|
$build = new Build();
|
2017-10-15 16:58:36 +02:00
|
|
|
$build->setCreateDate(new \DateTime());
|
2018-03-03 18:27:48 +01:00
|
|
|
$build->setProjectId($project->getId());
|
2017-04-03 15:44:35 +02:00
|
|
|
$build->setStatus(Build::STATUS_PENDING);
|
2017-03-23 13:53:24 +01:00
|
|
|
$build->setEnvironment($environment);
|
|
|
|
|
2018-03-09 19:00:53 +01:00
|
|
|
if (!is_null($extra)) {
|
|
|
|
$build->setExtra($extra);
|
|
|
|
}
|
|
|
|
|
2017-03-23 13:53:24 +01:00
|
|
|
$branches = $project->getBranchesByEnvironment($environment);
|
2018-03-09 19:00:53 +01:00
|
|
|
$build->addExtraValue('branches', $branches);
|
2014-07-14 17:02:36 +02:00
|
|
|
|
2017-04-13 17:00:29 +02:00
|
|
|
$build->setSource($source);
|
2017-10-15 16:58:36 +02:00
|
|
|
$build->setUserId($userId);
|
2017-04-13 17:00:29 +02:00
|
|
|
$build->setCommitId((string)$commitId);
|
2014-07-14 17:02:36 +02:00
|
|
|
|
2017-05-17 16:46:55 +02:00
|
|
|
if (!empty($branch)) {
|
2014-07-14 17:02:36 +02:00
|
|
|
$build->setBranch($branch);
|
|
|
|
} else {
|
|
|
|
$build->setBranch($project->getBranch());
|
|
|
|
}
|
|
|
|
|
2017-05-17 16:46:55 +02:00
|
|
|
if (!empty($tag)) {
|
2017-04-22 15:02:24 +02:00
|
|
|
$build->setTag($tag);
|
|
|
|
}
|
|
|
|
|
2017-05-17 16:46:55 +02:00
|
|
|
if (!empty($committerEmail)) {
|
2014-07-14 17:02:36 +02:00
|
|
|
$build->setCommitterEmail($committerEmail);
|
|
|
|
}
|
|
|
|
|
2017-05-17 16:46:55 +02:00
|
|
|
if (!empty($commitMessage)) {
|
2014-07-14 17:02:36 +02:00
|
|
|
$build->setCommitMessage($commitMessage);
|
|
|
|
}
|
|
|
|
|
2017-07-02 11:45:25 +02:00
|
|
|
/** @var Build $build */
|
2017-04-13 17:00:29 +02:00
|
|
|
$build = $this->buildStore->save($build);
|
2015-10-09 11:37:50 +02:00
|
|
|
$buildId = $build->getId();
|
|
|
|
|
|
|
|
if (!empty($buildId)) {
|
|
|
|
$build = BuildFactory::getBuild($build);
|
|
|
|
$build->sendStatusPostback();
|
|
|
|
$this->addBuildToQueue($build);
|
|
|
|
}
|
2015-10-05 13:13:22 +02:00
|
|
|
|
|
|
|
return $build;
|
2014-07-14 17:02:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param Build $copyFrom
|
2017-11-05 15:48:36 +01:00
|
|
|
*
|
2016-07-21 19:20:59 +02:00
|
|
|
* @return \PHPCensor\Model\Build
|
2014-07-14 17:02:36 +02:00
|
|
|
*/
|
|
|
|
public function createDuplicateBuild(Build $copyFrom)
|
|
|
|
{
|
|
|
|
$data = $copyFrom->getDataArray();
|
|
|
|
|
|
|
|
$build = new Build();
|
2018-03-03 18:27:48 +01:00
|
|
|
$build->setProjectId($data['project_id']);
|
|
|
|
$build->setCommitId($data['commit_id']);
|
|
|
|
$build->setBranch($data['branch']);
|
|
|
|
$build->setTag($data['tag']);
|
|
|
|
$build->setCommitterEmail($data['committer_email']);
|
|
|
|
$build->setCommitMessage($data['commit_message']);
|
2018-03-09 19:00:53 +01:00
|
|
|
$build->setExtra(json_decode($data['extra'], true));
|
2018-03-03 18:27:48 +01:00
|
|
|
$build->setEnvironment($data['environment']);
|
|
|
|
$build->setSource($data['source']);
|
|
|
|
$build->setUserId($data['user_id']);
|
2017-10-15 16:58:36 +02:00
|
|
|
$build->setCreateDate(new \DateTime());
|
2017-04-03 15:44:35 +02:00
|
|
|
$build->setStatus(Build::STATUS_PENDING);
|
2014-07-14 17:02:36 +02:00
|
|
|
|
2017-04-03 15:44:35 +02:00
|
|
|
/** @var Build $build */
|
2017-12-25 15:01:16 +01:00
|
|
|
$build = $this->buildStore->save($build);
|
2015-10-09 11:37:50 +02:00
|
|
|
$buildId = $build->getId();
|
|
|
|
|
|
|
|
if (!empty($buildId)) {
|
|
|
|
$build = BuildFactory::getBuild($build);
|
|
|
|
$build->sendStatusPostback();
|
|
|
|
$this->addBuildToQueue($build);
|
|
|
|
}
|
2015-10-05 15:07:48 +02:00
|
|
|
|
|
|
|
return $build;
|
2014-07-14 17:02:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a given build.
|
2017-11-05 15:48:36 +01:00
|
|
|
*
|
2014-07-14 17:02:36 +02:00
|
|
|
* @param Build $build
|
2017-11-05 15:48:36 +01:00
|
|
|
*
|
|
|
|
* @return boolean
|
2014-07-14 17:02:36 +02:00
|
|
|
*/
|
|
|
|
public function deleteBuild(Build $build)
|
|
|
|
{
|
2018-03-07 18:47:09 +01:00
|
|
|
$build->removeBuildDirectory(true);
|
2018-02-25 12:14:54 +01:00
|
|
|
|
2014-07-14 17:02:36 +02:00
|
|
|
return $this->buildStore->delete($build);
|
|
|
|
}
|
2015-10-05 13:13:22 +02:00
|
|
|
|
2015-10-05 15:11:43 +02:00
|
|
|
/**
|
|
|
|
* Takes a build and puts it into the queue to be run (if using a queue)
|
|
|
|
* @param Build $build
|
|
|
|
*/
|
2015-10-05 13:13:22 +02:00
|
|
|
public function addBuildToQueue(Build $build)
|
|
|
|
{
|
2015-10-05 15:41:13 +02:00
|
|
|
$buildId = $build->getId();
|
|
|
|
|
|
|
|
if (empty($buildId)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-04-21 06:58:09 +02:00
|
|
|
$config = Config::getInstance();
|
2017-01-23 16:41:02 +01:00
|
|
|
$settings = $config->get('php-censor.queue', []);
|
2015-10-05 13:13:22 +02:00
|
|
|
|
2017-01-23 16:41:02 +01:00
|
|
|
if (!empty($settings['host']) && !empty($settings['name'])) {
|
2016-06-23 12:28:42 +02:00
|
|
|
try {
|
2016-04-21 06:58:09 +02:00
|
|
|
$jobData = [
|
2016-07-21 19:02:11 +02:00
|
|
|
'type' => 'php-censor.build',
|
2016-06-23 12:28:42 +02:00
|
|
|
'build_id' => $build->getId(),
|
2016-04-21 06:58:09 +02:00
|
|
|
];
|
2016-06-23 12:28:42 +02:00
|
|
|
|
|
|
|
$pheanstalk = new Pheanstalk($settings['host']);
|
2017-01-23 16:41:02 +01:00
|
|
|
$pheanstalk->useTube($settings['name']);
|
2016-06-23 12:28:42 +02:00
|
|
|
$pheanstalk->put(
|
|
|
|
json_encode($jobData),
|
|
|
|
PheanstalkInterface::DEFAULT_PRIORITY,
|
|
|
|
PheanstalkInterface::DEFAULT_DELAY,
|
2017-01-23 16:41:02 +01:00
|
|
|
$config->get('php-censor.queue.lifetime', 600)
|
2016-06-23 12:28:42 +02:00
|
|
|
);
|
|
|
|
} catch (\Exception $ex) {
|
|
|
|
$this->queueError = true;
|
2015-10-05 13:13:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-07-14 17:02:36 +02:00
|
|
|
}
|