travis ci运行codeigniter需手动配置环境:ci 3.x用php:7.4,ci 4.x用php:8.1并设dist: focal;须显式配置phpunit.xml、设置apppath/basepath、生成临时database.php或使用.env,避免类加载失败与凭据泄露。

Travis CI 本身不关心你用什么框架,它只认 .travis.yml 配置和能跑通的命令。CodeIgniter 是 PHP 框架,只要环境配对、依赖装好、测试能执行,CI 就能走通——但默认不带 PHPUnit、不自动加载 application/ 路径、也不处理 index.php 入口路由,这些得手动补。
PHP 环境与 CodeIgniter 版本兼容性必须对齐
CodeIgniter 3.x 和 4.x 的 PHP 要求不同,travis-ci.org 已停用,现在必须用 travis-ci.com(支持 GitHub Apps 授权),且默认镜像已切换为 Ubuntu 20.04+,PHP 8.0+ 成为常态:
- CI 3.1.13 及更早版本只支持到 PHP 7.4,用
php:7.4,否则会报Deprecated: Array and string offset access syntax with curly braces is deprecated - CI 4.x(如 v4.4+)要求 PHP 7.4 或 8.0+,推荐显式写
php:8.1并加dist: focal避免旧镜像 - 别依赖
language: php的隐式行为——它可能拉取过时的 PHP 7.2,直接崩在composer install
PHPUnit 测试无法自动发现 application/tests 目录
CodeIgniter 3 默认没集成 PHPUnit 自动发现机制,phpunit 命令执行时找不到测试用例,报错 No tests executed! 或 Class 'CI_TestCase' not found:
- 必须在项目根目录放
phpunit.xml,显式声明bootstrap="vendor/autoload.php"和testsuite路径 - CI 3 需要先运行
./vendor/bin/phpunit --generate-configuration创建基础配置,再手动补上<testsuites><testsuite name="CI"><directory>application/tests</directory></testsuite></testsuites> - CI 4 使用
phpunit命令前需确保APPPATH和BASEPATH环境变量已设,可在before_script中加:export APPPATH=$(pwd)/app/ APP_ENV=testing
Composer 依赖安装后无法加载 CodeIgniter 核心类
composer install 成功不代表 CI_Controller 或 CI_Model 能被自动加载,常见报错是 Class 'CI_Controller' not found:
- CodeIgniter 3 不通过 Composer 自动加载核心类,必须靠
system/core/Loader.php的add_package_path()机制,而 Travis 默认工作目录不是public或index.php所在处 - 解决方法:在
before_script中复制一份最小index.php到临时目录,并确保$system_path = '../system';路径可访问 - 或者改用 CodeIgniter 4 的标准方式:把
public/index.php作为入口,在script阶段用curl -s http://localhost:8000/启服务测健康检查(需加services: [docker]或用php -S) - 别在
install阶段直接cp -r system/ application/—— Travis 构建机没有写权限到系统路径,会静默失败
敏感配置(如 database.php)不能硬编码进仓库
本地 application/config/database.php 若含真实 DB 凭据,推到 GitHub 就等于泄露密码。Travis 提供加密环境变量,但 CodeIgniter 不自动读取 $_ENV:
- 用
travis encrypt "DB_HOST=127.0.0.1" --add env.global加密后,变量名变成DB_HOST,但 CI 3 的 config 文件是 PHP 数组,没法直接插值 - 正确做法:在
before_script中生成临时 config:echo "<?php defined('BASEPATH') OR exit('No direct script access allowed'); \$db['default'] = array('hostname' => getenv('DB_HOST'), 'username' => getenv('DB_USER'), ...); ?>" > application/config/database.php - CI 4 更简单:直接在
.env里写database.default.hostname=${DB_HOST},然后cp .env.testing .env并用travis encrypt加密整个文件内容
.travis.yml”,而是 CodeIgniter 的加载机制和 Travis 的无状态容器环境之间存在隐式耦合——比如 APPPATH 路径解析失败、index.php 入口未触发 autoloader、或 phpunit 运行时当前工作目录不对。这些不会报明确错误,只会让测试全跳过或类找不到。











