Skip to content

Publish and clean test results #5131

Publish and clean test results

Publish and clean test results #5131

Workflow file for this run

name: Publish and clean test results
on:
workflow_run:
workflows: ["Hardware and Wokwi tests"]
types:
- completed
# No permissions by default
permissions:
contents: read
jobs:
get-artifacts:
name: Get artifacts
runs-on: ubuntu-latest
outputs:
original_event: ${{ steps.get-info.outputs.original_event }}
original_action: ${{ steps.get-info.outputs.original_action }}
original_sha: ${{ steps.get-info.outputs.original_sha }}
original_ref: ${{ steps.get-info.outputs.original_ref }}
original_conclusion: ${{ steps.get-info.outputs.original_conclusion }}
original_run_id: ${{ steps.get-info.outputs.original_run_id }}
steps:
- name: Download and Extract Artifacts
uses: dawidd6/action-download-artifact@07ab29fd4a977ae4d2b275087cf67563dfdf0295 # v9
with:
run_id: ${{ github.event.workflow_run.id }}
path: ./artifacts
- name: Get original info
id: get-info
run: |
echo "Artifacts:"
ls -laR ./artifacts
original_event=$(cat ./artifacts/parent-artifacts/event.txt)
original_action=$(cat ./artifacts/parent-artifacts/action.txt)
original_sha=$(cat ./artifacts/parent-artifacts/sha.txt)
original_ref=$(cat ./artifacts/parent-artifacts/ref.txt)
original_conclusion=$(cat ./artifacts/parent-artifacts/conclusion.txt)
original_run_id=$(cat ./artifacts/parent-artifacts/run_id.txt)
# Sanitize the values to avoid security issues
# Event: Allow alphabetical characters and underscores
original_event=$(echo "$original_event" | tr -cd '[:alpha:]_')
# Action: Allow alphabetical characters and underscores
original_action=$(echo "$original_action" | tr -cd '[:alpha:]_')
# SHA: Allow alphanumeric characters
original_sha=$(echo "$original_sha" | tr -cd '[:alnum:]')
# Ref: Allow alphanumeric characters, slashes, underscores, dots, and dashes
original_ref=$(echo "$original_ref" | tr -cd '[:alnum:]/_.-')
# Conclusion: Allow alphabetical characters and underscores
original_conclusion=$(echo "$original_conclusion" | tr -cd '[:alpha:]_')
# Run ID: Allow numeric characters
original_run_id=$(echo "$original_run_id" | tr -cd '[:digit:]')
echo "original_event=$original_event" >> $GITHUB_OUTPUT
echo "original_action=$original_action" >> $GITHUB_OUTPUT
echo "original_sha=$original_sha" >> $GITHUB_OUTPUT
echo "original_ref=$original_ref" >> $GITHUB_OUTPUT
echo "original_conclusion=$original_conclusion" >> $GITHUB_OUTPUT
echo "original_run_id=$original_run_id" >> $GITHUB_OUTPUT
echo "original_event = $original_event"
echo "original_action = $original_action"
echo "original_sha = $original_sha"
echo "original_ref = $original_ref"
echo "original_conclusion = $original_conclusion"
echo "original_run_id = $original_run_id"
- name: Print links to other runs
env:
ORIGINAL_RUN_ID: ${{ steps.get-info.outputs.original_run_id }}
run: |
echo "Build and QEMU tests: https://github.com/${{ github.repository }}/actions/runs/$ORIGINAL_RUN_ID"
echo "Hardware and Wokwi tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}"
unit-test-results:
name: Unit Test Results
needs: get-artifacts
if: |
github.event.workflow_run.conclusion == 'success' ||
github.event.workflow_run.conclusion == 'failure' ||
github.event.workflow_run.conclusion == 'timed_out'
runs-on: ubuntu-latest
permissions:
actions: write
statuses: write
checks: write
pull-requests: write
contents: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: gh-pages
- name: Download and Extract Artifacts
uses: dawidd6/action-download-artifact@07ab29fd4a977ae4d2b275087cf67563dfdf0295 # v9
with:
run_id: ${{ github.event.workflow_run.id }}
path: ./artifacts
- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@170bf24d20d201b842d7a52403b73ed297e6645b # v2.18.0
with:
commit: ${{ needs.get-artifacts.outputs.original_sha }}
event_file: ./artifacts/parent-artifacts/event_file/event.json
event_name: ${{ needs.get-artifacts.outputs.original_event }}
files: ./artifacts/**/*.xml
action_fail: true
action_fail_on_inconclusive: true
compare_to_earlier_commit: false
json_file: ./unity_results.json
json_suite_details: true
- name: Upload JSON
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always()
with:
name: unity_results
overwrite: true
path: ./unity_results.json
- name: Fail if tests failed
if: |
needs.get-artifacts.outputs.original_conclusion == 'failure' ||
needs.get-artifacts.outputs.original_conclusion == 'cancelled' ||
needs.get-artifacts.outputs.original_conclusion == 'timed_out' ||
github.event.workflow_run.conclusion == 'failure' ||
github.event.workflow_run.conclusion == 'cancelled' ||
github.event.workflow_run.conclusion == 'timed_out'
run: exit 1
- name: Clean up caches
if: always()
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
env:
ORIGINAL_REF: ${{ needs.get-artifacts.outputs.original_ref }}
ORIGINAL_EVENT: ${{ needs.get-artifacts.outputs.original_event }}
ORIGINAL_ACTION: ${{ needs.get-artifacts.outputs.original_action }}
with:
script: |
const ref = process.env.ORIGINAL_REF;
const key_prefix = 'test-' + ref + '-';
if (process.env.ORIGINAL_EVENT == 'pull_request' && process.env.ORIGINAL_ACTION != 'closed') {
console.log('Skipping cache cleanup for open PR');
return;
}
await github.paginate(github.rest.actions.getActionsCacheList, {
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 100,
key: key_prefix
}).then(caches => {
if (caches) {
for (const cache of caches) {
console.log(`Deleting cache: ${cache.key}`);
github.rest.actions.deleteActionsCacheById({
owner: context.repo.owner,
repo: context.repo.repo,
cache_id: cache.id
});
}
}
});
- name: Report conclusion
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
if: always()
env:
ORIGINAL_EVENT: ${{ needs.get-artifacts.outputs.original_event }}
ORIGINAL_SHA: ${{ needs.get-artifacts.outputs.original_sha }}
with:
script: |
const owner = '${{ github.repository_owner }}';
const repo = '${{ github.repository }}'.split('/')[1];
const sha = process.env.ORIGINAL_SHA;
core.debug(`owner: ${owner}`);
core.debug(`repo: ${repo}`);
core.debug(`sha: ${sha}`);
const { context: name, state } = (await github.rest.repos.createCommitStatus({
context: `Runtime Tests / Report results (${process.env.ORIGINAL_EVENT} -> workflow_run -> workflow_run)`,
owner: owner,
repo: repo,
sha: sha,
state: '${{ job.status }}',
description: '${{ job.status }}' == 'success' ? 'Runtime tests successful' : 'Runtime tests failed',
target_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
})).data;
core.info(`${name} is ${state}`);
- name: Generate report
if: |
(!cancelled() &&
needs.get-artifacts.outputs.original_conclusion != 'cancelled' &&
github.event.workflow_run.conclusion != 'cancelled') &&
(needs.get-artifacts.outputs.original_event == 'schedule' ||
needs.get-artifacts.outputs.original_event == 'workflow_dispatch')
env:
REPORT_FILE: ./runtime-test-results/RUNTIME_TEST_RESULTS.md
WOKWI_RUN_ID: ${{ github.event.workflow_run.id }}
BUILD_RUN_ID: ${{ needs.get-artifacts.outputs.original_run_id }}
IS_FAILING: |
needs.get-artifacts.outputs.original_conclusion == 'failure' ||
needs.get-artifacts.outputs.original_conclusion == 'cancelled' ||
needs.get-artifacts.outputs.original_conclusion == 'timed_out' ||
github.event.workflow_run.conclusion == 'failure' ||
github.event.workflow_run.conclusion == 'cancelled' ||
github.event.workflow_run.conclusion == 'timed_out' ||
job.status == 'failure'
run: |
rm -rf artifacts $REPORT_FILE
mv -f ./unity_results.json ./runtime-test-results/unity_results.json
touch $REPORT_FILE
python3 ./runtime-test-results/table_generator.py ./runtime-test-results/unity_results.json >> $REPORT_FILE
mv -f ./test_results.json ./runtime-test-results/test_results.json
- name: Generate badge
if: |
(!cancelled() &&
needs.get-artifacts.outputs.original_conclusion != 'cancelled' &&
github.event.workflow_run.conclusion != 'cancelled') &&
(needs.get-artifacts.outputs.original_event == 'schedule' ||
needs.get-artifacts.outputs.original_event == 'workflow_dispatch')
uses: jaywcjlove/generated-badges@0e078ae4d4bab3777ea4f137de496ab44688f5ad # v1.0.13
with:
label: Runtime Tests
status: ${{ job.status == 'success' && 'passing' || 'failing' }}
output: runtime-test-results/badge.svg
color: ${{ job.status == 'success' && 'green' || 'red' }}
style: flat
- name: Push badge
if: |
(!cancelled() &&
needs.get-artifacts.outputs.original_conclusion != 'cancelled' &&
github.event.workflow_run.conclusion != 'cancelled') &&
(needs.get-artifacts.outputs.original_event == 'schedule' ||
needs.get-artifacts.outputs.original_event == 'workflow_dispatch')
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
if [[ `git status --porcelain` ]]; then
git add --all
git commit -m "Updated runtime test results"
git push origin HEAD:gh-pages
fi