1. 项目概述
PHP作为最流行的服务器端脚本语言之一,在Web开发领域占据重要地位。随着现代软件开发流程的演进,持续集成和持续交付(CI/CD)已成为提升开发效率的关键实践。本文将介绍一个最简单的PHP项目CI/CD实现方案,帮助开发者快速搭建自动化构建和部署流程。
这个方案特别适合中小型PHP项目,不需要复杂的配置就能实现代码提交后的自动测试和部署。我们将使用最常见的工具组合:GitHub Actions作为CI/CD平台,PHPUnit作为测试框架,以及简单的部署脚本。
2. 环境准备
2.1 基础工具安装
在开始之前,确保你的开发环境已经安装了以下工具:
- PHP 7.4或更高版本(推荐8.0+)
- Composer(PHP依赖管理工具)
- Git版本控制系统
对于本地测试环境,可以使用以下命令检查安装情况:
bash复制php -v
composer --version
git --version
2.2 初始化PHP项目
创建一个新的PHP项目目录并初始化Composer:
bash复制mkdir php-ci-cd-demo
cd php-ci-cd-demo
composer init
按照提示填写项目信息,这将生成基本的composer.json文件。
3. CI/CD流程设计
3.1 基本工作流程
我们的CI/CD流程将包含以下几个关键步骤:
- 代码提交到GitHub仓库
- 触发GitHub Actions工作流
- 安装PHP和项目依赖
- 运行PHPUnit测试
- 如果测试通过,自动部署到生产环境
3.2 GitHub Actions配置
在项目根目录创建.github/workflows/php-ci.yml文件:
yaml复制name: PHP CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.0'
extensions: mbstring, xml, curl, json
coverage: none
- name: Install dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Run tests
run: vendor/bin/phpunit
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.0'
- name: Install dependencies
run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader
- name: Deploy to production
run: |
echo "Deploying to production..."
# 这里添加你的部署脚本
rsync -avz --delete ./ user@production-server:/var/www/html/
4. 测试配置
4.1 安装PHPUnit
使用Composer安装PHPUnit测试框架:
bash复制composer require --dev phpunit/phpunit
4.2 创建测试示例
在项目根目录创建tests文件夹,并添加一个简单的测试用例ExampleTest.php:
php复制<?php
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
public function testTrueIsTrue()
{
$this->assertTrue(true);
}
}
4.3 配置phpunit.xml
创建phpunit.xml配置文件:
xml复制<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="Application Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
5. 部署策略
5.1 简单部署方案
对于小型项目,最简单的部署方式是使用rsync同步文件到生产服务器。确保生产服务器已配置SSH密钥认证,避免每次部署需要输入密码。
在.github/workflows/php-ci.yml的deploy作业中,可以这样配置:
yaml复制- name: Deploy to production
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
SERVER_IP: ${{ secrets.SERVER_IP }}
run: |
mkdir -p ~/.ssh
echo "$DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan $SERVER_IP >> ~/.ssh/known_hosts
rsync -avz --delete --exclude='.git' --exclude='.github' ./ user@$SERVER_IP:/var/www/html/
5.2 安全注意事项
- 永远不要在代码中硬编码凭据
- 使用GitHub Secrets存储敏感信息
- 限制部署密钥的权限
- 考虑使用部署专用用户而非root
6. 进阶优化
6.1 缓存优化
在GitHub Actions工作流中添加Composer缓存可以显著加快构建速度:
yaml复制- name: Cache Composer packages
uses: actions/cache@v2
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
6.2 多环境部署
对于更复杂的项目,可以配置多个部署环境(如staging和production):
yaml复制deploy-staging:
needs: build
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
# 部署到staging环境的步骤
deploy-production:
needs: [build, deploy-staging]
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
# 部署到production环境的步骤
6.3 静态代码分析
集成PHPStan或Psalm进行静态代码分析:
yaml复制- name: Run static analysis
run: composer run static-analysis
在composer.json中添加:
json复制"scripts": {
"static-analysis": "phpstan analyse"
}
7. 常见问题解决
7.1 测试失败
如果测试失败,工作流会自动停止。检查测试输出日志,通常包含详细的错误信息。常见问题包括:
- 测试环境与开发环境配置不一致
- 依赖版本冲突
- 测试数据问题
7.2 部署权限问题
确保部署密钥有正确的权限。在生产服务器上:
bash复制sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
7.3 构建时间过长
优化建议:
- 使用缓存(Composer、npm等)
- 并行化测试
- 移除不必要的构建步骤
- 考虑使用自托管runner
8. 监控与通知
8.1 工作流通知
在GitHub Actions工作流中添加通知步骤:
yaml复制- name: Notify Slack
if: always()
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_MESSAGE: "Deployment ${{ job.status }} for ${{ github.repository }}"
8.2 部署后检查
添加健康检查步骤确保部署成功:
yaml复制- name: Health check
run: |
curl -sSf https://your-production-site.com > /dev/null || exit 1
9. 安全最佳实践
- 定期轮换部署密钥
- 使用最小权限原则
- 审查第三方Actions的安全性
- 启用Dependabot自动更新依赖
- 配置代码扫描
10. 扩展思路
这个基础CI/CD流程可以根据项目需求进行扩展:
- 添加前端构建步骤(如Webpack)
- 集成数据库迁移
- 实现蓝绿部署或金丝雀发布
- 添加性能测试阶段
- 集成安全扫描工具
对于更复杂的PHP项目,可以考虑使用专业CI/CD工具如Jenkins或GitLab CI,但基本原理是相通的。
