/** * 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'); }
/** * 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); }
/** * 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; } }
/** * 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()); } } }
/** * 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); } }
/** * 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); }
/** * 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'))); }
/** * @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']); } }