引言:从基础CI/CD到生产级别
仅仅运行测试的基础CI/CD流水线固然不错。但对于严肃的PHP项目来说,这还不够。在实际开发中,需要依赖缓存以加速构建、并行任务、针对不同PHP版本的矩阵构建、静态分析,当然还有自动部署。在本文中,我们将通过实际示例,深入探讨为PHP项目配置GitHub Actions的高级技巧。
我们假设您已经熟悉YAML语法基础和.github/workflows的基本结构。现在,让我们进入优化和功能扩展阶段。
1. 加速构建:Composer缓存与最优策略
每次运行工作流都会重新下载依赖项。这需要1-3分钟,而通过缓存可以缩短到5-10秒。
智能缓存vendor目录
使用actions/cache,键值基于composer.lock文件的哈希值。如果锁定文件未更改,则从缓存恢复依赖项。
name: PHP CIon: [push, pull_request]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' tools: composer:v2
- name: Cache Composer dependencies uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php-
- name: Install dependencies run: composer install --no-progress --prefer-dist请注意restore-keys:如果未找到精确的键,将使用该操作系统的最新缓存。这在切换分支时提供了保障。
针对不同PHP版本的矩阵构建
为确保兼容性,请并行测试多个PHP版本:
jobs: test: strategy: matrix: php-version: ['8.1', '8.2', '8.3'] dependency-stability: [prefer-lowest, prefer-stable]
steps: - uses: actions/checkout@v4 - name: Setup PHP ${{ matrix.php-version }} uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-version }}
- name: Cache uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
- name: Install dependencies run: | composer update --${{ matrix.dependency-stability }} --prefer-dist --no-interaction
- name: Run tests run: vendor/bin/phpunit这种方法能在合并到主分支之前就发现兼容性问题。您将获得6个并行任务(3个版本 × 2种稳定性策略)。
2. 高级阶段:静态分析与代码质量
单元测试并非唯一的质量控制工具。我们加入PHPStan(最高分析级别)和PHP Code Sniffer。
代码检查与静态分析
创建一个独立的分析任务,与测试并行执行:
jobs: static-analysis: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.2' coverage: none
- name: Cache uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php-static-${{ hashFiles('**/composer.lock') }}
- run: composer install --no-interaction --prefer-dist
- name: PHPStan run: vendor/bin/phpstan analyse --level=max src/
- name: PHPCS run: vendor/bin/phpcs --standard=PSR12 src/