예제 #1
0
파일: BuildTest.php 프로젝트: zeus911/PHPCI
 /**
  * @covers PHPUnit::execute
  */
 public function testExecute_TestIsSuccessful()
 {
     $build = new Build();
     $build->setStatus(Build::STATUS_NEW);
     $this->assertFalse($build->isSuccessful());
     $build->setStatus(Build::STATUS_RUNNING);
     $this->assertFalse($build->isSuccessful());
     $build->setStatus(Build::STATUS_FAILED);
     $this->assertFalse($build->isSuccessful());
     $build->setStatus(Build::STATUS_SUCCESS);
     $this->assertTrue($build->isSuccessful());
 }
예제 #2
0
 /**
  * @param Project $project
  * @param string|null $commitId
  * @param string|null $branch
  * @param string|null $committerEmail
  * @param string|null $commitMessage
  * @param string|null $extra
  * @return \PHPCI\Model\Build
  */
 public function createBuild(Project $project, $commitId = null, $branch = null, $committerEmail = null, $commitMessage = null, $extra = null)
 {
     $build = new Build();
     $build->setCreated(new \DateTime());
     $build->setProject($project);
     $build->setStatus(0);
     if (!is_null($commitId)) {
         $build->setCommitId($commitId);
     } else {
         $build->setCommitId('Manual');
     }
     if (!is_null($branch)) {
         $build->setBranch($branch);
     } else {
         $build->setBranch($project->getBranch());
     }
     if (!is_null($committerEmail)) {
         $build->setCommitterEmail($committerEmail);
     }
     if (!is_null($commitMessage)) {
         $build->setCommitMessage($commitMessage);
     }
     if (!is_null($extra)) {
         $build->setExtra(json_encode($extra));
     }
     return $this->buildStore->save($build);
 }
예제 #3
0
 /**
  * Run the active build.
  */
 public function execute()
 {
     // Update the build in the database, ping any external services.
     $this->build->setStatus(Build::STATUS_RUNNING);
     $this->build->setStarted(new \DateTime());
     $this->store->save($this->build);
     $this->build->sendStatusPostback();
     $success = true;
     $previous_build = $this->build->getProject()->getPreviousBuild($this->build->getBranch());
     $previous_state = Build::STATUS_NEW;
     if ($previous_build) {
         $previous_state = $previous_build->getStatus();
     }
     try {
         // Set up the build:
         $this->setupBuild();
         // Run the core plugin stages:
         foreach (array('setup', 'test') as $stage) {
             $success &= $this->pluginExecutor->executePlugins($this->config, $stage);
         }
         // Set the status so this can be used by complete, success and failure
         // stages.
         if ($success) {
             $this->build->setStatus(Build::STATUS_SUCCESS);
         } else {
             $this->build->setStatus(Build::STATUS_FAILED);
         }
         if ($success) {
             $this->pluginExecutor->executePlugins($this->config, 'success');
             if ($previous_state == Build::STATUS_FAILED) {
                 $this->pluginExecutor->executePlugins($this->config, 'fixed');
             }
             $this->buildLogger->logSuccess(Lang::get('build_success'));
         } else {
             $this->pluginExecutor->executePlugins($this->config, 'failure');
             if ($previous_state == Build::STATUS_SUCCESS || $previous_state == Build::STATUS_NEW) {
                 $this->pluginExecutor->executePlugins($this->config, 'broken');
             }
             $this->buildLogger->logFailure(Lang::get('build_failed'));
         }
     } catch (\Exception $ex) {
         $this->build->setStatus(Build::STATUS_FAILED);
         $this->buildLogger->logFailure(Lang::get('exception') . $ex->getMessage());
     } finally {
         // Complete stage plugins are always run
         $this->pluginExecutor->executePlugins($this->config, 'complete');
     }
     // Update the build in the database, ping any external services, etc.
     $this->build->sendStatusPostback();
     $this->build->setFinished(new \DateTime());
     // Clean up:
     $this->buildLogger->log(Lang::get('removing_build'));
     $this->build->removeBuildDirectory();
     $this->store->save($this->build);
 }
