Wokwi tests #400
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Run tests in wokwi on PR | |
on: | |
workflow_run: | |
workflows: [Run tests] | |
types: | |
- completed | |
permissions: | |
statuses: write | |
env: | |
MAX_CHUNKS: 15 | |
WOKWI_TIMEOUT: 600000 # Milliseconds | |
WOKWI_CLI_TOKEN: ${{ secrets.WOKWI_CLI_TOKEN }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
jobs: | |
get_event_file: | |
name: Get event file | |
runs-on: ubuntu-latest | |
outputs: | |
ref: ${{ steps.get-ref.outputs.ref }} | |
steps: | |
- name: Download event file | |
uses: actions/download-artifact@v4 | |
with: | |
run-id: ${{github.event.workflow_run.id}} | |
github-token: ${{env.GITHUB_TOKEN}} | |
name: event_file | |
- name: Get ref | |
id: get-ref | |
run: | | |
PR_NUMBER=$(jq -r '.number' event.json) | |
echo "PR_NUMBER = $PR_NUMBER" | |
echo "ref=$PR_NUMBER" >> $GITHUB_OUTPUT | |
gen_chunks: | |
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' | |
name: Generate Chunks matrix | |
runs-on: ubuntu-latest | |
needs: get_event_file | |
outputs: | |
chunks: ${{ steps.gen-chunks.outputs.chunks }} | |
concurrency: | |
group: wokwi-${{ needs.get_event_file.outputs.ref || github.ref }} | |
cancel-in-progress: true | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ github.event.workflow_run.head_sha }} # Check out the code of the PR to generate accurate chunks | |
- name: Generate Chunks matrix | |
id: gen-chunks | |
run: | | |
set +e | |
.github/scripts/sketch_utils.sh count tests | |
sketches=$? | |
if [[ $sketches -ge ${{env.MAX_CHUNKS}} ]]; then | |
$sketches=${{env.MAX_CHUNKS}} | |
fi | |
set -e | |
rm sketches.txt | |
CHUNKS=$(jq -c -n '$ARGS.positional' --args `seq 0 1 $((sketches - 1))`) | |
echo "chunks=${CHUNKS}" >>$GITHUB_OUTPUT | |
wokwi-test: | |
needs: [get_event_file, gen_chunks] | |
name: ${{matrix.chip}}-Wokwi_Test#${{matrix.chunks}} | |
concurrency: | |
group: wokwi-${{ needs.get_event_file.outputs.ref || github.ref }}-${{matrix.chip}}-${{matrix.chunks}} | |
cancel-in-progress: true | |
strategy: | |
fail-fast: false | |
matrix: | |
chip: ['esp32', 'esp32s2', 'esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'] | |
chunks: ${{fromJson(needs.gen_chunks.outputs.chunks)}} | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ github.event.workflow_run.head_sha }} # Check out the code of the PR to get correct pytest files | |
- name: Download ${{matrix.chip}}-${{matrix.chunks}} artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{matrix.chip}}-${{matrix.chunks}}.artifacts | |
path: ~/ | |
run-id: ${{github.event.workflow_run.id}} | |
github-token: ${{env.GITHUB_TOKEN}} | |
- name: Install Wokwi CLI | |
run: curl -L https://wokwi.com/ci/install.sh | sh | |
- name: Wokwi CI Server | |
uses: wokwi/wokwi-ci-server-action@v1 | |
- name: Install dependencies | |
run: | | |
pip install -U pip | |
pip install -r tests/requirements.txt --extra-index-url https://dl.espressif.com/pypi | |
sudo apt update && sudo apt install -y -qq jq | |
- name: Run Tests | |
run: | | |
bash .github/scripts/tests_run.sh -c -t ${{matrix.chip}} -i ${{matrix.chunks}} -m ${{env.MAX_CHUNKS}} -w ${{env.WOKWI_TIMEOUT}} | |
- name: Check if tests were skipped | |
id: check-test-skipped | |
run: | | |
if [ $(find "tests" -name ".test_skipped") ]; then | |
echo "skipped=true" >> $GITHUB_OUTPUT | |
else | |
echo "skipped=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Upload test result artifacts | |
uses: actions/upload-artifact@v4 | |
if: ${{ always() && steps.check-test-skipped.outputs.skipped == 'false' }} | |
with: | |
name: wokwi_results-${{matrix.chip}}-${{matrix.chunks}} | |
path: tests/**/*.xml | |
report-result: | |
name: Report wokwi test result | |
runs-on: ubuntu-latest | |
needs: [get_event_file, wokwi-test] | |
concurrency: | |
group: wokwi-${{ needs.get_event_file.outputs.ref || github.ref }} | |
cancel-in-progress: true | |
if: always() && github.event.workflow_run.event == 'pull_request' | |
steps: | |
- name: Report result | |
uses: actions/github-script@v7 | |
with: | |
debug: true | |
script: | | |
const owner = '${{ github.repository_owner }}'; | |
const repo = '${{ github.repository }}'.split('/')[1]; | |
const sha = '${{ github.event.workflow_run.head_sha }}'; | |
const result = '${{ needs.wokwi-test.result }}' == 'success' ? 'success' : 'failure'; | |
core.debug(`owner: ${owner}`); | |
core.debug(`repo: ${repo}`); | |
core.debug(`sha: ${sha}`); | |
core.debug(`result: ${result}`); | |
const { context: name, state } = (await github.rest.repos.createCommitStatus({ | |
context: 'Wokwi tests', | |
description: 'Wokwi simulator tests', | |
owner: owner, | |
repo: repo, | |
sha: sha, | |
state: result, | |
target_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}' | |
})).data; | |
core.info(`${name} is ${state}`); | |