/**
  * Register tasks for this application
  *
  * @param \TYPO3\Surf\Domain\Model\Workflow $workflow
  * @param \TYPO3\Surf\Domain\Model\Deployment $deployment
  * @return void
  */
 public function registerTasks(Workflow $workflow, Deployment $deployment)
 {
     $workflow->addTask(array('famelo.surf.sharedhosting:patchflow', 'famelo.surf.sharedhosting:patchsettings', 'famelo.surf.sharedhosting:setdefaultcontext'), 'update');
     parent::registerTasks($workflow, $deployment);
     $workflow->beforeTask('typo3.surf:transfer:rsync', array('famelo.surf.sharedhosting:beardpatch'), $this);
     $workflow->afterStage('update', array('famelo.surf.sharedhosting:symlinkconfiguration'), $this);
     $workflow->removeTask('typo3.surf:typo3:flow:symlinkconfiguration');
 }
Example #2
0
 /**
  * Registers a Grunt build task if the project Extension path was specified in the options.
  *
  * @param Workflow $workflow
  */
 protected function registerFrontendBuildTasks(Workflow $workflow)
 {
     if (!$this->hasOption('projectExtensionPath')) {
         return;
     }
     $projectExtensionPath = rtrim($this->getOption('projectExtensionPath'), '/');
     $workflow->defineTask('Intera\\Surf\\DefinedTask\\Grunt\\BuildTask', \Intera\Surf\Task\Grunt\BuildTask::class, ['forceLocalMode' => true, 'gruntRootPath' => $projectExtensionPath . '/Resources/Private/Build', 'skipMissingDirectory' => true]);
     $workflow->afterTask('TYPO3\\Surf\\DefinedTask\\Composer\\LocalInstallTask', 'Intera\\Surf\\DefinedTask\\Grunt\\BuildTask', $this);
 }
Example #3
0
 /**
  * Add support for updateMethod "composer"
  *
  * @param \TYPO3\Surf\Domain\Model\Workflow $workflow
  * @param string $updateMethod
  * @return void
  */
 protected function registerTasksForUpdateMethod(Workflow $workflow, $updateMethod)
 {
     switch ($updateMethod) {
         case 'composer':
             $workflow->addTask('TYPO3\\Surf\\Task\\Composer\\InstallTask', 'update', $this);
             break;
         default:
             parent::registerTasksForUpdateMethod($workflow, $updateMethod);
             break;
     }
 }
Example #4
0
 /**
  * Prints configuration for each defined application
  *
  * @param array $applications
  * @param Workflow $workflow
  */
 protected function printApplications(array $applications, Workflow $workflow)
 {
     $this->output->writeln(PHP_EOL . 'Applications:' . PHP_EOL);
     foreach ($applications as $application) {
         $this->output->writeln('  <success>' . $application->getName() . ':</success>');
         $this->output->writeln('    <comment>Deployment path</comment>: <success>' . $application->getDeploymentPath() . '</success>');
         $this->output->writeln('    <comment>Options</comment>: ');
         foreach ($application->getOptions() as $key => $value) {
             $printableValue = is_scalar($value) ? $value : gettype($value);
             $this->output->writeln('      ' . $key . ' => <success>' . $printableValue . '</success>');
         }
         $this->output->writeln('    <comment>Nodes</comment>: <success>' . implode(', ', $application->getNodes()) . '</success>');
         if ($workflow instanceof SimpleWorkflow) {
             $this->output->writeln('    <comment>Detailed workflow</comment>: ');
             $this->printStages($application, $workflow->getStages(), $workflow->getTasks());
         }
     }
 }