예제 #4
0
 /**
  * @param Build $copyFrom
  * @return \PHPCI\Model\Build
  */
 public function createDuplicateBuild(Build $copyFrom)
 {
     $data = $copyFrom->getDataArray();
     // Clean up unwanted properties from the original build:
     unset($data['id']);
     unset($data['status']);
     unset($data['log']);
     unset($data['started']);
     unset($data['finished']);
     $build = new Build();
     $build->setValues($data);
     $build->setCreated(new \DateTime());
     $build->setStatus(0);
     return $this->buildStore->save($build);
 }
예제 #5
0
 /**
  * Run the active build.
  */
 public function execute()
 {
     // Update the build in the database, ping any external services.
     $this->build->setStatus(Build::STATUS_RUNNING);
     $this->build->setStarted(new \DateTime());
     $this->store->save($this->build);
     $this->build->sendStatusPostback();
     $success = true;
     try {
         // Set up the build:
         $this->setupBuild();
         // Run the core plugin stages:
         foreach (array('setup', 'test') as $stage) {
             $success &= $this->pluginExecutor->executePlugins($this->config, $stage);
         }
         // Set the status so this can be used by complete, success and failure
         // stages.
         if ($success) {
             $this->build->setStatus(Build::STATUS_SUCCESS);
         } else {
             $this->build->setStatus(Build::STATUS_FAILED);
         }
         // Complete stage plugins are always run
         $this->pluginExecutor->executePlugins($this->config, 'complete');
         if ($success) {
             $this->pluginExecutor->executePlugins($this->config, 'success');
             $this->buildLogger->logSuccess(Lang::get('build_success'));
         } else {
             $this->pluginExecutor->executePlugins($this->config, 'failure');
             $this->buildLogger->logFailure(Lang::get('build_failed'));
         }
         // Clean up:
         $this->buildLogger->log(Lang::get('removing_build'));
         $cmd = 'rm -Rf "%s"';
         if (IS_WIN) {
             $cmd = 'rmdir /S /Q "%s"';
         }
         $this->executeCommand($cmd, $this->buildPath);
     } catch (\Exception $ex) {
         $this->build->setStatus(Build::STATUS_FAILED);
         $this->buildLogger->logFailure(Lang::get('exception') . $ex->getMessage());
     }
     // Update the build in the database, ping any external services, etc.
     $this->build->sendStatusPostback();
     $this->build->setFinished(new \DateTime());
     $this->store->save($this->build);
 }
예제 #6
0
 /**
  * @param $configId
  * @param bool $setProject
  * @return Build
  */
 protected function getBuild($configId, $setProject = true)
 {
     $config = array('1' => array('status' => Build::STATUS_RUNNING, 'id' => 77, 'finishDateTime' => null, 'startedDate' => '2014-10-25 21:20:02', 'previousBuild' => null), '2' => array('status' => Build::STATUS_RUNNING, 'id' => 78, 'finishDateTime' => null, 'startedDate' => '2014-10-25 21:20:02', 'previousBuild' => 4), '3' => array('status' => Build::STATUS_SUCCESS, 'id' => 7, 'finishDateTime' => '2014-10-25 21:50:02', 'startedDate' => '2014-10-25 21:20:02', 'previousBuild' => null), '4' => array('status' => Build::STATUS_FAILED, 'id' => 13, 'finishDateTime' => '2014-10-13 13:13:13', 'previousBuild' => null), '5' => array('status' => Build::STATUS_NEW, 'id' => 1000, 'finishDateTime' => '2014-12-25 21:12:21', 'previousBuild' => 3));
     $build = new Build();
     $build->setId($config[$configId]['id']);
     $build->setBranch(self::BRANCH);
     $build->setStatus($config[$configId]['status']);
     if ($config[$configId]['finishDateTime']) {
         $build->setFinished(new \DateTime($config[$configId]['finishDateTime']));
     }
     if (!empty($config[$configId]['startedDate'])) {
         $build->setStarted(new \DateTime('2014-10-25 21:20:02'));
     }
     $project = $this->getProjectMock($config[$configId]['previousBuild'], $setProject);
     $build->setProjectObject($project);
     return $build;
 }
