Развертывание приложения Symfony2 для AWAS Elastic Beanstalk - Очистка кэша развертывания после развертывания - программирование

Развертывание приложения Symfony2 для AWAS Elastic Beanstalk - Очистка кэша развертывания после развертывания

При развертывании приложения Symfony2 на Elastic Beanstalk мне нужно очистить ручной кеш, чтобы приложение начало работать. Итак, я добавил команду контейнера для очистки кэша prod во время развертывания. Команда запускается, но мне все равно пришлось вручную очистить, чтобы приложение работало.

После некоторого копания я обнаружил, что в файлах самого Symfony2 есть абсолютные строки пути. Добавленная мной команда запускает "предварительное развертывание" или до того, как файлы приложений будут перемещены из их промежуточной папки (называемой "/var/app/ondeck" ) в их конечное место отдыха ( "/var/app/current" ). В результате абсолютные строки пути в файлах кеша ошибочны, и приложение не загружается.

Кроме того, среда dev отлично работает сразу, потому что она автоматически восстанавливает свой собственный кеш. Единственное, на что это повлияло, - это среда prod.

Мой вопрос (ы):

  • Есть ли способ запустить команду очистки кэша автоматически ПОСЛЕ того, как код был перемещен на место?
  • Альтернативно, есть ли способ заставить Symfony2 указать другой "базовый путь" для генерации кэша? Таким образом, он может быть настроен так, чтобы указывать на правильное конечное местоположение.

Спасибо всем заранее: -)

4b9b3361

Ответ 1

Проблема возникает из-за того, что кеш заполняется в среде ondeck, когда различные команды Symfony запускаются в конце процесса установки композитора и/или ваши собственные команды (например, assetic: dump).

Решение состоит в том, чтобы очистить кеш в качестве последней команды развертывания и указать --no-warmup, чтобы остановить Symfony, автоматически заправляя его, так что кеш пуст, когда среда перемещается из ondeck в текущий. В моем .ebextensions/symfony.config у меня есть:

container_commands:
  01_migrate:
    command: php app/console doctrine:migrations:migrate --env=prod --no-debug --no-interaction
    leader_only: true
  02_dumpassets:
    command: php app/console assetic:dump --env=prod --no-debug
  99_clearcache:
    command: php app/console cache:clear --env=prod --no-debug --no-warmup

Это не очень хорошо документировано, но вы также можете использовать крюк после развертывания для нагрева кеша после того, как среда была перенесена в текущий. Также в .ebextensions/symfony.config:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/support/envvars
      cd $EB_CONFIG_APP_CURRENT
      php app/console cache:warmup --env=prod --no-debug      

Ответ 2

Эта проблема исправлена ​​в последних дистрибутивах Symfony 2.3.23, 2.5.8, 2.6.1 и предстоящие версии (2.7., 3.,...)

См. https://github.com/heroku/heroku-buildpack-php/issues/64

Symfony теперь будет использовать ссылки по сравнению с FILE в контейнере, поэтому вам больше не нужно использовать хакерство post deploy. Обратите внимание, что вам все равно нужно устанавливать активы как жесткие ссылки.

Ответ 3

Я потратил немного времени, пытаясь заставить вещи работать многоразовым способом, вот файл ebextensions, который мы завершили.

files:
  "/tmp/parameters.yml":
    mode: "000444"
    content: |
      parameters:
        database_driver: pdo_mysql
        database_host: '...'
        database_port: null
        database_name: ...
        database_user: ...
        database_password: ...
        mailer_transport: smtp
        mailer_host: 127.0.0.1
        mailer_user: null
        mailer_password: null
        locale: en
        secret: ...

option_settings:
  - namespace: aws:elasticbeanstalk:hostmanager
    option_name: LogPublicationControl
    value: true
  - namespace: aws:elasticbeanstalk:container:php:phpini
    option_name: document_root
    value: /web
  - namespace: aws:autoscaling:launchconfiguration # This is for permission to the RDS instance
    option_name: SecurityGroups
    value: ...

container_commands:
  01-params:
    command: cp /tmp/parameters.yml app/config/parameters.yml
  02-params:
    command: chown webapp:webapp app/config/parameters.yml
  03-bootsrap:
    command: php vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php
  04-bootsrap:
    command: chown webapp:webapp app/bootstrap.php.cache
  05-cache:
    command: php app/console cache:clear --env=prod --no-debug --no-warmup
  06-cache:
    command: chmod -R 0777 app/cache
  07-logs:
    command: chmod -R 0777 app/logs
  08-cache:
    command: chown -R webapp:webapp app/cache
  09-logs:
    command: chown -R webapp:webapp app/logs

Ответ 4

У меня была та же проблема, и я нашел решение на этой странице

и мой последний код - я использую Symfony Framework (v2.8):

commands:
  01_create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/initial_cron_job.sh":
  mode: "000755"
  owner: root
  group: root
  content: |
    #!/usr/bin/env bash
    # This line was very important for me as I needed to get EnvVars
    . /opt/elasticbeanstalk/support/envvars
    rm -rf /var/app/current/app/cache/* /var/app/current/app/logs/*
    chmod -R 777 /var/app/current/app/cache
    chmod -R 777 /var/app/current/app/logs
    su -c "command_name" $EB_CONFIG_APP_USER

Слово объяснения:

  • Мне не нужно разогревать кеш, поэтому я делаю rm -rf в папках кеша и журналов
  • Я изменяю права доступа к папкам кэшей и журналов на 100%, чтобы их можно было записывать в $EB_CONFIG_APP_USER - в этом случае webapp пользователь

Ответ 5

Пробовал переопределить getCacheDir?

в app/AppKernel.php:

public function getCacheDir()
{
    return "/path/to/the/cache";
}

Ответ 6

На основании ответов @rhunwicks здесь my .ebextensions/symfony.config:

commands:
  01updateComposer:
    command: export COMPOSER_HOME=/root && /usr/bin/composer.phar self-update

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/support/envvars
      cd $EB_CONFIG_APP_CURRENT
      php app/console cache:clear --env=prod
      php app/console assetic:dump --env=prod

Убедитесь, что в вашем композиторе нет "symfony-assets-install": "symlink", чтобы не тратить часы, пытаясь понять, почему символические ссылки указывают на /var/app/ondeck/src/BundleName/MyBundle/Resources/public вместо папки current.