Example #5
0
 /**
  * Sequentially execute the stages for each node, so first all nodes will go through the initialize stage and
  * then the next stage will be executed until the final stage is reached and the workflow is finished.
  *
  * A rollback will be done for all nodes as long as the stage switch was not completed.
  *
  * @param Deployment $deployment
  * @return void
  * @throws \TYPO3\Surf\Exception\InvalidConfigurationException
  */
 public function run(Deployment $deployment)
 {
     parent::run($deployment);
     $applications = $deployment->getApplications();
     if (count($applications) === 0) {
         throw new InvalidConfigurationException('No application configured for deployment', 1334652420);
     }
     $nodes = $deployment->getNodes();
     if (count($nodes) === 0) {
         throw new InvalidConfigurationException('No nodes configured for application', 1334652427);
     }
     foreach ($this->stages as $stage) {
         $deployment->getLogger()->notice('Stage ' . $stage);
         foreach ($nodes as $node) {
             $deployment->getLogger()->debug('Node ' . $node->getName());
             foreach ($applications as $application) {
                 if (!$application->hasNode($node)) {
                     continue;
                 }
                 $deployment->getLogger()->debug('Application ' . $application->getName());
                 try {
                     $this->executeStage($stage, $node, $application, $deployment);
                 } catch (\Exception $exception) {
                     $deployment->setStatus(Deployment::STATUS_FAILED);
                     if ($this->enableRollback) {
                         if (array_search($stage, $this->stages) <= array_search('switch', $this->stages)) {
                             $deployment->getLogger()->error('Got exception "' . $exception->getMessage() . '" rolling back.');
                             $this->taskManager->rollback();
                         } else {
                             $deployment->getLogger()->error('Got exception "' . $exception->getMessage() . '" but after switch stage, no rollback necessary.');
                             $this->taskManager->reset();
                         }
                     } else {
                         $deployment->getLogger()->error('Got exception "' . $exception->getMessage() . '" but rollback disabled. Stopping.');
                     }
                     return;
                 }
             }
         }
     }
     if ($deployment->getStatus() === Deployment::STATUS_UNKNOWN) {
         $deployment->setStatus(Deployment::STATUS_SUCCESS);
     }
 }
Example #6
0
 /**
  * Simulate this deployment without executing tasks
  *
  * It will set dryRun = TRUE which can be inspected by any task.
  *
  * @return void
  */
 public function simulate()
 {
     $this->setDryRun(true);
     $this->logger->notice('Simulating ' . $this->name . ' (' . $this->releaseIdentifier . ')');
     $this->workflow->run($this);
 }
