我正在尝试在Travis-CI上设置php项目的集成测试。集成测试使用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应用程序?
非常感谢
答案 0 :(得分:1)
您可以使用此lib加载它们:
尝试使用phpdotenv(https://github.com/vlucas/phpdotenv)。
答案 1 :(得分:1)
感谢Travi-CI支持,我把事情搞定了。
问题是sudo service apache2 restart
使用与运行它的脚本不同的环境。
将环境变量传递给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}
并在启动Apache
之前使用shell命令sed
将实时值替换为实际值
- 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&#39; s / $ {DB_NAME} /&#39;&#34; $ DB_NAME&#34;&#39; / g&#39; --in-place / etc / apache2 / sites-available / default