CI/CD para projetos PHP: GitHub Actions nível avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: do CI/CD básico ao nível de produção



Um pipeline básico de CI/CD que apenas executa testes é bom. Mas para um projeto PHP sério, isso não é suficiente. No desenvolvimento real, são necessários cache de dependências para acelerar as builds, tarefas paralelas, builds matriciais para diferentes versões do PHP, análise estática e, claro, deploy automático. Neste artigo, abordaremos técnicas avançadas de configuração do GitHub Actions para projetos PHP com exemplos práticos.



Presumimos que você já está familiarizado com o básico da sintaxe YAML e a estrutura fundamental de .github/workflows. Agora, vamos para a otimização e expansão de recursos.



1. Acelerando builds: cache do Composer e estratégia otimizada



Cada execução do workflow baixa as dependências novamente. Isso leva de 1 a 3 minutos, que podem ser reduzidos para 5 a 10 segundos com o uso de cache.



Cache inteligente da vendor



Usamos actions/cache com uma chave baseada no hash do composer.lock. Se o arquivo de bloqueio não mudou, as dependências serão restauradas do cache.



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


Observe o restore-keys: se a chave exata não for encontrada, o último cache para este SO será usado. Isso protege ao trocar de branches.



Build matricial para diferentes versões do PHP



Para garantir compatibilidade, teste em várias versões do PHP em paralelo:



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


Esta abordagem revela problemas de compatibilidade antes mesmo do merge na branch principal. Você terá 6 jobs paralelos (3 versões × 2 estratégias de estabilidade).



2. Etapas avançadas: análise estática e qualidade de código



Testes unitários não são a única ferramenta de controle de qualidade. Vamos adicionar PHPStan (nível máximo de análise) e PHP Code Sniffer.



Linting e análise estática



Crie um job separado para análise, que é executado em paralelo com os testes:



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/

Blogs

Book Recommendations