我在我的 laravel 项目中采用了 bitbucket 的 CI/CD 管道。 Laravel 版本 8*.
根据bitbucket文档和社区示例,我在repo中添加了一个.env.pipeline文件。这是 yml 文件中的片段:
pipelines:
branches:
develop:
- step:
name: Build and push the image
caches:
- composer
script:
- apk update && apk add mysql-client
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- composer install --no-progress --prefer-dist --optimize-autoloader
- cp .env.pipeline .env
- php artisan key:generate
- php artisan config:clear
- php artisan migrate
- ./vendor/bin/phpunit
services:
- mysql
该存储库还有一个
.env.testing
文件以及一个 phpunit.xml
文件。这是 phpunit.xml 文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
>
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">./app</directory>
</include>
<report>
<clover outputFile="build/logs/clover.xml"/>
<html outputDirectory="build/coverage"/>
</report>
</coverage>
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">./app</directory>
</include>
</coverage>
<php>
<env name="APP_ENV" value="testing"/>
<env name="APP_URL" value="http://localhost"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="DB_DATABASE" value="testing"/>
<env name="MAIL_MAILER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>
单元测试在本地运行并通过。但在管道中,该过程失败,抱怨 mysql 主机无法解决。经过故障排除后,我发现
DB_HOST
值的值不是 .env.pipeline 文件中设置的值,而是从 .env.testing 文件中获取的值。这就是为什么管道进程无法解析mysql主机的原因。
我不明白的是,对于管道中的单元测试,如果在还存在
.env.pipeline
文件时不会使用该文件,那么拥有 .env.testing
文件有什么意义。
我该如何处理这种情况?