Step 6b #11
Workflow file for this run
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: Step 6b # Copilot on GitHub | |
| on: | |
| # Trigger if Copilot adds a review comment | |
| pull_request_review: | |
| permissions: | |
| contents: write | |
| actions: write | |
| issues: write | |
| pull-requests: read | |
| repository-projects: read | |
| jobs: | |
| find_exercise: | |
| name: Find Exercise Issue | |
| uses: skills/exercise-toolkit/.github/workflows/[email protected] | |
| check_step_work: | |
| name: Check step work | |
| runs-on: ubuntu-latest | |
| needs: [find_exercise] | |
| env: | |
| ISSUE_URL: ${{ needs.find_exercise.outputs.issue-url }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Get response templates | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: skills/response-templates | |
| path: skills-response-templates | |
| # START: Check practical exercise | |
| - name: Check for pr description and copilot review | |
| id: check-user-work | |
| run: | | |
| # Checks to perform | |
| checks='{ | |
| "pr_description": { | |
| "name": "PR Description", | |
| "passed": true, | |
| "message": "" | |
| }, | |
| "copilot_review": { | |
| "name": "Copilot Review", | |
| "passed": true, | |
| "message": "" | |
| } | |
| }' | |
| # Check if PR has a description and minimum length | |
| min_length=15 | |
| body_length=$(echo "$PR_Body" | wc -c) | |
| echo "PR description length: $body_length" | |
| if [ "$body_length" -lt $min_length ]; then | |
| checks=$(echo $checks | jq '.pr_description.passed = false') | |
| checks=$(echo $checks | jq '.pr_description.message = "Please use Copilot to generate a pull request description."') | |
| fi | |
| # Check for a PR Review from Copilot | |
| reviews=$(gh pr view --repo $REPO $PR_NUMBER --json reviews) | |
| authors=$(echo "$reviews" | jq '.reviews[].author.login') | |
| if echo "$authors" | grep -q "copilot-pull-request-reviewer"; then | |
| echo "Copilot has reviewed this PR." | |
| else | |
| echo "Copilot has NOT reviewed this PR." | |
| checks=$(echo $checks | jq '.copilot_review.passed = false') | |
| checks=$(echo $checks | jq '.copilot_review.message = "Please request a review from Copilot."') | |
| fi | |
| # Verify all checks passed | |
| passed=$(echo $checks | jq '. | all(.passed?)') | |
| # Flatten to an array for returning. Allows iteration during rendering. | |
| results=$(echo $checks | jq 'to_entries | map({name: .key} + .value)') | |
| # Save pass status to output | |
| echo "passed=$passed" >> $GITHUB_OUTPUT | |
| # Save results to output | |
| echo 'results<<EOF' >> $GITHUB_OUTPUT | |
| echo $results >> $GITHUB_OUTPUT | |
| echo 'EOF' >> $GITHUB_OUTPUT | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| PR_Body: ${{ github.event.pull_request.body }} | |
| REPO: ${{ github.repository }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| - name: Build message - step results | |
| id: build-message-step-results | |
| uses: skills/action-text-variables@v1 | |
| with: | |
| template-file: skills-response-templates/step-feedback/step-results.md | |
| template-vars: '{ | |
| "step_number": 6, | |
| "passed": ${{ steps.check-user-work.outputs.passed }}, | |
| "results_table": ${{ steps.check-user-work.outputs.results }}, | |
| "tips": [ | |
| "Copilot review will also suggest changes for common mistakes and typos.", | |
| "You can use repository rulesets to automatically require a review from Copilot." | |
| ] | |
| }' | |
| - name: Create comment - step results | |
| run: | | |
| gh issue comment "$ISSUE_URL" \ | |
| --body "$COMMENT_BODY" | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| COMMENT_BODY: ${{ steps.build-message-step-results.outputs.updated-text }} | |
| - name: Fail job if not all checks passed | |
| if: steps.check-user-work.outputs.passed == 'false' | |
| run: exit 1 | |
| # END: Check practical exercise |