name: Write test failure comment on: workflow_run: workflows: [🧪 QGIS tests] types: - completed permissions: contents: read jobs: on-failure: strategy: matrix: qt-version: [ 5, 6 ] permissions: pull-requests: write runs-on: ubuntu-latest steps: - name: 'Download artifact' id: download_artifact uses: actions/github-script@v7 with: script: | let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.payload.workflow_run.id, }); let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => { return artifact.name == "test-results-qt${{ matrix.qt-version }}" }); if (matchArtifacts.length>0) { let download = await github.rest.actions.downloadArtifact({ owner: context.repo.owner, repo: context.repo.repo, artifact_id: matchArtifacts[0].id, archive_format: 'zip', }); let fs = require('fs'); fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/test-results-qt${{ matrix.qt-version }}.zip`, Buffer.from(download.data)); core.setOutput('artifact_id', matchArtifacts[0].id); } else { core.setOutput('artifact_id', 0); } - name: 'Unzip artifact' if: fromJSON(steps.download_artifact.outputs.artifact_id) > 0 run: unzip -j test-results-qt${{ matrix.qt-version }}.zip *.md pr_number git_commit || ( e=$? && if [ $e -ne 11 ]; then exit $e; fi ) - name: 'Post test report markdown summary as comment on PR' if: fromJSON(steps.download_artifact.outputs.artifact_id) > 0 uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | let fs = require('fs'); if (fs.existsSync('./summary.md')) { const issue_number = Number(fs.readFileSync('./pr_number')); const git_sha = String(fs.readFileSync('./git_commit')).trim(); const prComments = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue_number, }); const PREFIX = "# Tests failed for Qt ${{ matrix.qt-version }}"; let body = PREFIX + "\n\n"; body += "*One or more tests failed using the build from commit " + git_sha + "*\n\n"; body += String(fs.readFileSync('./summary.md')) + "\n\n**The full test report (included comparison of rendered vs expected images) can be found [here](https://github.com/qgis/QGIS/suites/" + context.payload.workflow_run.check_suite_id + "/artifacts/${{steps.download_artifact.outputs.artifact_id}}).**\n\n" + "Further documentation on the QGIS test infrastructure can be found in the [Developer's Guide](https://docs.qgis.org/latest/en/docs/developers_guide/unittesting.html)."; const failureComment = prComments.data?.find(c => c.body.startsWith(PREFIX)); if (!!failureComment) { // update the existing comment await github.rest.issues.updateComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: failureComment.id, body: body }); } else { // submit a new comment await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue_number, body: body }); } }