Skip to content

Internal: Parallel smoke testing #12340

Internal: Parallel smoke testing

Internal: Parallel smoke testing #12340

Workflow file for this run

name: 🔥 Parallel Smoke Tests
on:
pull_request:
jobs:
run-smoke-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
path: src
- name: Validate composer.json and composer.lock
run: |
cd src && composer validate --strict --no-check-all
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v4
with:
path: src/vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install Composer Dependencies
run: |
cd src && composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Prepare test directories
run: |
for suite in unit feature_hyde feature_framework publications realtime_compiler; do
cp -R src ${suite}_tests
done
mv src/.git .
- name: Execute Tests in Parallel
run: |
mkdir -p test_results
mkdir -p test_outputs
# Function to run tests and update progress
run_tests() {
local suite=$1
local testsuite=$2
local padding=""
if [ "$suite" == "unit" ]; then
padding=" "
elif [ "$suite" == "feature_hyde" ] || [ "$suite" == "publications" ]; then
padding=" "
fi
cd ${suite}_tests
vendor/bin/pest --colors=always --stop-on-failure --log-junit="../test_results/${suite}_junit.xml" --testsuite="$testsuite" 2>&1 | tee "../test_outputs/${suite}.log" | while IFS= read -r line
do
echo "." >> "../test_outputs/${suite}.progress"
tput cup 0 0
echo -e "\033[2J" # Clear the screen
for s in unit feature_hyde feature_framework publications realtime_compiler; do
local p=""
if [ "$s" == "unit" ]; then
p=" "
elif [ "$s" == "feature_hyde" ] || [ "$s" == "publications" ]; then
p=" "
fi
echo -n "[${s^^}]${p} "
cat "../test_outputs/${s}.progress" 2>/dev/null || echo -n ""
echo ""
done
done
}
# Run tests in parallel
(run_tests unit UnitFramework) &
(run_tests feature_hyde FeatureHyde) &
(run_tests feature_framework FeatureFramework) &
(run_tests publications Publications) &
(run_tests realtime_compiler "Realtime Compiler") &
# Wait for all background jobs to finish
wait
- name: Display Unit Tests Output
run: cat test_outputs/unit.log
- name: Display Feature Hyde Tests Output
run: cat test_outputs/feature_hyde.log
- name: Display Feature Framework Tests Output
run: cat test_outputs/feature_framework.log
- name: Display Publications Tests Output
run: cat test_outputs/publications.log
- name: Display Realtime Compiler Tests Output
run: cat test_outputs/realtime_compiler.log
- name: Merge JUnit XML Reports
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
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 }}