diff --git a/Mage/Config.php b/Mage/Config.php index 546b8e6..83dee6d 100644 --- a/Mage/Config.php +++ b/Mage/Config.php @@ -135,6 +135,12 @@ class Mage_Config return $taskConfig; } + public function setFrom($from) + { + $options['deployment']['from'] = $from; + return $this; + } + public function deployment($option, $default = false) { $options = $this->getEnvironment(); diff --git a/Mage/Console.php b/Mage/Console.php index b661b56..067c616 100644 --- a/Mage/Console.php +++ b/Mage/Console.php @@ -85,8 +85,10 @@ class Mage_Console self::log('---- Executing: $ ' . $command); ob_start(); - system($command . ' 2>&1', $return); - $log = ob_get_clean(); + $return = 1; + $log = array(); + exec($command . ' 2>&1', $log, $return); + $log = implode(PHP_EOL, $log); if (!$return) { $output = trim($log); diff --git a/Mage/Task/BuiltIn/Deployment/Releases.php b/Mage/Task/BuiltIn/Deployment/Releases.php index 90be299..a39c341 100644 --- a/Mage/Task/BuiltIn/Deployment/Releases.php +++ b/Mage/Task/BuiltIn/Deployment/Releases.php @@ -1,6 +1,7 @@ _name; + } + + public function init() + { + $this->_source = $this->_config->deployment('source'); + switch ($this->_source['type']) { + case 'git': + $this->_name = 'SCM Clone (GIT) [built-in]'; + break; + + case 'svn': + $this->_name = 'SCM Clone (Subversion) [built-in]'; + break; + } + } + + public function run() + { + $this->_runLocalCommand('mkdir -p ' . $this->_source['temporal']); + switch ($this->_source['type']) { + case 'git': + $command = 'cd ' . $this->_source['temporal'] + . ' && ' + . 'git clone ' . $this->_source['repository'] . ' . ' + . ' && ' + . 'git checkout ' . $this->_source['from']; + $this->_config->setFrom($this->_source['temporal']); + break; + + case 'svn': + return false; + break; + } + + $result = $this->_runLocalCommand($command); + + return $result; + } +} \ No newline at end of file diff --git a/Mage/Task/BuiltIn/Scm/RemoveClone.php b/Mage/Task/BuiltIn/Scm/RemoveClone.php new file mode 100644 index 0000000..27cfe37 --- /dev/null +++ b/Mage/Task/BuiltIn/Scm/RemoveClone.php @@ -0,0 +1,22 @@ +_name; + } + + public function init() + { + $this->_source = $this->_config->deployment('source'); + } + + public function run() + { + return $this->_runLocalCommand('rm -rf ' . $this->_source['temporal']); + } +} \ No newline at end of file diff --git a/Mage/Task/Deploy.php b/Mage/Task/Deploy.php index aa91ed5..74c4363 100644 --- a/Mage/Task/Deploy.php +++ b/Mage/Task/Deploy.php @@ -12,7 +12,7 @@ class Mage_Task_Deploy public function run(Mage_Config $config) { $this->_config = $config; - + // Run Pre-Deployment Tasks $this->_runNonDeploymentTasks('pre-deploy', $config, 'Pre-Deployment'); @@ -72,12 +72,24 @@ class Mage_Task_Deploy // Run Post-Deployment Tasks $this->_runNonDeploymentTasks('post-deploy', $config, 'Post-Deployment'); + } private function _runNonDeploymentTasks($stage, Mage_Config $config, $title) { $tasksToRun = $config->getTasks($stage); + // Look for Remote Source + if ($this->_config->deployment('from', false) == false) { + if (is_array($this->_config->deployment('source', null))) { + if ($stage == 'pre-deploy') { + array_unshift($tasksToRun, 'scm/clone'); + } elseif ($stage == 'post-deploy') { + array_unshift($tasksToRun, 'scm/remove-clone'); + } + } + } + if (count($tasksToRun) == 0) { Mage_Console::output('No ' . $title . ' tasks defined.', 1, 3); diff --git a/Mage/Task/Factory.php b/Mage/Task/Factory.php index 7139dec..7819239 100644 --- a/Mage/Task/Factory.php +++ b/Mage/Task/Factory.php @@ -11,7 +11,9 @@ class Mage_Task_Factory public static function get($taskName, Mage_Config $taskConfig, $inRollback = false) { $instance = null; - + $taskName = ucwords(str_replace('-', ' ', $taskName)); + $taskName = str_replace(' ', '', $taskName); + if (strpos($taskName, '/') === false) { Mage_Autoload::loadUserTask($taskName); $className = 'Task_' . ucfirst($taskName); diff --git a/docs/example-config/.mage/config/environment/production.yaml b/docs/example-config/.mage/config/environment/production.yaml index 4f2b8cb..07d858d 100644 --- a/docs/example-config/.mage/config/environment/production.yaml +++ b/docs/example-config/.mage/config/environment/production.yaml @@ -1,7 +1,12 @@ #production deployment: user: root - from: ./ +# from: ./ + source: + type: git + repository: git://github.com/andres-montanez/Zend-Framework-Twig-example-app.git + from: production + temporal: /tmp/myAppClone to: /var/www/vhosts/example.com/www excludes: - application/data/cache/twig/* @@ -12,8 +17,6 @@ releases: hosts: - s01.example.com - s02.example.com - - s03.example.com - - s05.example.com tasks: pre-deploy: - scm/update