feat(ci): Run Wokwi tests on PR (#9597)
* feat(ci): Run Wokwi tests on PR * fix(ci): Concurrency change to wokwi * ci(wokwi): Fix skipped tests
This commit is contained in:
parent
1299582047
commit
b59a3687c2
1 changed files with 130 additions and 0 deletions
130
.github/workflows/wokwi.yml
vendored
Normal file
130
.github/workflows/wokwi.yml
vendored
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
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 }}
|
||||
|
||||
concurrency:
|
||||
group: wokwi-${{github.event.pull_request.number || github.ref}}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
gen_chunks:
|
||||
if: github.event.workflow_run.event == 'pull_request'
|
||||
name: Generate Chunks matrix
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
chunks: ${{ steps.gen-chunks.outputs.chunks }}
|
||||
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: [gen_chunks]
|
||||
name: ${{matrix.chip}}-Wokwi_Test#${{matrix.chunks}}
|
||||
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: 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 [ -f ~/.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: wokwi-test
|
||||
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 }}';
|
||||
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}`);
|
||||
|
||||
Loading…
Reference in a new issue