PR Comment on YAML Check #627
This file contains hidden or 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: PR Comment on YAML Check | |
| on: | |
| workflow_run: | |
| workflows: ["Test YAML"] | |
| types: [completed] | |
| permissions: | |
| pull-requests: write | |
| actions: read | |
| jobs: | |
| comment: | |
| runs-on: ubuntu-latest | |
| if: >- | |
| github.event.workflow_run.conclusion == 'failure' && | |
| (github.event.workflow_run.pull_requests[0] || startsWith(github.event.workflow_run.head_branch, 'pull-request/')) | |
| steps: | |
| - name: Download PR comment data | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: pr-comment-data | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| run-id: ${{ github.event.workflow_run.id }} | |
| - name: Post comment on PR | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const fs = require('fs'); | |
| const pullRequests = context.payload.workflow_run.pull_requests; | |
| let prNumber; | |
| if (pullRequests && pullRequests.length > 0) { | |
| prNumber = pullRequests[0].number; | |
| } else { | |
| try { | |
| prNumber = parseInt(fs.readFileSync('pr_number', 'utf8').trim()); | |
| } catch (e) { | |
| console.log('No PR number found, skipping comment.'); | |
| return; | |
| } | |
| } | |
| if (!prNumber || isNaN(prNumber)) { | |
| console.log('No valid PR number found, skipping comment.'); | |
| return; | |
| } | |
| const runUrl = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${{ github.event.workflow_run.id }}`; | |
| let errorDetails = ''; | |
| try { | |
| const raw = fs.readFileSync('error_output', 'utf8').trim(); | |
| if (raw) { | |
| errorDetails = raw.length > 30000 ? raw.substring(0, 30000) + '\n\n... (truncated)' : raw; | |
| } | |
| } catch (e) {} | |
| const detailsSection = errorDetails | |
| ? `\n<details>\n<summary>YAML lint errors</summary>\n\n\`\`\`\n${errorDetails}\n\`\`\`\n\n</details>\n` | |
| : ''; | |
| const commentBody = ` | |
| ## ❌ YAML Check Failed | |
| 🔗 [View workflow run logs](${runUrl}) | |
| ${detailsSection} | |
| ### How to fix: | |
| \`\`\`bash | |
| pip install yamllint | |
| yamllint -d "{rules: {line-length: disable}}" . | |
| \`\`\` | |
| 📚 [yamllint documentation](https://yamllint.readthedocs.io/) | |
| `.replace(/^ {12}/gm, '').trim(); | |
| const { data: comments } = await github.rest.issues.listComments({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber | |
| }); | |
| const botComment = comments.find(comment => | |
| comment.user.type === 'Bot' && | |
| comment.body.includes('YAML Check Failed') | |
| ); | |
| if (botComment) { | |
| // Update existing comment | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: botComment.id, | |
| body: commentBody | |
| }); | |
| console.log(`Updated existing comment on PR #${prNumber}`); | |
| } else { | |
| // Create new comment | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| body: commentBody | |
| }); | |
| console.log(`Created comment on PR #${prNumber}`); | |
| } |