-
Notifications
You must be signed in to change notification settings - Fork 523
149 lines (127 loc) · 4.82 KB
/
4b-copilot-on-github.yml
File metadata and controls
149 lines (127 loc) · 4.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
name: Step 4b # Copilot on GitHub
on:
# Trigger if PR Description is edited
# pull_request:
# branches:
# - main
# types:
# - edited
# 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:
if: |
!github.event.repository.is_template
name: Find exercise by issue title
runs-on: ubuntu-latest
outputs:
issue-url: ${{ steps.get-issue-url.outputs.ISSUE_URL }}
steps:
- id: get-issue-url
run: |
# Get the issue url from the event or search for it.
if [ -n "${{ github.event.issue }}" ]; then
issue_url="${{ github.event.issue.html_url }}"
else
issue_url=$(gh issue list --repo $REPO --search "in:title Exercise:" --json url,title --jq '.[].url')
fi
# Save to output
echo "ISSUE_URL=$issue_url" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
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 decription 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": 4,
"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