-
Notifications
You must be signed in to change notification settings - Fork 42
253 lines (218 loc) · 8.26 KB
/
ci.yml
File metadata and controls
253 lines (218 loc) · 8.26 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
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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
name: CI
on:
push:
branches: ["primary", "release/**"]
pull_request:
branches: ["primary"]
# CI on the "primary" branch opts out of concurrency grouping by using the run's
# unique run_id.
concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/primary' && github.run_id || github.ref }}
cancel-in-progress: true
jobs:
run-lutecli-luau-tests:
runs-on: ${{ matrix.os }}
timeout-minutes: 15
strategy:
matrix:
include:
- os: windows-latest
options: --c-compiler cl.exe --cxx-compiler cl.exe
run-on-event: all
- os: macos-latest
options: --enable-sanitizers
run-on-event: all
- os: ubuntu-latest
options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers
run-on-event: pull_request
- os: ubuntu-latest
options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers
run-on-event: pull_request
- os: ubuntu-latest
options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers
use-bootstrap: true
run-on-event: push
- os: ubuntu-latest
options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers
use-bootstrap: true
run-on-event: push
fail-fast: false
steps:
- name: Determine if this matrix job should run
id: should_run
shell: bash
run: |
if [[ "${{ matrix.run-on-event }}" == "all" || "${{ matrix.run-on-event }}" == "${{ github.event_name }}" ]]; then
echo "proceed=true" >> "$GITHUB_OUTPUT"
else
echo "proceed=false" >> "$GITHUB_OUTPUT"
fi
- uses: actions/checkout@v4
- name: Setup and Build Lute
id: build_lute
if: ${{ steps.should_run.outputs.proceed == 'true' }}
uses: ./.github/actions/setup-and-build
with:
target: Lute.CLI
config: debug
options: ${{ matrix.options }}
token: ${{ secrets.GITHUB_TOKEN }}
use-bootstrap: ${{ matrix.use-bootstrap || 'false' }}
- name: Run Luau Tests (POSIX)
if: ${{ steps.should_run.outputs.proceed == 'true' }}
run: ${{ steps.build_lute.outputs.exe_path }} test
run-lute-cxx-unittests:
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: windows-latest
options: --c-compiler cl.exe --cxx-compiler cl.exe
- os: ubuntu-latest
options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers
- os: ubuntu-latest
options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers
- os: macos-latest
options: --enable-sanitizers
fail-fast: false
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup and Build C++ Unit Tests
id: build_tests
uses: ./.github/actions/setup-and-build
with:
target: Lute.Test
config: debug
options: ${{ matrix.options }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Remove .luaurc file
run: rm .luaurc
- name: Run C++ Tests
run: ${{ steps.build_tests.outputs.exe_path }}
check-format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install tools
uses: Roblox/setup-foreman@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
allow-external-github-orgs: true
- name: Run StyLua
run: stylua --check .
build-docs-site:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup and Build Lute
id: build_lute
uses: ./.github/actions/setup-and-build
with:
target: Lute.CLI
config: debug
options: ${{ matrix.options }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Node.js
uses: actions/setup-node@v4
- name: Install dependencies
run: npm install
working-directory: docs
- name: Build docs site
run: |
export PATH="$(dirname '${{ steps.build_lute.outputs.exe_path }}'):$PATH"
npm run build
working-directory: docs
- name: Upload docs artifact
id: deployment
uses: actions/upload-pages-artifact@v3
with:
path: docs/.vitepress/dist/
lute-lint:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup and Build Lute
id: build_lute
uses: ./.github/actions/setup-and-build
with:
target: Lute.CLI
config: debug
options: ${{ matrix.options }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Run Lute Lint
run: ${{ steps.build_lute.outputs.exe_path }} lint -v . -c lint.config.luau
lute-check:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup and Build Lute
id: build_lute
uses: ./.github/actions/setup-and-build
with:
target: Lute.CLI
config: debug
token: ${{ secrets.GITHUB_TOKEN }}
- name: Run Lute Check
run: |
# @lute typechecks
${{ steps.build_lute.outputs.exe_path }} check definitions/**/*.luau
# @std and @cli commands typechecks
${{ steps.build_lute.outputs.exe_path }} check lute/**/*.luau
# @batteries typechecks
${{ steps.build_lute.outputs.exe_path }} check batteries/**/*.luau
# All tests typecheck
${{ steps.build_lute.outputs.exe_path }} check tests/**/*.test.luau
# All tools typecheck
${{ steps.build_lute.outputs.exe_path }} check tools/*.luau
# All examples typecheck
${{ steps.build_lute.outputs.exe_path }} check examples/*.luau
aggregator:
name: Gated Commits
runs-on: ubuntu-latest
needs: [run-lutecli-luau-tests, run-lute-cxx-unittests, check-format, build-docs-site, lute-lint, lute-check]
if: ${{ always() }}
steps:
- name: Aggregator
id: aggregator
run: |
if [ "${{ needs.run-lutecli-luau-tests.result }}" == "success" ] && [ "${{ needs.run-lute-cxx-unittests.result }}" == "success" ] && [ "${{ needs.check-format.result }}" == "success" ] && [ "${{ needs.build-docs-site.result }}" == "success" ] && [ "${{ needs.lute-lint.result }}" == "success" ] && [ "${{ needs.lute-check.result }}" == "success" ]; then
echo "All jobs succeeded"
echo "result=success" >> "$GITHUB_OUTPUT"
else
echo "One or more jobs failed"
echo "result=failure" >> "$GITHUB_OUTPUT"
exit 1
fi
- name: Post-aggregation notification
if: >
always() &&
github.event_name == 'push' &&
github.ref == 'refs/heads/primary'
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
run: |
LAST_STATUS=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/luau-lang/lute/actions/workflows/ci.yml/runs?branch=primary&status=completed&per_page=1" \
| jq -r '.workflow_runs[0].conclusion')
if [[ "$LAST_STATUS" == "${{ steps.aggregator.outputs.result }}" ]]; then
echo "No status change detected. Skipping notification."
exit 0
elif [[ "$LAST_STATUS" == "failure" ]]; then
TEXT=":white_check_mark: *Lute CI is passing again*"
elif [[ "$LAST_STATUS" == "success" ]]; then
TEXT=":rotating_light: *Lute CI has started failing*"
fi
echo Sending Slack notification: "$TEXT"
CHANNEL_ID="${{ secrets.SLACK_CHANNEL_ID }}"
RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
curl -sS -o /dev/null -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
--data "{
\"channel\": \"$CHANNEL_ID\",
\"text\": \"$TEXT (<$RUN_URL|view workflow run>)\"
}"