Skip to content

Commit

Permalink
Merge pull request #1928 from hydephp/parallel-coverage-testing
Browse files Browse the repository at this point in the history
Internal: Parallel smoke testing
  • Loading branch information
caendesilva authored Aug 2, 2024
2 parents 5d6ae26 + a180d59 commit c6d0ca0
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 38 deletions.
6 changes: 4 additions & 2 deletions .github/workflows/coverage-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
pull_request:

jobs:

test-coverage:
runs-on: ubuntu-latest
steps:
Expand All @@ -15,6 +14,9 @@ jobs:
extensions: fileinfo
- uses: actions/checkout@v4

- name: Validate composer.json and composer.lock
run: composer validate --strict --no-check-all

- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v4
Expand All @@ -41,4 +43,4 @@ jobs:
- name: Ping statistics server with test results
run: |
curl https://raw.githubusercontent.com/hydephp/develop/6e9d17f31879f4ccda13a3fec4029c9663bccec0/monorepo/scripts/ping-openanalytics-testrunner.php -o ping.php
php ping.php "Monorepo Coverage Tests" ${{ secrets.OPENANALYTICS_TOKEN }} ${{ github.ref_name }}
php ping.php "Monorepo Coverage Tests" ${{ secrets.OPENANALYTICS_TOKEN }} ${{ github.ref_name }}
137 changes: 101 additions & 36 deletions .github/workflows/smoke-tests.yml
Original file line number Diff line number Diff line change
@@ -1,65 +1,130 @@
# This workflow is especially helpful for pull requests to quickly see if the other tests will definitely fail.
# In order to get even quicker feedback, we also ping our Continuous Integration server to get a status check
# as soon as we know the outcome, as the GitHub Actions Pull Request UI takes a little bit to update.

name: 🔥 Smoke Tests
name: 🔥 Parallel Smoke Tests

on:
pull_request:

jobs:

run-smoke-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Validate composer.json and composer.lock
run: composer validate --strict --no-check-all
- name: Checkout code
uses: actions/checkout@v4
with:
path: src

- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v4
with:
path: vendor
path: src/vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install Composer Dependencies
run: composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
run: |
cd src && composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Run smoke tests
id: smoke-tests
run: vendor/bin/pest --stop-on-failure --log-junit report.xml
- name: Prepare test directories
run: |
setup_directory() {
local suite=$1
mkdir -p "${suite}_tests"
cp -al src/. "${suite}_tests/"
}
# Create hard links for all suites
for suite in unit feature_hyde feature_framework publications realtime_compiler; do
setup_directory $suite
done
# Move the .git directory out of src
mv src/.git .
- name: Ping continuous integration server with test status
if: always() && github.event.repository.full_name == 'hydephp/develop'
- name: Execute Tests in Parallel
run: |
bearerToken="${{ secrets.CI_SERVER_TOKEN }}"
commit="${{ github.event.pull_request.head.sha }}"
url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
mkdir -p test_results
mkdir -p test_outputs
# If bearerToken is not set, we we exit early as we are probably running on a fork
if [ -z "$bearerToken" ]; then
echo "Exiting early as bearerToken is not set"
exit 0
fi
# Function to run tests
run_tests() {
local suite=$1
local testsuite=$2
echo "${suite^} tests started"
cd ${suite}_tests
if vendor/bin/pest --colors=always --log-junit="../test_results/${suite}_junit.xml" --testsuite="$testsuite" > "../test_outputs/${suite}.log" 2>&1; then
echo "${suite^} tests completed successfully"
else
echo "${suite^} tests failed"
return 1
fi
}
# Run tests in parallel and capture exit codes
run_tests unit UnitFramework & pid1=$!
run_tests feature_hyde FeatureHyde & pid2=$!
run_tests feature_framework FeatureFramework & pid3=$!
run_tests publications Publications & pid4=$!
run_tests realtime_compiler "Realtime Compiler" & pid5=$!
# Wait for all background jobs to finish and capture exit codes
wait $pid1 || echo "Unit tests failed" >> test_failures
wait $pid2 || echo "Feature Hyde tests failed" >> test_failures
wait $pid3 || echo "Feature Framework tests failed" >> test_failures
wait $pid4 || echo "Publications tests failed" >> test_failures
wait $pid5 || echo "Realtime Compiler tests failed" >> test_failures
if [ ${{ steps.smoke-tests.outcome }} == "failure" ]; then
status=false
else
status=true
# Check if any tests failed
if [ -f test_failures ]; then
echo "The following test suites failed:"
cat test_failures
exit 1
fi
curl -X POST --fail-with-body \
-H "Authorization: Bearer $bearerToken" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"commit":"'"$commit"'", "status":'$status', "url":"'"$url"'"}' \
https://ci.hydephp.com/api/test-run-reports
- name: Display Unit Tests Output
if: always()
run: cat test_outputs/unit.log

- name: Display Feature Hyde Tests Output
if: always()
run: cat test_outputs/feature_hyde.log

- name: Display Feature Framework Tests Output
if: always()
run: cat test_outputs/feature_framework.log

- name: Display Publications Tests Output
if: always()
run: cat test_outputs/publications.log

- name: Display Realtime Compiler Tests Output
if: always()
run: cat test_outputs/realtime_compiler.log

- name: Merge JUnit XML Reports
if: always()
run: |
php -r '
$files = glob("test_results/*_junit.xml");
$totalTests = $totalAssertions = $totalTime = 0;
foreach ($files as $file) {
$xml = simplexml_load_file($file);
$totalTests += (int)$xml->testsuite["tests"];
$totalAssertions += (int)$xml->testsuite["assertions"];
$totalTime += (float)$xml->testsuite["time"];
}
$output = sprintf(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites>\n <testsuite name=\"%s\" tests=\"%d\" assertions=\"%d\" errors=\"0\" failures=\"0\" skipped=\"0\" time=\"%.6f\">\n </testsuite>\n</testsuites>",
"H:\\monorepo\\phpunit.xml.dist",
$totalTests,
$totalAssertions,
$totalTime
);
file_put_contents("report.xml", $output);
'
- name: Ping statistics server with test results
if: always()
run: |
curl https://raw.githubusercontent.com/hydephp/develop/6e9d17f31879f4ccda13a3fec4029c9663bccec0/monorepo/scripts/ping-openanalytics-testrunner.php -o ping.php
php ping.php "Monorepo Smoke Tests" ${{ secrets.OPENANALYTICS_TOKEN }} ${{ github.ref_name }}

0 comments on commit c6d0ca0

Please sign in to comment.