Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
219 changes: 30 additions & 189 deletions .github/workflows/codecoverage-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,194 +4,35 @@
# GitHub Pages, generates a README badge with the coverage percentage.

on:
push:
branches:
- trunk
pull_request:
types: [ opened, reopened, ready_for_review, synchronize ]
branches:
- trunk
workflow_dispatch:
push:
branches:
- trunk
pull_request:
types: [ opened, reopened, ready_for_review, synchronize ]
branches:
- trunk
workflow_dispatch:

jobs:

codecoverage:
runs-on: ubuntu-latest

services:
mysql:
image: mysql:5.7 # Password auth did not work on 8.0 on PHP 7.3, it did seem to work for PHP 7.4+
env: # These are the same username and password as the wp-env container defaults
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: tests-wordpress
ports: # This mapping matches the .wp-env.json configuration
- 33306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

strategy:
matrix: # Supported PHP versions
php: [ '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ]

steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0 # attempting to get all branch names.

# TODO: a DEPLOY_KEY is needed to enable gh-pages for the first time (the branch can be created and pushed but
# it will not be reachable as a website).
# Consider @see https://github.com/peaceiris/actions-gh-pages
# - name: Check does gh-pages branch need to be created
# run: |
# git branch -l;
# if [[ $(git branch -l gh-pages) == "" ]]; then
# gh_pages_branch_needed=true;
# echo "gh-pages branch is needed";
# else
# gh_pages_branch_needed=false
# echo "gh-pages branch already exists";
# fi
# echo "GH_PAGES_BRANCH_NEEDED=$gh_pages_branch_needed" >> $GITHUB_ENV;
# mkdir gh-pages
#
# - name: Maybe create gh-pages branch
# if: ${{ env.GH_PAGES_BRANCH_NEEDED }}
# uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
# with:
# github_token: ${{ secrets.GITHUB_TOKEN }}
# publish_dir: ./gh-pages
# force_orphan: true
# allow_empty_commit: true
# commit_message: "🤖 Creating gh-pages branch"

- name: Checkout GitHub Pages branch for code coverage report
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: gh-pages
path: gh-pages

- name: Install PHP
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
with:
php-version: ${{ matrix.php }}
coverage: xdebug
tools: composer, jaschilz/php-coverage-badger
extensions: zip

- name: Read .env.testing
uses: c-py/action-dotenv-to-setenv@925b5d99a3f1e4bd7b4e9928be4e2491e29891d9 # v5
with:
env-file: .env.testing

- name: Run composer install
continue-on-error: true
run: composer install -v

- name: Allow writing to wp-content
if: ${{ hashFiles('wp-content') != '' }} # TODO: This may be incorrect since it's a directory.
run: sudo chmod -R a+w wp-content

- name: Print refs
run: |
echo "ref: ${{ github.ref }}"
echo "head_ref: ${{ github.head_ref }}"
echo "base_ref: ${{ github.base_ref }}"

# On trunk, there will be a previous coverage report. On PRs we create a new directory using the commit SHA.
- name: Clear previous code coverage
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/trunk') }}
run: |
rm -rf gh-pages/phpunit || true;
mkdir gh-pages/phpunit || true;

# - name: Run unit tests
# if: ${{ hashFiles('tests/phpunit/bootstrap.php') != '' }} # Only run unit tests if they are present.
# run: XDEBUG_MODE=coverage vendor/bin/phpunit --bootstrap tests/phpunit/bootstrap.php --coverage-php tests/_output/unit.cov --debug

- name: Run wpunit tests
run: XDEBUG_MODE=coverage vendor/bin/codecept run wpunit --coverage tests/_output/wpunit.cov --debug

# For PRs, we'll generate the coverage report on each pushed commit
- name: Merge code coverage for PR
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
run: |
vendor/bin/phpcov merge --clover clover.xml tests/_output/;
vendor/bin/phpcov merge --clover gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/clover.xml --php gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/phpunit.cov --html gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/html/ tests/_output/;

# On main, we want it output to a different path
- name: Merge code coverage for main
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/trunk') }}
run: |
vendor/bin/phpcov merge --clover clover.xml tests/_output/;
vendor/bin/phpcov merge --clover gh-pages/phpunit/clover.xml --php gh-pages/phpunit/phpunit.cov --html gh-pages/phpunit/html/ tests/_output/;

# This makes the coverage percentage available in `{{ steps.coverage-percentage.outputs.coverage-rounded }}`.
- name: Check test coverage
if: ${{ matrix.php == '7.3' }}
uses: johanvanhelden/gha-clover-test-coverage-check@2543c79a701f179bd63aa14c16c6938c509b2cec # v1
id: coverage-percentage
with:
percentage: 25
exit: false
filename: clover.xml
rounded-precision: "0"

# See: https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/
- name: Add `.nojekyll` file so code coverage report successfully deploys to gh-pages
if: ${{ (matrix.php == '7.3') }}
working-directory: gh-pages
run: |
touch .nojekyll
git add -- .nojekyll *

- name: Update README coverage badge
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/trunk') }} # only commit on trunk, on the PHP version we're using in production.
run: php-coverage-badger clover.xml gh-pages/phpunit/coverage.svg

- name: Generate PR coverage badge
if: ${{ (matrix.php == '7.3') && github.event_name == 'pull_request' }}
run: php-coverage-badger clover.xml gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/coverage.svg

- name: Commit code coverage to gh-pages
if: ${{ matrix.php == '7.3' }}
uses: stefanzweifel/git-auto-commit-action@28e16e81777b558cc906c8750092100bbb34c5e3 # v7.0.0
with:
repository: gh-pages
branch: gh-pages
commit_message: ${{ format('🤖 Save code coverage report to gh-pages {0}%', steps.coverage-percentage.outputs.coverage-rounded) }}
commit_options: ""
env:
GITHUB_TOKEN: "${{ github.token }}"

- name: Add coverage badge to PR comment
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
run: |
echo "[![Code Coverage ](https://newfold-labs.github.io/wp-module-onboarding/${{ github.event.pull_request.head.sha }}/phpunit/coverage.svg)](https://newfold-labs.github.io/wp-module-onboarding/${{ github.event.pull_request.head.sha }}/phpunit/html/)" >> coverage-comment.md
echo "" >> coverage-comment.md
echo "" >> coverage-comment.md

- name: Add coverage report link to PR comment
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
run: |
echo "${{ format('[project coverage report {0}%](https://newfold-labs.github.io/wp-module-onboarding/{1}/phpunit/html/) @ {2}', steps.coverage-percentage.outputs.coverage-rounded, github.event.pull_request.head.sha, github.event.pull_request.head.sha) }}" >> coverage-comment.md
echo "" >> coverage-comment.md
echo "" >> coverage-comment.md

- name: Add phpcov uncovered lines report to PR comment
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
continue-on-error: true # phpcov can fail if there are no uncovered lines
run: |
BRANCHED_COMMIT=$(git rev-list origin..HEAD | tail -n 1);
echo "BRANCHED_COMMIT=$BRANCHED_COMMIT"
git diff $BRANCHED_COMMIT...${{ github.event.pull_request.head.sha }} > branch.diff;
cat branch.diff;
OUTPUT=${vendor/bin/phpcov patch-coverage --path-prefix $(pwd) ./gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/phpunit.cov branch.diff || true}
echo $OUTPUT;
echo "$OUTPUT" >> coverage-comment.md

- name: Add coverage PR comment
uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
with:
message-id: coverage-report
message-path: coverage-comment.md
get-repo-name:
runs-on: ubuntu-latest
outputs:
repository-name: ${{ steps.repo-name.outputs.name }}
steps:
- name: Extract repository name
id: repo-name
run: echo "name=$(echo ${{ github.repository }} | cut -d'/' -f2)" >> $GITHUB_OUTPUT

codecoverage:
needs: get-repo-name
permissions:
contents: write
pull-requests: write
uses: newfold-labs/workflows/.github/workflows/reusable-codecoverage.yml@main
with:
php-versions: '["7.4", "8.0", "8.1", "8.2", "8.3", "8.4"]'
coverage-php-version: '7.4'
repository-name: ${{ needs.get-repo-name.outputs.repository-name }}
minimum-coverage: 25
secrets:
repo_token: ${{ secrets.GITHUB_TOKEN }}
Loading