Переменные окружения не устанавливаются при запуске apache2 в Travis-CI

Я пытаюсь настроить интеграционные тесты проекта php на Travis-CI. Интеграционные тесты используют Behat в качестве ориентированной на поведение среды.

Я устанавливаю информацию о соединении с базой данных как переменные среды в настройках репозитория на Travi-CI и вижу их экспортированными во время выполнения:

Setting environment variables from repository settings
$ export DB_USERNAME=travis
$ export DB_PASSWORD=[secure]
$ export DB_HOSTNAME=127.0.0.1
$ export DB_PORT=3306
$ export DB_NAME=oraproject_test

но я не могу получить эти значения с помощью getenv() в мой PHP-код, потому что они не определены в Apache.

Я попытался добавить PassEnv в определение VirtualHost, но я получаю это предупреждение при запуске apache:

[warn] PassEnv variable DB_HOSTNAME was undefined
[warn] PassEnv variable DB_PORT was undefined
[warn] PassEnv variable DB_NAME was undefined
[warn] PassEnv variable DB_USERNAME was undefined
[warn] PassEnv variable DB_PASSWORD was undefined

Я настроил Apache + PHP, как предложено в документации Travis-CI (http://docs.travis-ci.com/user/languages/php/#Apache-%2B-PHP) а это мой travis.yml

language: php

php:
- 5.5
- 5.4

env:
- APPLICATION_ENV=acceptance

addons:
hosts:
- ora.local

install:
- composer self-update

before_script:
- sudo apt-get install apache2 libapache2-mod-fastcgi
# enable php-fpm
- sudo cp ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf.default ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf
- sudo a2enmod rewrite actions fastcgi alias
- echo "cgi.fix_pathinfo = 1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
- ~/.phpenv/versions/$(phpenv version-name)/sbin/php-fpm
- sudo cp -f build/travis-ci-apache /etc/apache2/sites-available/default
- sudo sed -e "s?%TRAVIS_BUILD_DIR%?$(pwd)?g" --in-place /etc/apache2/sites-available/default
- sudo service apache2 restart
# Set the GitHub OAuth token to make use of the 5000 per hour rate limit
- "mkdir -p ~/.composer"- cp .travis.composer.config.json ~/.composer/config.json
- composer install -d src --dev
- mysql -e 'create database oraproject_test;'
- src/vendor/bin/doctrine-module orm:schema-tool:create
- mysql ${DB_NAME} < tests/sql/init.sql

script:

- phpunit --configuration tests/phpunit.xml
- cd tests
- ../src/vendor/bin/behat

Как я могу сказать Apache «прочитать» переменные окружения и сделать их доступными для приложения php?

большое спасибо

2

Решение

Вы можете загрузить их, используя эту библиотеку:

Попробуйте использовать phpdotenv (https://github.com/vlucas/phpdotenv).

1

Другие решения

Благодаря поддержке Travi-CI у меня все заработало.

Проблема в том, что sudo service apache2 restart использует другой env, чем скрипт, который его запускает.

Чтобы передать переменные окружения в Apache, нужно определить директиву SetEnv для каждой из них в определении virtulhost.
Чтобы не помещать секретные значения переменных среды в файл определения виртуального хоста, вместо назначения реального значения мы можем использовать заполнители, подобные этим:

SetEnv APPLICATION_ENV    ${APPLICATION_ENV}
SetEnv DB_HOSTNAME        ${DB_HOSTNAME}
SetEnv DB_PORT            ${DB_PORT}
SetEnv DB_USERNAME        ${DB_USERNAME}
SetEnv DB_PASSWORD        ${DB_PASSWORD}
SetEnv DB_NAME            ${DB_NAME}

и замените их во время выполнения на реальные значения с помощью команды оболочки sed перед запуском Apache

- sudo sed -e 's/${APPLICATION_ENV}/'"$APPLICATION_ENV"'/g' --in-place /etc/apache2/sites-available/default
- sudo sed -e 's/${DB_HOSTNAME}/'"$DB_HOSTNAME"'/g' --in-place /etc/apache2/sites-available/default
- sudo sed -e 's/${DB_PORT}/'"$DB_PORT"'/g' --in-place /etc/apache2/sites-available/default
- sudo sed -e 's/${DB_USERNAME}/'"$DB_USERNAME"'/g' --in-place /etc/apache2/sites-available/default
- sudo sed -e 's/${DB_PASSWORD}/'"$DB_PASSWORD"'/g' --in-place /etc/apache2/sites-available/default

— sudo sed -e ‘s / $ {DB_NAME} /’ «$ DB_NAME» ‘/ g’ — in-place / etc / apache2 / sites-available / default

1

По вопросам рекламы [email protected]