예제 #7
0
 /**
  * Create a new pending build for a project.
  */
 public function build($projectId)
 {
     /* @var \PHPCI\Model\Project $project */
     $project = $this->projectStore->getById($projectId);
     if (empty($project)) {
         throw new NotFoundException('Project with id: ' . $projectId . ' not found');
     }
     $build = new Build();
     $build->setProjectId($projectId);
     $build->setCommitId('Manual');
     $build->setStatus(Build::STATUS_NEW);
     $build->setBranch($project->getBranch());
     $build->setCreated(new \DateTime());
     $build->setCommitterEmail($_SESSION['user']->getEmail());
     $build = $this->buildStore->save($build);
     header('Location: ' . PHPCI_URL . 'build/view/' . $build->getId());
     exit;
 }
예제 #8
0
 /**
  * Pulls all pending builds from the database and runs them.
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $parser = new Parser();
     $yaml = file_get_contents(APPLICATION_PATH . 'PHPCI/config.yml');
     $this->settings = $parser->parse($yaml);
     $token = $this->settings['phpci']['github']['token'];
     if (!$token) {
         $this->logger->error(Lang::get('no_token'));
         return;
     }
     $buildStore = Factory::getStore('Build');
     $this->logger->addInfo(Lang::get('finding_projects'));
     $projectStore = Factory::getStore('Project');
     $result = $projectStore->getWhere();
     $this->logger->addInfo(Lang::get('found_n_projects', count($result['items'])));
     foreach ($result['items'] as $project) {
         $http = new HttpClient('https://api.github.com');
         $commits = $http->get('/repos/' . $project->getReference() . '/commits', array('access_token' => $token));
         $last_commit = $commits['body'][0]['sha'];
         $last_committer = $commits['body'][0]['commit']['committer']['email'];
         $message = $commits['body'][0]['commit']['message'];
         $this->logger->info(Lang::get('last_commit_is', $project->getTitle(), $last_commit));
         if ($project->getLastCommit() != $last_commit && $last_commit != "") {
             $this->logger->info(Lang::get('adding_new_build'));
             $build = new Build();
             $build->setProjectId($project->getId());
             $build->setCommitId($last_commit);
             $build->setStatus(Build::STATUS_NEW);
             $build->setBranch($project->getBranch());
             $build->setCreated(new \DateTime());
             $build->setCommitMessage($message);
             if (!empty($last_committer)) {
                 $build->setCommitterEmail($last_committer);
             }
             $buildStore->save($build);
             $project->setLastCommit($last_commit);
             $projectStore->save($project);
         }
     }
     $this->logger->addInfo(Lang::get('finished_processing_builds'));
 }
예제 #9
0
 /**
  * Pulls all pending builds from the database and runs them.
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $parser = new Parser();
     $yaml = file_get_contents(APPLICATION_PATH . 'PHPCI/config.yml');
     $this->settings = $parser->parse($yaml);
     $token = $this->settings['phpci']['github']['token'];
     if (!$token) {
         $this->logger->error("No github token found");
         exit;
     }
     $buildStore = Factory::getStore('Build');
     $this->logger->addInfo("Finding projects to poll");
     $projectStore = Factory::getStore('Project');
     $result = $projectStore->getWhere();
     $this->logger->addInfo(sprintf("Found %d projects", count($result['items'])));
     foreach ($result['items'] as $project) {
         $http = new HttpClient('https://api.github.com');
         $commits = $http->get('/repos/' . $project->getReference() . '/commits', array('access_token' => $token));
         $last_commit = $commits['body'][0]['sha'];
         $last_committer = $commits['body'][0]['commit']['committer']['email'];
         $this->logger->info("Last commit to github for " . $project->getTitle() . " is " . $last_commit);
         if ($project->getLastCommit() != $last_commit && $last_commit != "") {
             $this->logger->info("Last commit is different from database, adding new build for " . $project->getTitle());
             $build = new Build();
             $build->setProjectId($project->getId());
             $build->setCommitId($last_commit);
             $build->setStatus(Build::STATUS_NEW);
             $build->setBranch($project->getBranch());
             $build->setCreated(new \DateTime());
             if (!empty($last_committer)) {
                 $build->setCommitterEmail($last_committer);
             }
             $buildStore->save($build);
             $project->setLastCommit($last_commit);
             $projectStore->save($project);
         }
     }
     $this->logger->addInfo("Finished processing builds");
 }
예제 #10
0
 /**
  * @covers PHPUnit::execute
  */
 public function testExecute_CreateDuplicateBuild()
 {
     $build = new Build();
     $build->setId(1);
     $build->setProject(101);
     $build->setCommitId('abcde');
     $build->setStatus(Build::STATUS_FAILED);
     $build->setLog('Test');
     $build->setBranch('example_branch');
     $build->setStarted(new \DateTime());
     $build->setFinished(new \DateTime());
     $build->setCommitMessage('test');
     $build->setCommitterEmail('*****@*****.**');
     $build->setExtra(json_encode(array('item1' => 1001)));
     $returnValue = $this->testedService->createDuplicateBuild($build);
     $this->assertNotEquals($build->getId(), $returnValue->getId());
     $this->assertEquals($build->getProjectId(), $returnValue->getProjectId());
     $this->assertEquals($build->getCommitId(), $returnValue->getCommitId());
     $this->assertNotEquals($build->getStatus(), $returnValue->getStatus());
     $this->assertEquals(Build::STATUS_NEW, $returnValue->getStatus());
     $this->assertNull($returnValue->getLog());
     $this->assertEquals($build->getBranch(), $returnValue->getBranch());
     $this->assertNotEquals($build->getCreated(), $returnValue->getCreated());
     $this->assertNull($returnValue->getStarted());
     $this->assertNull($returnValue->getFinished());
     $this->assertEquals('test', $returnValue->getCommitMessage());
     $this->assertEquals('*****@*****.**', $returnValue->getCommitterEmail());
     $this->assertEquals($build->getExtra('item1'), $returnValue->getExtra('item1'));
 }
