php项目在tekton中需拆解为含php环境镜像、显式挂载workspace、标准化workingdir、依赖预装与隔离测试的task;必须用kaniko构建镜像,通过git-clone task获取commit,secret须正确挂载且serviceaccount授权到位。

PHP项目直接跑在Tekton流水线里,不是“加个插件”就能搞定的事——它得按Kubernetes原生方式组织构建逻辑,核心是把PHP的依赖安装、测试、打包、镜像推送这些动作,拆成可复用、可验证、带权限控制的Task,而不是套用Jenkins那一套shell脚本思维。
怎么写一个能跑PHP单元测试的Task
别直接在script里写phpunit --config phpunit.xml就完事。Tekton容器默认没装PHP运行时,也没挂载代码,更没配置composer.json里的扩展依赖(比如ext-pdo_mysql)。
- 必须显式指定含PHP环境的镜像,例如
php:8.2-cli或composer:2.7(后者自带composer命令,适合先装依赖) -
workingDir要设为/workspace/source这类标准路径,和Workspace绑定一致 - 若测试需连接MySQL/Redis,不能硬编码
localhost——得通过Service名访问,且Task得声明sidecar或用PodTemplate启动临时服务(不推荐),更稳妥的是用testcontainers或跳过集成部分只跑unit - 示例关键段:
steps:
- name: run-phpunit
image: php:8.2-cli
workingDir: /workspace/source
script: |
#!/bin/sh
composer install --no-dev --prefer-dist
vendor/bin/phpunit --configuration phpunit.xml.dist --no-coverage
为什么PHP项目build镜像要用kaniko而不是docker build
Kubernetes集群节点默认禁用docker.sock挂载,docker build会直接失败,报错类似Cannot connect to the Docker daemon。Tekton官方推荐kaniko,因为它纯用户态执行,不需要Docker守护进程。
-
kaniko镜像需挂载Secret(如auth-docker)用于推镜像,否则push阶段卡住或401 - PHP项目Dockerfile通常基于
php:8.2-apache,但kaniko构建时要注意:COPY源码路径必须与Workspace中实际路径匹配(比如COPY . /var/www/html前得确认.是/workspace/source) - 避免在Dockerfile里运行
composer install——那会把vendor打进镜像层,导致缓存失效;应提前在Task里装好,再COPY --from=builder多阶段复制
如何让Tekton Pipeline识别PHP项目的git commit信息
PHP项目常需把git commit hash写进版本号或日志,但Task容器里默认没git命令,也拿不到.git目录。
- 必须用
git-cloneTask(来自Tekton Catalog)先拉代码,它会把.git完整克隆到Workspace,并注入params.commit等变量 - 后续
Task要读commit,得在script里执行git -C /workspace/source rev-parse HEAD,而非依赖环境变量(那些变量只在git-clone自己的step里有效) - 若Pipeline里多个Task都要用commit,建议用
Pipeline级params传入,避免每个Task重复执行git命令
PHP应用部署到K8s时Secret挂载容易漏哪几项
Tekton本身不负责部署,但Pipeline最后一步通常是kubectl apply -f deployment.yaml。这时PHP容器启动失败,90%出在Secret没对上。
-
APP_KEY、DATABASE_URL这类Laravel/Lumen必需环境变量,必须用Secret挂载,不能写死在Deployment YAML里 - 挂载路径要和PHP代码读取位置一致:比如
envFrom: [{secretRef: {name: php-app-secret}}]后,PHP里用getenv('APP_KEY')才有效;若用volumes+volumeMounts挂成文件,则得用file_get_contents('/etc/secrets/app-key') - 别忘了
ServiceAccount权限:执行kubectl apply的Task容器,其serviceAccountName必须有deployments patch和secrets get权限,否则报错Forbidden: User "system:serviceaccount:default:tekton-bot" cannot patch resource "deployments"
最常被跳过的其实是PHP错误日志落盘问题:容器里error_log = /var/log/php/error.log,但没挂EmptyDir或PVC,结果日志全丢,出问题时连warning都看不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











