From 47b089cb3eef70d1c4e0b4d5d9d7b3a3fd98bf75 Mon Sep 17 00:00:00 2001 From: hrakotobe Date: Fri, 9 May 2014 17:53:35 +0200 Subject: [PATCH 1/2] force use of sh on remote server and make directory ownership check more portable --- Mage/Task/AbstractTask.php | 15 ++++++++--- Mage/Task/BuiltIn/Deployment/ReleaseTask.php | 25 +++++++++++++++++-- .../BuiltIn/Deployment/Strategy/RsyncTask.php | 4 +++ .../BuiltIn/Deployment/Strategy/TarGzTask.php | 4 +-- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Mage/Task/AbstractTask.php b/Mage/Task/AbstractTask.php index f028ab7..cbd1e11 100644 --- a/Mage/Task/AbstractTask.php +++ b/Mage/Task/AbstractTask.php @@ -170,9 +170,10 @@ abstract class AbstractTask * Runs a Shell Command on the Remote Host * @param string $command * @param string $output + * @param boolean $cdToDirectoryFirst * @return boolean */ - protected final function runCommandRemote($command, &$output = null) + protected final function runCommandRemote($command, &$output = null, $cdToDirectoryFirst = true) { if ($this->getConfig()->release('enabled', false) == true) { if ($this instanceOf IsReleaseAware) { @@ -194,9 +195,15 @@ abstract class AbstractTask $localCommand = 'ssh ' . $this->getConfig()->getHostIdentityFileOption() . $needs_tty . ' -p ' . $this->getConfig()->getHostPort() . ' ' . '-q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' - . $this->getConfig()->deployment('user') . '@' . $this->getConfig()->getHostName() . ' ' - . '"cd ' . rtrim($this->getConfig()->deployment('to'), '/') . $releasesDirectory . ' && ' - . str_replace('"', '\"', $command) . '"'; + . $this->getConfig()->deployment('user') . '@' . $this->getConfig()->getHostName(); + + $remoteCommand = str_replace('"', '\"', $command); + if($cdToDirectoryFirst){ + $remoteCommand = 'cd ' . rtrim($this->getConfig()->deployment('to'), '/') . $releasesDirectory . ' && ' . $remoteCommand; + } + $localCommand .= ' ' . '"sh -c \"' . $remoteCommand . '\""'; + + Console::log('Run remote command ' . $remoteCommand); return $this->runCommandLocal($localCommand, $output); } diff --git a/Mage/Task/BuiltIn/Deployment/ReleaseTask.php b/Mage/Task/BuiltIn/Deployment/ReleaseTask.php index 7f8fef9..eaec9e8 100644 --- a/Mage/Task/BuiltIn/Deployment/ReleaseTask.php +++ b/Mage/Task/BuiltIn/Deployment/ReleaseTask.php @@ -46,9 +46,30 @@ class ReleaseTask extends AbstractTask implements IsReleaseAware, SkipOnOverride $currentCopy = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); + //Check if target user:group is specified + $userGroup = $this->getConfig()->deployment('chown'); // Fetch the user and group from base directory; defaults usergroup to 33:33 - $userGroup = ''; - $resultFetch = $this->runCommandRemote('ls -ld . | awk \'{print \$3":"\$4}\'', $userGroup); + if(empty($userGroup)){ + $user = '33'; + $group = '33'; + $directoryInfos = ''; + // Get raw directory info and parse it in php. + // "stat" command don't behave the same on different systems, ls output format also varies + // and awk parameters need special care depending on the executing shell + $resultFetch = $this->runCommandRemote("ls -ld .", $directoryInfos); + if(!empty($directoryInfos)){ + //uniformize format as it depends on the system deployed on + $directoryInfos = trim(str_replace(array(" ", "\t"), ' ', $directoryInfos)); + $infoArray = explode(' ', $directoryInfos); + if(!empty($infoArray[2])) { + $user = $infoArray[2]; + } + if(!empty($infoArray[3])) { + $group = $infoArray[3]; + } + $userGroup = $user . ':' . $group; + } + } // Remove symlink if exists; create new symlink and change owners $command = 'rm -f ' . $symlink diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php index 74af0ea..42f8bfd 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/RsyncTask.php @@ -79,6 +79,10 @@ class RsyncTask extends AbstractTask implements IsReleaseAware $deployToDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); + + Console::log('Deploy to ' . $deployToDirectory); + + $resultFetch = $this->runCommandRemote('ls -ld current | cut -d"/" -f2', $currentRelease); if ($resultFetch && $currentRelease) { diff --git a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php index e1b6477..684b89e 100644 --- a/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php +++ b/Mage/Task/BuiltIn/Deployment/Strategy/TarGzTask.php @@ -69,11 +69,11 @@ class TarGzTask extends AbstractTask implements IsReleaseAware $deployToDirectory = $this->getConfig()->deployment('to'); if ($this->getConfig()->release('enabled', false) == true) { $releasesDirectory = $this->getConfig()->release('directory', 'releases'); - $deployToDirectory = rtrim($this->getConfig()->deployment('to'), '/') . '/' . $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); - $this->runCommandRemote('mkdir -p ' . $releasesDirectory . '/' . $this->getConfig()->getReleaseId()); + $output = null; + $this->runCommandRemote('mkdir -p ' . $deployToDirectory, $output , false); } // Create Tar Gz From 7ad5403c81e90469ae384402910e1bdbd0a9e8a4 Mon Sep 17 00:00:00 2001 From: hrakotobe Date: Fri, 9 May 2014 18:15:03 +0200 Subject: [PATCH 2/2] change setting name --- Mage/Task/BuiltIn/Deployment/ReleaseTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/Task/BuiltIn/Deployment/ReleaseTask.php b/Mage/Task/BuiltIn/Deployment/ReleaseTask.php index eaec9e8..10015ab 100644 --- a/Mage/Task/BuiltIn/Deployment/ReleaseTask.php +++ b/Mage/Task/BuiltIn/Deployment/ReleaseTask.php @@ -47,7 +47,7 @@ class ReleaseTask extends AbstractTask implements IsReleaseAware, SkipOnOverride $currentCopy = $releasesDirectory . '/' . $this->getConfig()->getReleaseId(); //Check if target user:group is specified - $userGroup = $this->getConfig()->deployment('chown'); + $userGroup = $this->getConfig()->deployment('owner'); // Fetch the user and group from base directory; defaults usergroup to 33:33 if(empty($userGroup)){ $user = '33';