[英]PHP Fatal error on CI/CD run php artisan test
我将docker-compose
与 laravel 和postgresql
一起使用,并且在本地系统中一切正常。 问题出在 CI/CD 中。
我一遍又一遍地更改了 CI/CD yml 文件,但我被卡住了!
name: CI/CD
on:
pull_request:
branches: ['master']
push:
branches: ['master']
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
- uses: actions/checkout@v2
- name: Run Containers
run: docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# - name: Run composer install
# run: cd companyname_app_dir && composer install
# - name: Run composer update
# run: cd companyname_app_dir&& composer update
# - name: Setup Project
# run: |
# cd companyname_app_dir
# composer update
# composer install
# php artisan config:clear
# php artisan cache:clear
- name: Run test
run: cd companyname_app_dir && php artisan test
env:
APP_KEY: base64:x06N/IsV5iJ+R6TKlr6sC6Mr4riGgl8Rg09XHHnRZQw=
APP_ENV: testing
DB_CONNECTION: companyname-postgres
DB_DATABASE: db_test
DB_USERNAME: root
DB_PASSWORD: 1234
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: secret
password: secret
- name: Build and push
uses: docker/build-push-action@v3
with:
push: true
file: ./companyname_app_dir/Dockerfile
tags: company_image:latest
build-args: |
"NODE_ENV=production"
有行注释,我尝试使用这些但无法成功运行测试。
version: '3'
networks:
companyname_network:
driver: bridge
services:
nginx:
image: nginx:stable-alpine
container_name: companyname-nginx
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
restart: always
depends_on:
- companyname_app
networks:
- companyname_network
companyname_app:
restart: 'always'
image: 'companyname_laravel'
container_name: companyname-app
build:
context: .
dockerfile: ./Dockerfile
networks:
- companyname_network
depends_on:
- companyname_db
companyname_db:
image: 'companyname_multiple_db'
container_name: companyname-postgres
build:
context: .
dockerfile: ./DockerfileDB
restart: 'always'
volumes:
- local_pgdata:/docker-entrypoint-initdb.d
environment:
- POSTGRES_MULTIPLE_DATABASES=db,db_test
- POSTGRES_USER=root
- POSTGRES_PASSWORD=1234
ports:
- 15432:5432
networks:
- companyname_network
companyname_dbadmin:
image: adminer
container_name: companyname-dbadmin
restart: 'always'
depends_on:
- companyname_db
ports:
- 5051:8080
networks:
- companyname_network
volumes:
local_pgdata:
version: '3'
services:
nginx:
ports:
- 9000:80
companyname_app:
build:
args:
- NODE_ENV=development
volumes:
- ./companyname_app_dir:/app
- /app/vendor
有了这个文件,我得到一个错误:
运行 cd companyname_app_dir && php 工匠测试
PHP 警告:要求(/home/runner/work/companyname_app/companyname_app /companyname_app_dir/vendor/autoload.php):无法打开 stream:/home/runner/work/companyname_app/companyname_app/companyname_app_dir/artisan 中没有这样的文件或目录18号线
PHP 致命错误:require():无法打开 /home/runner 中需要的 '/home/runner/work/companyname_app/companyname_app/companyname_app_dir/vendor/autoload.php' (include_path='.:/usr/share/php') /work/companyname_app/companyname_app/companyname_app_dir/artisan 第 18 行
错误:进程已完成,退出代码为 255。
如果我使用:
- name: Run composer install
run: cd companyname_app_dir && composer install
- name: Run composer update
run: cd companyname_app_dir && composer update
在 CI/CD yml 和 remove Run Containers
部分, composer install
和update
成功,但是php artisan test
抛出这个错误:
postgresql 连接不上
composer install
,否则您将根本没有vendor
文件夹,因此您无法运行任何东西。 这就是为什么如果你不运行composer install
你会得到一个错误composer update
,因为你正在将包更新到新版本,你永远不会在生产中这样做,你只需要运行composer install --no-dev
与第3.
点相关,如果你使用的是docker-compose
,则无法执行:
- name: Run test
run: cd companyname_app_dir && php artisan test
env:
APP_KEY: base64:x06N/IsV5iJ+R6TKlr6sC6Mr4riGgl8Rg09XHHnRZQw=
APP_ENV: testing
DB_CONNECTION: companyname-postgres
DB_DATABASE: db_test
DB_USERNAME: root
DB_PASSWORD: 1234
因为你在docker
之外,所以你应该执行docker-compose exec companyname_app php artisan test
,这将在 docker 容器内执行测试,在那里你正确地设置了所有内容。
所以你的代码(如果我没有遗漏任何东西)应该是:
- name: Run test
run: docker-compose exec companyname_app php artisan test
env:
APP_KEY: base64:x06N/IsV5iJ+R6TKlr6sC6Mr4riGgl8Rg09XHHnRZQw=
APP_ENV: testing
DB_CONNECTION: companyname-postgres
DB_DATABASE: db_test
DB_USERNAME: root
DB_PASSWORD: 1234
但我不确定你会从那个执行中得到什么,我不知道如果测试失败,如果 CI/CD(我假设你正在使用 GitHub 操作或 Bitbucket 管道),将真正确定它已经失败或不是。
我通常做的是在机器(CI/CD 机器)上安装所有东西,而不是使用 docker 文件或 docker-compose yaml。但这是我的偏好(至少对于 PHP/Laravel)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.