@@ -2,88 +2,170 @@ name: CI
22
33on :
44 push :
5- branches : [ main, 'legacy/v2.x', 'feature/**' ]
5+ branches :
6+ - ' main'
7+ - ' legacy/*' # Legacy branches: legacy/v2.x
8+ - ' feature/*' # Feature branches: feature/new-feature
9+ - ' hotfix/*' # Hotfix branches: hotfix/urgent-fix
10+ - ' release/*' # Release branches: release/v3.0.0
611 pull_request :
7- branches : [ main, 'legacy/v2.x' ]
8- workflow_dispatch :
9- inputs :
10- php_version :
11- description : ' PHP version to test (optional, tests all if empty)'
12- required : false
13- default : ' '
14- dependencies :
15- description : ' Dependencies type'
16- required : false
17- default : ' stable'
18- type : choice
19- options :
20- - stable
21- - lowest
22- - dev
12+ branches :
13+ - ' main'
14+ - ' legacy/*' # PRs to legacy branches
15+ workflow_dispatch : # Allows manual triggering via GitHub UI
2316
2417jobs :
25- tests :
18+ test :
2619 runs-on : ubuntu-latest
27-
20+
2821 strategy :
2922 fail-fast : false
3023 matrix :
31- php-version : ['7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
32- dependencies : ['stable']
3324 include :
34- # Test with lowest dependencies
35- - php-version : ' 7.3'
36- dependencies : ' lowest'
37- - php-version : ' 8.4'
38- dependencies : ' lowest'
39- # Test with development dependencies
40- - php-version : ' 8.4'
41- dependencies : ' dev'
42- # Test with PHP 8.5 nightly (allow failure)
43- - php-version : ' 8.5'
44- dependencies : ' stable'
45-
46- continue-on-error : ${{ matrix.dependencies == 'dev' || matrix.php-version == '8.5' }}
47-
48- name : PHP ${{ matrix.php-version }} - ${{ matrix.dependencies }}
25+ # Core PHP version testing
26+ - php : ' 8.1'
27+ allowed-to-fail : false
28+ - php : ' 8.2'
29+ allowed-to-fail : false
30+ - php : ' 8.3'
31+ allowed-to-fail : false
32+ - php : ' 8.4'
33+ allowed-to-fail : false
34+
35+ # Future-ready: PHP 8.5 (alpha/dev) - when available
36+ - php : ' 8.5'
37+ stability : ' dev'
38+ allowed-to-fail : true
39+
40+ # Development stability tests
41+ - php : ' 8.4'
42+ stability : ' dev'
43+ allowed-to-fail : true
44+ - php : ' 8.5'
45+ stability : ' dev'
46+ allowed-to-fail : true
47+
48+ name : " PHP ${{ matrix.php }}${{ matrix.stability && format(' | {0}', matrix.stability) || '' }}"
49+
50+ continue-on-error : ${{ matrix.allowed-to-fail }}
51+
52+ steps :
53+ - name : Checkout code
54+ uses : actions/checkout@v4
55+
56+ - name : Setup PHP
57+ uses : shivammathur/setup-php@v2
58+ with :
59+ php-version : ${{ matrix.php }}
60+ extensions : json, mbstring, tokenizer
61+ coverage : xdebug
62+ tools : composer:v2
63+
64+ - name : Get composer cache directory
65+ id : composer-cache
66+ run : echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
67+
68+ - name : Cache composer dependencies
69+ uses : actions/cache@v4
70+ with :
71+ path : ${{ steps.composer-cache.outputs.dir }}
72+ key : ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
73+ restore-keys : ${{ runner.os }}-composer-
74+
75+ - name : Configure stability
76+ if : matrix.stability
77+ run : |
78+ composer config minimum-stability ${{ matrix.stability }}
79+ composer config prefer-stable true
80+
81+ - name : Remove composer.lock
82+ run : rm -f composer.lock
83+
84+ - name : Install dependencies
85+ run : composer update --prefer-dist --no-interaction --no-progress
86+
87+ - name : Validate composer.json and composer.lock
88+ run : composer validate --strict
89+
90+ - name : Run code style check
91+ run : composer cs
92+
93+ - name : Run static analysis
94+ run : composer analyse
95+
96+ - name : Run tests
97+ run : composer test
98+
99+ code-quality :
100+ runs-on : ubuntu-latest
101+ name : Code Quality Checks
49102
50103 steps :
51- - name : Checkout code
52- uses : actions/checkout@v4
53-
54- - name : Setup PHP
55- uses : shivammathur/setup-php@v2
56- with :
57- php-version : ${{ matrix.php-version }}
58- extensions : dom, curl, libxml, mbstring, zip, json
59- coverage : none
60- tools : composer:v2
61-
62- - name : Cache Composer packages
63- id : composer-cache
64- uses : actions/cache@v4
65- with :
66- path : ~/.composer/cache
67- key : ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-${{ hashFiles('**/composer.lock') }}
68- restore-keys : |
69- ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-
70-
71- - name : Install dependencies (lowest)
72- if : matrix.dependencies == 'lowest'
73- run : composer update --prefer-lowest --prefer-stable --prefer-dist --no-interaction
74-
75- - name : Install dependencies (stable)
76- if : matrix.dependencies == 'stable'
77- run : composer update --prefer-stable --prefer-dist --no-interaction
78-
79- - name : Install dependencies (dev)
80- if : matrix.dependencies == 'dev'
81- run : |
82- composer config minimum-stability dev
83- composer update --prefer-dist --no-interaction
84-
85- - name : Validate composer.json
86- run : composer validate --strict --no-check-lock
87-
88- - name : Run PHPUnit tests
89- run : vendor/bin/phpunit
104+ - name : Checkout code
105+ uses : actions/checkout@v4
106+
107+ - name : Setup PHP
108+ uses : shivammathur/setup-php@v2
109+ with :
110+ php-version : ' 8.4'
111+ extensions : json, mbstring, tokenizer
112+ coverage : none
113+ tools : composer:v2
114+
115+ - name : Get composer cache directory
116+ id : composer-cache
117+ run : echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
118+
119+ - name : Cache composer dependencies
120+ uses : actions/cache@v4
121+ with :
122+ path : ${{ steps.composer-cache.outputs.dir }}
123+ key : ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
124+ restore-keys : ${{ runner.os }}-composer-
125+
126+ - name : Install dependencies
127+ run : composer install --prefer-dist --no-interaction --no-progress
128+
129+ - name : Validate composer.json and composer.lock
130+ run : composer validate --strict
131+
132+ coverage :
133+ runs-on : ubuntu-latest
134+ name : Code Coverage
135+
136+ steps :
137+ - name : Checkout code
138+ uses : actions/checkout@v4
139+
140+ - name : Setup PHP
141+ uses : shivammathur/setup-php@v2
142+ with :
143+ php-version : ' 8.4'
144+ extensions : json, mbstring, tokenizer
145+ coverage : xdebug
146+ tools : composer:v2
147+
148+ - name : Get composer cache directory
149+ id : composer-cache
150+ run : echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
151+
152+ - name : Cache composer dependencies
153+ uses : actions/cache@v4
154+ with :
155+ path : ${{ steps.composer-cache.outputs.dir }}
156+ key : ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
157+ restore-keys : ${{ runner.os }}-composer-
158+
159+ - name : Install dependencies
160+ run : composer install --prefer-dist --no-interaction --no-progress
161+
162+ - name : Run tests with coverage
163+ run : vendor/bin/phpunit --coverage-clover coverage.xml
164+
165+ - name : Upload coverage to Codecov
166+ uses : codecov/codecov-action@v4
167+ with :
168+ file : ./coverage.xml
169+ flags : unittests
170+ name : codecov-umbrella
171+ fail_ci_if_error : false
0 commit comments