Example #7
0
 /**
  * Configure tasks
  *
  * @param Workflow $workflow
  * @param Deployment $deployment
  * @return void
  */
 protected function defineTasks(Workflow $workflow, Deployment $deployment)
 {
     $excludePatterns = array('.git*', 'Data/*', 'Web/_Resources/*', 'Build/Reports', './Cache', 'Configuration/PackageStates.php');
     $baseArchiveConfiguration = array('sourceDirectory' => $deployment->getApplicationReleasePath($this), 'baseDirectory' => $this->configuration['versionAndProjectName'], 'exclude' => $excludePatterns);
     $workflow->defineTask('TYPO3\\Surf\\DefinedTask\\CreateZipDistributionTask', 'TYPO3\\Surf\\Task\\CreateArchiveTask', array_merge($baseArchiveConfiguration, array('targetFile' => $this->configuration['zipFile'])));
     $workflow->defineTask('TYPO3\\Surf\\DefinedTask\\CreateTarGzDistributionTask', 'TYPO3\\Surf\\Task\\CreateArchiveTask', array_merge($baseArchiveConfiguration, array('targetFile' => $this->configuration['tarGzFile'])));
     $workflow->defineTask('TYPO3\\Surf\\DefinedTask\\CreateTarBz2DistributionTask', 'TYPO3\\Surf\\Task\\CreateArchiveTask', array_merge($baseArchiveConfiguration, array('targetFile' => $this->configuration['tarBz2File'])));
     if ($this->hasOption('enableSourceforgeUpload') && $this->getOption('enableSourceforgeUpload') === true) {
         $workflow->defineTask('TYPO3\\Surf\\Task\\SourceforgeUploadTask', 'TYPO3\\Surf\\Task\\SourceforgeUploadTask', array('sourceforgeProjectName' => $this->getOption('sourceforgeProjectName'), 'sourceforgePackageName' => $this->getOption('sourceforgePackageName'), 'sourceforgeUserName' => $this->getOption('sourceforgeUserName'), 'version' => $this->getOption('version'), 'files' => array($this->configuration['zipFile'], $this->configuration['tarGzFile'], $this->configuration['tarBz2File'])));
     }
     if ($this->hasOption('releaseHost')) {
         $workflow->defineTask('TYPO3\\Surf\\Task\\Release\\PrepareReleaseTask', 'TYPO3\\Surf\\Task\\Release\\PrepareReleaseTask', array('releaseHost' => $this->getOption('releaseHost'), 'releaseHostSitePath' => $this->getOption('releaseHostSitePath'), 'releaseHostLogin' => $this->hasOption('releaseHostLogin') ? $this->getOption('releaseHostLogin') : null, 'productName' => $this->getOption('projectName'), 'version' => $this->getOption('version')));
         $workflow->defineTask('TYPO3\\Surf\\Task\\Release\\ReleaseTask', 'TYPO3\\Surf\\Task\\Release\\ReleaseTask', array('releaseHost' => $this->getOption('releaseHost'), 'releaseHostSitePath' => $this->getOption('releaseHostSitePath'), 'releaseHostLogin' => $this->hasOption('releaseHostLogin') ? $this->getOption('releaseHostLogin') : null, 'productName' => $this->getOption('projectName'), 'version' => $this->getOption('version'), 'changeLogUri' => $this->hasOption('changeLogUri') ? $this->getOption('changeLogUri') : null));
     }
     if ($this->hasOption('releaseHost') && $this->hasOption('enableSourceforgeUpload') && $this->getOption('enableSourceforgeUpload') === true) {
         $workflow->defineTask('TYPO3\\Surf\\Task\\Release\\AddDownloadTask', 'TYPO3\\Surf\\Task\\Release\\AddDownloadTask', array('releaseHost' => $this->getOption('releaseHost'), 'releaseHostSitePath' => $this->getOption('releaseHostSitePath'), 'releaseHostLogin' => $this->hasOption('releaseHostLogin') ? $this->getOption('releaseHostLogin') : null, 'productName' => $this->getOption('projectName'), 'version' => $this->getOption('version'), 'label' => $this->getOption('releaseDownloadLabel'), 'downloadUriPattern' => $this->getOption('releaseDownloadUriPattern'), 'files' => array($this->configuration['zipFile'], $this->configuration['tarGzFile'], $this->configuration['tarBz2File'])));
     }
     $workflow->defineTask('TYPO3\\Surf\\Task\\Git\\TagTask', 'TYPO3\\Surf\\Task\\Git\\TagTask', array('tagName' => $this->configuration['versionAndProjectName'], 'description' => 'Tag distribution with tag ' . $this->configuration['versionAndProjectName'], 'recurseIntoSubmodules' => $this->getOption('tagRecurseIntoSubmodules')));
     $workflow->defineTask('TYPO3\\Surf\\DefinedTask\\Git\\PushTagsTask', 'TYPO3\\Surf\\Task\\Git\\PushTask', array('remote' => 'origin', 'refspec' => $this->configuration['versionAndProjectName'] . ':refs/tags/' . $this->configuration['versionAndProjectName'], 'recurseIntoSubmodules' => $this->getOption('tagRecurseIntoSubmodules')));
 }
Example #8
0
 /**
  * @param \TYPO3\Surf\Domain\Model\Workflow $workflow
  * @param string $transferMethod
  * @return void
  */
 protected function registerTasksForTransferMethod(Workflow $workflow, $transferMethod)
 {
     switch ($transferMethod) {
         case 'git':
             $workflow->addTask('TYPO3\\Surf\\Task\\GitCheckoutTask', 'transfer', $this);
             break;
         case 'rsync':
             $workflow->addTask('TYPO3\\Surf\\Task\\Transfer\\RsyncTask', 'transfer', $this);
             break;
         case 'scp':
             // TODO
             break;
         case 'ftp':
             // TODO
             break;
     }
 }
 /**
  * @param Workflow $workflow
  * @param Deployment $deployment
  * @return void
  */
 protected function defineTasks(Workflow $workflow, Deployment $deployment)
 {
     foreach ($this->taskOptions as $task => $taskSettings) {
         if (empty($taskSettings['baseTask'])) {
             $taskSettings['baseTask'] = $task;
         }
         if ($taskSettings['baseTask'] !== $task && isset($this->taskOptions[$taskSettings['baseTask']])) {
             $taskSettings['baseTask'] = $this->getTaskNameForApplication($taskSettings['baseTask']);
         }
         if (!isset($taskSettings['options']) || !is_array($taskSettings['options'])) {
             $taskSettings['options'] = array();
         }
         $workflow->defineTask($this->getTaskNameForApplication($task), $taskSettings['baseTask'], $taskSettings['options']);
     }
 }