-
Notifications
You must be signed in to change notification settings - Fork 461
212 lines (189 loc) · 9.19 KB
/
pr-checks.yml
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
name: PR Checks
# Trigger the workflow on PRs to the main branch.
# It performs the following checks:
# 1. Calculate the size difference between the webview bundles of the main branch and the PR branch.
# 2. Calculate the size difference between the VSIX files of the main branch and the PR branch.
# 3. Does a check if the PR has properly localized strings.
on:
pull_request:
branches:
- main
jobs:
pr-checks:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
actions: read
issues: write
pull-requests: write
steps:
- name: Checkout main branch
uses: actions/checkout@v4
with:
ref: main
path: './main'
- name: Checkout PR branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: './pr'
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Install tools
run: |
echo "Installing Yarn"
npm install --global [email protected]
echo "Installing Gulp CLI"
npm install --global [email protected]
echo "Installing VSCE"
npm install --global [email protected]
echo "Installing gulp"
npm install --global [email protected]
- name: Install dependencies and build main extension
uses: ./pr/.github/actions/build-extension
with:
source-dir: './main'
- name: Install dependencies and build PR extension
uses: ./pr/.github/actions/build-extension
with:
source-dir: './pr'
- name: Code coverage
run: |
cd main
DISPLAY=:10 yarn test
xml_coverage_main=$(find ./coverage -name 'cobertura-coverage.xml')
line_rate_main=$(grep -m 1 -o 'line-rate="[0-9.]\+"' "$xml_coverage_main" | sed 's/line-rate="\([0-9.]*\)"/\1/')
line_rate_main=$(printf "%.2f" $(echo "$line_rate_main * 100" | bc))
echo "line_rate_main=$line_rate_main" >> $GITHUB_ENV
cd ../pr
DISPLAY=:10 yarn test
xml_coverage_pr=$(find ./coverage -name 'cobertura-coverage.xml')
line_rate_pr=$(grep -m 1 -o 'line-rate="[0-9.]\+"' "$xml_coverage_pr" | sed 's/line-rate="\([0-9.]*\)"/\1/')
line_rate_pr=$(printf "%.2f" $(echo "$line_rate_pr * 100" | bc))
echo "line_rate_pr=$line_rate_pr" >> $GITHUB_ENV
echo "line_rate_diff=$(echo "$line_rate_pr - $line_rate_main" | bc)" >> $GITHUB_ENV
coverage_text_color=$(if [ $line_rate_diff -gt 0 ]; then echo "red"; else echo "lightgreen"; fi)
echo "coverage_text_color=$coverage_text_color" >> $GITHUB_ENV
- name: Package both branches
run: |
cd main
yarn gulp package:online
cd ../pr
yarn gulp package:online
- name: Calculate webview bundle sizes
run: |
main_file=$(du -sk ./main/out/src/reactviews/assets | cut -f1)
pr_file=$(du -sk ./pr/out/src/reactviews/assets | cut -f1)
echo "Main branch bundle size: $main_file KB"
echo "PR branch bundle size: $pr_file KB"
size_diff=$((pr_file - main_file))
percentage_change=$((100 * size_diff / main_file))
echo "Size difference: $size_diff KB"
echo "Percentage change: $percentage_change%"
echo "main_webview_bundle_size=$main_file" >> $GITHUB_ENV
echo "pr_webview_bundle_size=$pr_file" >> $GITHUB_ENV
echo "webview_size_diff=$size_diff" >> $GITHUB_ENV
echo "webview_bundle_percentage_change=$percentage_change" >> $GITHUB_ENV
webview_text_color=$(if [ $percentage_change -gt 0 ]; then echo "red"; else echo "lightgreen"; fi)
echo "webview_text_color=$webview_text_color" >> $GITHUB_ENV
- name: Calculate vsix file sizes
run: |
main_vsix=$(find ./main -name "*.vsix")
pr_vsix=$(find ./pr -name "*.vsix")
main_size=$(stat -c%s "$main_vsix")
pr_size=$(stat -c%s "$pr_vsix")
main_size=$((main_size / 1024))
pr_size=$((pr_size / 1024))
size_diff=$((pr_size - main_size))
percentage_change=$((100 * size_diff / main_size))
echo "Main branch VSIX size: $main_size KB"
echo "PR branch VSIX size: $pr_size KB"
echo "Size difference: $size_diff bytes"
echo "Percentage change: $percentage_change%"
echo "main_vsix_size=$main_size" >> $GITHUB_ENV
echo "pr_vsix_size=$pr_size" >> $GITHUB_ENV
echo "vsix_size_diff=$size_diff" >> $GITHUB_ENV
echo "vsix_percentage_change=$percentage_change" >> $GITHUB_ENV
vsix_text_color=$(if [ $percentage_change -gt 0 ]; then echo "red"; else echo "lightgreen"; fi)
echo "vsix_text_color=$vsix_text_color" >> $GITHUB_ENV
- name: Write PR results to markdown
run: |
echo "### PR Changes" >> results.md
echo "| Category | Main Branch | PR Branch | Difference |" >> results.md
echo "|------------------------------|--------------------|-------------------|----------------------|" >> results.md
echo "| Code Coverage | ${{ env.line_rate_main }}% | ${{ env.line_rate_pr }}% | ${{ '\$\${\color{' }}${{ env.coverage_text_color }}} ${{ env.line_rate_diff }}\\\\% ${{ '}\$\$' }} |" >> results.md
echo "| VSIX Size | ${{ env.main_vsix_size }} KB | ${{ env.pr_vsix_size }} KB | ${{ '\$\${\color{' }}${{ env.vsix_text_color }}} ${{ env.vsix_size_diff }} KB \space (${{ env.vsix_percentage_change }}\\\\%) ${{ '}\$\$' }} |" >> results.md
echo "| Webview Bundle Size | ${{ env.main_webview_bundle_size }} KB | ${{ env.pr_webview_bundle_size }} KB | ${{ '\$\${\color{' }}${{ env.webview_text_color }}} ${{ env.webview_size_diff }} KB \space (${{ env.webview_bundle_percentage_change }}\\\\%) ${{ '}\$\$' }} |" >> results.md
- name: Find comment
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: |
### PR Changes
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
body-path: ./results.md
comment-id: ${{ steps.fc.outputs.comment-id }}
edit-mode: replace
- name: Fail if vsix size is increased by 5% or size is above 25mb
if: ${{ env.vsix_percentage_change > 5 || env.pr_vsix_size > 25000000 }}
run: exit 1
- name: Fail if bundle size is increased by 5%
if: ${{ env.webview_bundle_percentage_change > 5 }}
run: exit 1
- name: Generate xliff files in PR branch
run: |
cd pr
yarn localization
# Check if there are git changes in english xlf files
- name: Check for changes in english xlf files
run: |
cd pr
if git diff --quiet --exit-code ./localization/xliff/vscode-mssql.xlf; then
echo "Changes not found in english xlf files"
echo "loc_update_required=false" >> $GITHUB_ENV
else
echo "Changes found in english xlf files"
echo "loc_update_required=true" >> $GITHUB_ENV
fi
- name: Find comment
uses: peter-evans/find-comment@v3
id: loc-comment
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: |
# Updates to localized strings required
- name: Create or update comment
if: ${{ env.loc_update_required == 'true' }}
uses: peter-evans/create-or-update-comment@v4
with:
comment-id: ${{ steps.loc-comment.outputs.comment-id }}
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
body: |
# Updates to localized strings required
Please update the localized strings in the PR with following steps:
1. Run `yarn localization` in the PR branch.
1. Based on the changes,
* If there are changes in localized strings in source code, make sure that `src/localization/xliff/vscode-mssql.xlf` and `src/l10n/bundle.l10n.json` files are updated.
* If there are changes in localized strings in `package.nls.json`, make sure that `src/localization/xliff/vscode-mssql.xlf` is updated.
edit-mode: replace
- name: Delete comment
if: ${{ env.loc_update_required == 'false' }} && steps.loc-comment.outputs.comment-id != ''
run: |
curl -X DELETE \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/comments/${{ steps.loc-comment.outputs.comment-id }}
- name: Fail if there are changes required in english xlf files
if: ${{ env.loc_update_required == 'true' }}
run: exit 1