예제 #11
0
 /**
  * @param Build $copyFrom
  * @return \PHPCI\Model\Build
  */
 public function createDuplicateBuild(Build $copyFrom)
 {
     $data = $copyFrom->getDataArray();
     // Clean up unwanted properties from the original build:
     unset($data['id']);
     unset($data['status']);
     unset($data['log']);
     unset($data['started']);
     unset($data['finished']);
     $build = new Build();
     $build->setValues($data);
     $build->setCreated(new \DateTime());
     $build->setStatus(0);
     $build = $this->buildStore->save($build);
     $buildId = $build->getId();
     if (!empty($buildId)) {
         $build = BuildFactory::getBuild($build);
         $build->sendStatusPostback();
         $this->addBuildToQueue($build);
     }
     return $build;
 }
예제 #12
0
 protected function createBuild($projectId, $commitId, $branch, $committer, $commitMessage, $extra = null)
 {
     // Check if a build already exists for this commit ID:
     $builds = $this->buildStore->getByProjectAndCommit($projectId, $commitId);
     if ($builds['count']) {
         return true;
     }
     // If not, create a new build job for it:
     $build = new Build();
     $build->setProjectId($projectId);
     $build->setCommitId($commitId);
     $build->setStatus(Build::STATUS_NEW);
     $build->setLog('');
     $build->setCreated(new \DateTime());
     $build->setBranch($branch);
     $build->setCommitterEmail($committer);
     $build->setCommitMessage($commitMessage);
     if (!is_null($extra)) {
         $build->setExtra(json_encode($extra));
     }
     $build = BuildFactory::getBuild($this->buildStore->save($build));
     // Send a status postback if the build type provides one:
     $build->sendStatusPostback();
     return true;
 }
예제 #13
0
 /**
  * Create a build using an existing build as a template:
  */
 public function rebuild($buildId)
 {
     $copy = BuildFactory::getBuildById($buildId);
     if (empty($copy)) {
         throw new NotFoundException('Build with ID: ' . $buildId . ' does not exist.');
     }
     $build = new Build();
     $build->setProjectId($copy->getProjectId());
     $build->setCommitId($copy->getCommitId());
     $build->setStatus(Build::STATUS_NEW);
     $build->setBranch($copy->getBranch());
     $build->setCreated(new \DateTime());
     $build->setCommitterEmail($copy->getCommitterEmail());
     $build->setCommitMessage($copy->getCommitMessage());
     $build->setExtra(json_encode($copy->getExtra()));
     $build = $this->buildStore->save($build);
     header('Location: ' . PHPCI_URL . 'build/view/' . $build->getId());
     exit;
 }