gitlab ci/cd 配置文件必须命名为 .gitlab-ci.yml 且置于仓库根目录,禁用可执行权限;yaml 须用空格缩进,顶层关键字前无空格;php 项目需注意镜像扩展、composer 权限与版本匹配;runner 报错应查日志末尾;生产部署须禁用 cache/artifacts/自动触发,并保护敏感变量。

GitLab CI/CD 配置文件必须叫 .gitlab-ci.yml
GitLab 不会识别 gitlab-ci.yml、.gitlab-ci.yaml 或其他变体。名字错一个字符,流水线就完全不触发。文件必须放在仓库根目录,且权限不能是可执行(chmod +x 会导致某些 Runner 拒绝加载)。
常见错误现象:pipeline not found 或 Web UI 中“CI/CD is disabled”——实际是配置文件未被识别。
- 用
git ls-files | grep -i gitlab确认文件名拼写和大小写 - 提交后在 GitLab 项目页 > CI/CD > Editor 查看是否自动解析出流水线阶段
- YAML 缩进必须用空格,禁止 Tab;顶层关键字如
stages、job_name前不能有空格
PHP 项目常用 job:install、test、deploy 的最小可行写法
不用一上来就写复杂缓存或并行,先让流程跑通。PHP 项目最常卡在 composer install 权限、扩展缺失、或 phpunit 版本不匹配。
示例(适用于 PHP 8.1+、Composer 2.x):
stages: - test - deploy <p>unit-test: stage: test image: php:8.1-cli before_script:</p>
- apt-get update && apt-get install -y unzip git
- curl -sS https://www.php.cn/link/e910517884e11c8a741c3b1da823f47e | php -- --install-dir=/usr/local/bin --filename=composer script:
- composer install --no-interaction --prefer-dist
- vendor/bin/phpunit --version
- vendor/bin/phpunit
deploy-to-staging: stage: deploy image: alpine:latest before_script:
- apk add --no-cache rsync openssh script:
- rsync -avz --delete ./ user@staging.example.com:/var/www/myapp/ only:
- main
-
image: php:8.1-cli是关键——基础镜像没装ext-pdo或ext-curl?后续composer install会报 extension missing,而不是直接失败 -
--no-interaction必须加,否则 Composer 卡住等待输入 - 部署用
alpine而非php镜像:减小体积、避免 PHP 环境污染目标服务器
-
Runner 报错 ERROR: Job failed: command terminated with exit code 1 怎么快速定位
这个错误本身没信息量,90% 是脚本某步返回非零退出码。别急着重试,先看日志折叠区最底部的几行输出——不是顶部,是真正最后执行的那条命令的结果。
- 在
script中每步后加|| echo "FAIL at $(basename $0):$LINENO"(仅调试用) - 把
composer install拆成两步:composer diagnose(检查源、权限、网络)→ 再install - 如果报
Could not find package ...,大概率是composer.json里用了私有包但没配auth.json;需在 GitLab Settings > CI/CD > Variables 添加COMPOSER_AUTH变量,值为 JSON 字符串(注意转义双引号) - Runner 使用 shared runner 时,
cache:默认只缓存vendor/,但如果你用了composer install --global,全局 bin 不在缓存路径里,每次都要重装
部署到生产环境前必须关掉的三个默认行为
本地测试通过 ≠ 生产安全。GitLab CI 默认行为在生产场景下有隐患。
-
cache:不要跨分支共享 —— 在deploy-to-prodjob 中显式禁用:cache: {}或删掉该字段,否则可能把 dev 分支的未测代码缓存带入 prod 构建 -
artifacts:别自动上传整个vendor/—— 它体积大、含敏感路径,且 PHP 部署通常不需要传二进制产物;如真要传,限定为dist/或打包后的release.tar.gz - 不要用
only: [main]控制生产部署 —— 改用rules:+ 受保护分支 + 手动触发:when: manual,否则 push 一次修复就自动上线,没有人工确认环节
最易被忽略的是:GitLab 的 variables 作用域默认对所有 job 可见,包括公开 fork 的 CI 流水线。涉及数据库密码、API 密钥的变量,务必勾选 Protected 并绑定到 protected branch,否则泄露风险极高。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











