From 2b9370e0c7f339536641aa3e3482ddc5a4d09225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gero=20M=C3=BCller?= Date: Fri, 6 Jul 2018 11:26:56 +0200 Subject: [PATCH 1/3] add simple vagrant support --- lib/Extension.php | 3 ++- lib/ShellContext.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/Extension.php b/lib/Extension.php index 9e35e0b..319d1cd 100644 --- a/lib/Extension.php +++ b/lib/Extension.php @@ -39,7 +39,7 @@ public function configure(ArrayNodeDefinition $builder) $builder ->prototype('array') ->children() - ->enumNode('type')->values(['local', 'remote', 'docker'])->defaultValue('local')->end() + ->enumNode('type')->values(['local', 'remote', 'docker', 'vagrant'])->defaultValue('local')->end() ->scalarNode('base_dir')->defaultNull()->end() ->scalarNode('ssh_command')->defaultValue('ssh')->end() ->scalarNode('scp_command')->defaultValue('scp')->end() @@ -49,6 +49,7 @@ public function configure(ArrayNodeDefinition $builder) ->scalarNode('docker_command')->defaultValue('docker')->end() ->scalarNode('docker_options')->defaultNull()->end() ->scalarNode('docker_containername')->defaultNull()->end() + ->scalarNode('vagrant_cwd')->defaultNull()->end() ->end() ->end(); } diff --git a/lib/ShellContext.php b/lib/ShellContext.php index 1312bdc..5839d0a 100644 --- a/lib/ShellContext.php +++ b/lib/ShellContext.php @@ -48,6 +48,8 @@ public function initializeFeatureFilePath(ScenarioScope $scope) */ public function iRun($command, $server = 'default') { + $server = str_replace('-', '_', $server); + if (!isset($this->config[$server])) { throw new \Exception(sprintf('Configuration not found for server "%s"', $server)); } @@ -177,6 +179,10 @@ private function createProcess($command, array $serverConfig) $process = $this->createDockerProcess($command, $serverConfig); break; + case 'vagrant': + $process = $this->createVagrantProcess($command, $serverConfig); + break; + default: $process = $this->createLocalProcess($command, $serverConfig); break; @@ -223,6 +229,30 @@ private function createRemoteProcess($command, array $serverConfig) return new Process($command); } + /** + * @param string $command + * @param array $serverConfig + * + * @return Process + */ + private function createVagrantProcess($command, array $serverConfig) + { + if ($serverConfig['base_dir']) { + $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); + } + + $command = sprintf( + 'vagrant ssh -- %s', + escapeshellarg($command) + ); + + if ($serverConfig['vagrant_cwd']) { + return new Process($command, $serverConfig['vagrant_cwd']); + } else { + return new Process($command); + } + } + /** * @param string $command * @param array $serverConfig From 7a75558e09554ce498263ab714ae12c966caa9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gero=20M=C3=BCller?= Date: Fri, 13 Jul 2018 15:25:20 +0200 Subject: [PATCH 2/3] add env to shell commands --- lib/Extension.php | 3 +++ lib/ShellContext.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/Extension.php b/lib/Extension.php index 319d1cd..878daa2 100644 --- a/lib/Extension.php +++ b/lib/Extension.php @@ -41,6 +41,9 @@ public function configure(ArrayNodeDefinition $builder) ->children() ->enumNode('type')->values(['local', 'remote', 'docker', 'vagrant'])->defaultValue('local')->end() ->scalarNode('base_dir')->defaultNull()->end() + ->arrayNode('env') + ->scalarPrototype()->end() + ->end() ->scalarNode('ssh_command')->defaultValue('ssh')->end() ->scalarNode('scp_command')->defaultValue('scp')->end() ->scalarNode('ssh_options')->defaultNull()->end() diff --git a/lib/ShellContext.php b/lib/ShellContext.php index 5839d0a..8b358b3 100644 --- a/lib/ShellContext.php +++ b/lib/ShellContext.php @@ -195,6 +195,21 @@ private function createProcess($command, array $serverConfig) return $process; } + /** + * @param string $command + * @param array $nv + * + * @return string + */ + private function prefixEnvToCommand($command, $env) + { + $prefix = ''; + foreach ($env as $key => $value) { + $prefix .= sprintf("%s=%s ", $key, escapeshellarg($value)); + } + return $prefix . $command; + } + /** * @param string $command * @param array $serverConfig @@ -203,6 +218,10 @@ private function createProcess($command, array $serverConfig) */ private function createLocalProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + return new Process($command, $serverConfig['base_dir']); } @@ -214,6 +233,10 @@ private function createLocalProcess($command, array $serverConfig) */ private function createRemoteProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + if ($serverConfig['base_dir']) { $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); } @@ -237,6 +260,10 @@ private function createRemoteProcess($command, array $serverConfig) */ private function createVagrantProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + if ($serverConfig['base_dir']) { $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); } @@ -261,6 +288,10 @@ private function createVagrantProcess($command, array $serverConfig) */ private function createDockerProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + if ($serverConfig['base_dir']) { $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); } From e8acf7cd6456ced63ace0cd0e1de814fc904b962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gero=20M=C3=BCller?= Date: Fri, 13 Jul 2018 15:57:12 +0200 Subject: [PATCH 3/3] symphony<3.3 compatibility --- lib/Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Extension.php b/lib/Extension.php index 878daa2..973be70 100644 --- a/lib/Extension.php +++ b/lib/Extension.php @@ -42,7 +42,7 @@ public function configure(ArrayNodeDefinition $builder) ->enumNode('type')->values(['local', 'remote', 'docker', 'vagrant'])->defaultValue('local')->end() ->scalarNode('base_dir')->defaultNull()->end() ->arrayNode('env') - ->scalarPrototype()->end() + ->prototype('scalar')->end() ->end() ->scalarNode('ssh_command')->defaultValue('ssh')->end() ->scalarNode('scp_command')->defaultValue('scp')->end()