Azure: Publish code coverage results

* Add an Azure Publish Code Coverage Results task
* Add `make gcovr-html` to generate a gcovr test coverage report in HTML
* Add `make gcovr-xml` to generate a gcovr test coverage report in XML
* Remove `test` target dependency from `make lcov-html`;
  Run the two targets together instead: `make test lcov-html`.

Re: https://github.com/php/php-src/pull/4739#issuecomment-534911441

See: https://externals.io/message/107113,
https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/test/publish-code-coverage-results?view=azure-devops,
and https://github.com/php/php-src/pull/4759.
This commit is contained in:
Gerard Roche 2019-09-25 19:13:17 +01:00 committed by Nikita Popov
parent aa10e20830
commit db54b0fa18
6 changed files with 103 additions and 27 deletions

2
.gitignore vendored
View file

@ -249,6 +249,8 @@ tmp-php.ini
# ------------------------------------------------------------------------------
*.gcda
*.gcno
/gcovr.xml
/gcovr_html/
/lcov_html/
/php_lcov.info

View file

@ -82,3 +82,7 @@ jobs:
--enable-debug --enable-maintainer-zts
CFLAGS='-fsanitize=undefined,address -fno-sanitize-recover -DZEND_TRACK_ARENA_ALLOC'
LDFLAGS='-fsanitize=undefined,address'
- template: azure/coverage_job.yml
parameters:
configurationName: COVERAGE_DEBUG_ZTS
configurationParameters: '--enable-debug --disable-maintainer-zts'

42
azure/coverage_job.yml Normal file
View file

@ -0,0 +1,42 @@
parameters:
configurationName: ''
configurationParameters: ''
runTestsParameters: ''
timeoutInMinutes: 60
jobs:
- job: ${{ parameters.configurationName }}
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
pool:
vmImage: 'ubuntu-latest'
steps:
- template: apt.yml
- script: |
sudo -H pip install gcovr
displayName: 'Install gcovr'
- template: configure.yml
parameters:
configurationParameters: --enable-gcov ${{ parameters.configurationParameters }}
- script: make -j$(/usr/bin/nproc) >/dev/null
displayName: 'Make Build'
- template: install.yml
- script: |
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test"
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
sudo -u postgres psql -c "CREATE DATABASE test;"
displayName: 'Setup'
- template: test.yml
parameters:
configurationName: ${{ parameters.configurationName }}
runTestsParameters: ${{ parameters.runTestsParameters }}
- script: |
make gcovr-xml
mv gcovr.xml coverage.xml
displayName: 'Generate ${{ parameters.configurationName }} Test Coverage'
condition: or(succeeded(), failed())
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: coverage.xml
displayName: 'Publish ${{ parameters.configurationName }} Test Coverage'
condition: or(succeeded(), failed())

10
azure/install.yml Normal file
View file

@ -0,0 +1,10 @@
steps:
- script: |
sudo make install
sudo mkdir /etc/php.d
sudo chmod 777 /etc/php.d
echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini
echo pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/pdo_mysql.ini
echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini
echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini
displayName: 'Install Build'

View file

@ -16,15 +16,7 @@ jobs:
configurationParameters: ${{ parameters.configurationParameters }}
- script: make -j$(/usr/bin/nproc) >/dev/null
displayName: 'Make Build'
- script: |
sudo make install
sudo mkdir /etc/php.d
sudo chmod 777 /etc/php.d
echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini
echo pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/pdo_mysql.ini
echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini
echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini
displayName: 'Install Build'
- template: install.yml
- script: |
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test"
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"

View file

@ -1,34 +1,43 @@
#
# LCOV
# GCOV
#
LTP = lcov
LTP_GENHTML = genhtml
LCOV_EXCLUDES = \
'$(top_srcdir)/ext/bcmath/libbcmath/*' \
'$(top_srcdir)/ext/date/lib/*' \
'$(top_srcdir)/ext/fileinfo/libmagic/*' \
'$(top_srcdir)/ext/gd/libgd/*' \
'$(top_srcdir)/ext/hash/sha3/*' \
'$(top_srcdir)/ext/mbstring/libmbfl/*' \
'$(top_srcdir)/ext/opcache/jit/libudis86/*' \
'$(top_srcdir)/ext/pcre/pcre2lib/*' \
'$(top_srcdir)/ext/xmlrpc/libxmlrpc/*'
GCOVR_EXCLUDES = \
'ext/bcmath/libbcmath/.*' \
'ext/date/lib/.*' \
'ext/fileinfo/libmagic/.*' \
'ext/gd/libgd/.*' \
'ext/hash/sha3/.*' \
'ext/mbstring/libmbfl/.*' \
'ext/opcache/jit/libudis86/.*' \
'ext/pcre/pcre2lib/.*' \
'ext/xmlrpc/libxmlrpc/.*'
lcov: lcov-html
lcov-test: lcov-clean-data test
php_lcov.info: lcov-test
php_lcov.info:
@echo "Generating lcov data for $@"
@$(LTP) --capture --no-external --directory . --output-file $@
$(LTP) --capture --no-external --directory . --output-file $@
@echo "Stripping bundled libraries from $@"
@$(LTP) --remove $@ \
'*/<stdout>' \
'$(top_srcdir)/ext/bcmath/libbcmath/*' \
'$(top_srcdir)/ext/date/lib/*' \
'$(top_srcdir)/ext/fileinfo/libmagic/*' \
'$(top_srcdir)/ext/gd/libgd/*' \
'$(top_srcdir)/ext/hash/sha3/*' \
'$(top_srcdir)/ext/mbstring/libmbfl/*' \
'$(top_srcdir)/ext/opcache/jit/libudis86/*' \
'$(top_srcdir)/ext/pcre/pcre2lib/*' \
'$(top_srcdir)/ext/xmlrpc/libxmlrpc/*' \
--output-file $@
$(LTP) --output-file $@ --remove $@ '*/<stdout>' $(LCOV_EXCLUDES)
lcov-html: php_lcov.info
@echo "Generating lcov HTML"
@$(LTP_GENHTML) --legend --output-directory lcov_html/ --title "PHP Code Coverage" php_lcov.info
$(LTP_GENHTML) --legend --output-directory lcov_html/ --title "PHP Code Coverage" php_lcov.info
lcov-clean:
rm -f php_lcov.info
@ -36,3 +45,20 @@ lcov-clean:
lcov-clean-data:
@find . -name \*.gcda -o -name \*.da -o -name \*.bbg? | xargs rm -f
gcovr-html:
@echo "Generating gcovr HTML"
@rm -rf gcovr_html/
@mkdir gcovr_html
gcovr -sr . -o gcovr_html/index.html --html --html-details \
--exclude-directories 'ext/date/lib$$' \
$(foreach lib, $(GCOVR_EXCLUDES), -e $(lib))
gcovr-xml:
@echo "Generating gcovr XML"
@rm -f gcovr.xml
gcovr -sr . -o gcovr.xml --xml \
--exclude-directories 'ext/date/lib$$' \
$(foreach lib, $(GCOVR_EXCLUDES), -e $(lib))
.PHONY: gcovr-html lcov-html php_lcov.info