使用EasyDeploy进行部署时找不到APP_SERVER env var

时间:2019-11-29 21:54:39

标签: php deployment environment-variables symfony4

当部署脚本尝试安装资产时,我出现此错误:

(安装PHP 7.2,Symfony 4.4)

[Symfony\Component\Process\Exception\ProcessFailedException]
The command "ssh -A root@vps.net -p 21 '(export APP_ENV=prod; cd /var/www-deploy/site.com/releases/20191129224025
&& php /var/www-deploy/site.com/releases/20191129224025/bin/console assets:install /var/www-deploy/site.com/releases/20191129224025/public --symlink --no-debug --env=prod)'" failed.
Exit Code: 1(General error)
Working directory: /Users/coil/Sites/site.com
Output:
================
Error Output:
================
In EnvVarProcessor.php line 162:
Environment variable not found: "APP_SERVER".

我已将.env文件放入共享文件中,因此在创建发行目录时将其复制,该文件位于目录中。

public function configure(): DefaultConfiguration
{
    return $this->getConfigBuilder()
        // ...
        ->sharedFilesAndDirs(['.env'])
        // ...
}

我还尝试将环境变量放入部署用户的.bashrc文件中

printenv | grep -i app
APP_DEBUG=0
APP_SECRET=whatever
APP_ENV=prod
APP_SERVER=prod

所以,我不明白为什么仍找不到环境变量。以及为什么不从.env文件中提取它们。 如果我中断了部署,并且在服务器上手动运行了相同的命令,则效果很好。谢谢。

[编辑2019-11-30] 我想我知道,运行命令时,会完成APP_ENV的导出。并且,如果应用程序检测到该env变量,它将跳过.env file。因此,我需要避免设置此env var,否则必须设置全部而不是仅设置这个。

1 个答案:

答案 0 :(得分:2)

它现在可以在src/Configuration/DefaultConfiguration.php中进行以下修改:

} elseif (4 === $symfonyMajorVersion || (3 === $symfonyMajorVersion && 4 >= $symfonyMinorVersion)) {
    $this->_symfonyEnvironmentEnvVarName = 'APP_ENV';

我已经将一个未知的env变量传递给Symfony:

$this->_symfonyEnvironmentEnvVarName = 'APP_FAKE_ENV';

因此.env文件不再被忽略。我认为根据应用程序的设置,缺少设置此环境变量的选项。我会尝试对捆绑包进行公关。

因此,由于尚未修改包,因此我修改了private属性,以使命令使用我的.env文件而不是环境变量:

/**
 * @see https://stackoverflow.com/q/1762135/633864
 */
private function forceEnvironmentEnvVarName(DefaultConfiguration $configuration): DefaultConfiguration
{
    $myClassReflection = new ReflectionClass(get_class($configuration));
    $symfonyEnvironmentEnvVarName = $myClassReflection->getProperty('_symfonyEnvironmentEnvVarName');
    $symfonyEnvironmentEnvVarName->setAccessible(true);
    $symfonyEnvironmentEnvVarName->setValue($configuration, 'FAKE_APP_ENV');
    $symfonyEnvironmentEnvVarName->setAccessible(false);

    return $configuration;
}