如何使用GitHub Actions为Laravel项目配置CI/CD? (自动化测试与部署)
发布时间 - 2026-01-14 00:00:00 点击率:次Laravel项目在GitHub Actions中常卡在composer install,因Ubuntu runner的PHP版本或扩展不匹配;需用actions/setup-php指定版本和扩展,跳过平台检查,配置MySQL/Redis服务并正确设置host,部署用ssh+rsync配合Secrets,phpunit失败多因autoload未生效。
为什么 Laravel 项目在 GitHub Actions 中常卡在 composer install?
因为默认 Ubuntu runner 的 PHP 版本往往不匹配 composer.json 中的 platform.php 声明,或缺少扩展(如 ext-pdo_mysql、ext-redis)。Laravel 测试还依赖 phpunit 和正确配置的 .env。
- 显式指定 PHP 版本:用
actions/setup-php@v4,并传入php-version和extensions - 跳过平台检查(仅限 CI):
composer install --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-req=ext-* - 用
echo写入测试专用.env,确保DB_CONNECTION=sqlite或配好 MySQL 服务
如何在 GitHub Actions 中启动 MySQL 和 Redis 服务?
GitHub Actions 支持 services,但 Laravel 默认用 localhost 连接,而 services 实际运行在 Docker 网络中,需用 service 名作 host。MySQL 默认 root 密码为空,Redis 无需密码。
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: ""
MYSQL_DATABASE: testdb
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping -h localhost -u root --password=''"
--health-interval=10s
--health-timeout=5s
--health-retrie
s=3
redis:
image: redis:7-alpine
ports:
- 6379:6379- MySQL host 应设为
mysql(service 名),不是localhost - 在
.env.testing中写DB_HOST=mysql、REDIS_HOST=redis - 用
wait-for-it.sh或自定义脚本轮询mysql:3306就绪,避免phpunit启动时连接失败
如何安全地部署到生产服务器(SSH + rsync)?
GitHub Actions 本身不执行远程部署命令,需靠 ssh + rsync 组合完成。私钥不能硬编码,必须存为 Secrets(如 DEPLOY_SSH_KEY),且目标服务器需提前配置好 SSH 免密登录与目录权限。
- 用
webfactory/ssh-key-action@v2注入私钥到 runner 的~/.ssh/id_rsa - 部署前先
rsync -avz --delete . user@host:/var/www/myapp/ --exclude=".git" --exclude="node_modules" - 关键命令必须分步执行:拉代码 → 安装依赖 → 运行
php artisan migrate:fresh --seed(仅限测试环境)→php artisan config:clear && php artisan cache:clear - 生产环境禁止自动执行
migrate,应人工确认或走 DB 变更审批流程
phpunit 在 Actions 中报 Class 'Tests\TestCase' not found 怎么办?
这是自动加载未生效的典型表现,根源通常是 composer autoload 没跑,或 phpunit.xml 的 bootstrap 路径错误。Laravel 10+ 默认用 ./vendor/autoload.php,但 CI 中可能因路径或缓存失效导致失败。
- 确保
composer install成功后,再运行vendor/bin/phpunit - 检查
phpunit.xml中是否存在,它能暴露隐藏的致命错误 - 加一步验证:
php -r "require 'vendor/autoload.php'; echo class_exists('Tests\TestCase') ? 'OK' : 'FAIL';" - 若用 Pest,确认
pest二进制已安装(composer require --dev pestphp/pest --with-all-dependencies)
环境变量、服务依赖顺序、PHP 扩展缺失——这些不是配置项,是每次 push 都会触发的硬性校验点。漏掉任意一个,CI 就会静默失败或测试假通过。
# mysql
# php
# word
# laravel
# redis
# js
# bootstrap
# git
# json
# node
# composer
# echo
# for
# require
# xml
# class
# var
# delete
# github
# docker
# sqlite
# ubuntu
# ssh
# 自动化
# 仅限
# 跳过
# 卡在
# 需用
# 不匹配
# 这是
# 就会
# 设为
# 自定义
# 它能
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
Laravel Session怎么存储_Laravel Session驱动配置详解
黑客如何通过漏洞一步步攻陷网站服务器?
JS去除重复并统计数量的实现方法
高防服务器租用指南:配置选择与快速部署攻略
浅谈javascript alert和confirm的美化
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
电商网站制作价格怎么算,网上拍卖流程以及规则?
JavaScript常见的五种数组去重的方式
长沙做网站要多少钱,长沙国安网络怎么样?
*服务器网站为何频现安全漏洞?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
教你用AI将一段旋律扩展成一首完整的曲子
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
node.js报错:Cannot find module 'ejs'的解决办法
使用C语言编写圣诞表白程序
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel如何记录自定义日志?(Log频道配置)
如何续费美橙建站之星域名及服务?
Laravel观察者模式如何使用_Laravel Model Observer配置
如何在橙子建站中快速调整背景颜色?
简单实现Android文件上传
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
如何在Windows环境下新建FTP站点并设置权限?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
javascript日期怎么处理_如何格式化输出
三星、SK海力士获美批准:可向中国出口芯片制造设备
如何挑选优质建站一级代理提升网站排名?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何用IIS7快速搭建并优化网站站点?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
如何快速搭建高效可靠的建站解决方案?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel PHP版本要求一览_Laravel各版本环境要求对照
如何用wdcp快速搭建高效网站?
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层


