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
|
name: CI
on:
push:
branches: [main]
permissions:
contents: write
jobs:
Check:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
item:
[
build,
clippy,
test,
markdown-code,
examples,
docs-refresh,
api-docs,
]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Configure git identity
run: |
git config --global user.email "foo@bar.sqz"
git config --global user.name "foo"
# Every check runs inside a git-lock / git-unlock pair: the final unlock
# doubles as the idempotency check, failing the job when the check left
# the working tree dirty (e.g. generated docs are out of date).
- name: Lock workspace for CI
run: cargo ci git-lock
- name: Run check
id: check
shell: bash
run: |
case "${{ matrix.item }}" in
build) cargo ci build-check ;;
clippy) cargo ci clippy-check ;;
test) cargo ci test-all ;;
# markdown-code also verifies the translated docs structure.
markdown-code) cargo ci markdown-check-all && cargo ci markdown-compare-all ;;
examples) cargo ci example-check ;;
docs-refresh)
cargo ci example-refresh
cargo ci docsify-refresh
cargo ci features-refresh
;;
api-docs) cargo ci docs-check ;;
esac
continue-on-error: true
- name: Unlock workspace (idempotency check)
if: always()
run: cargo ci git-unlock --show-diff
- name: Fail when the check failed
if: steps.check.outcome == 'failure'
run: exit 1
- name: Upload collect reports
if: always()
uses: actions/upload-artifact@v4
with:
name: ci-collect-${{ matrix.os }}-${{ matrix.item }}
path: .temp/reports/collect/
if-no-files-found: ignore
# Build the distributable packages in parallel with the checks, so that the
# `unreleased` tag and the Pages deployment always publish fresh artifacts.
Build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Compute package metadata
id: metadata
shell: bash
run: |
case "$RUNNER_OS" in
Windows) os="win" ;;
Linux) os="linux" ;;
macOS) os="mac" ;;
esac
echo "os=$os" >> "$GITHUB_OUTPUT"
- name: Install mling
shell: bash
run: |
if [ "$RUNNER_OS" = "Windows" ]; then
powershell -ExecutionPolicy Bypass -File .run/src/bin/install-mling.ps1
else
bash .run/src/bin/install-mling.sh
fi
- name: Package mling
shell: bash
run: |
mkdir -p dist
name="mling-${{ steps.metadata.outputs.os }}.tar.gz"
tar -czf "dist/$name" -C .temp/mling .
if command -v sha256sum >/dev/null 2>&1; then
(cd dist && sha256sum "$name" > "$name.sha256")
else
(cd dist && shasum -a 256 "$name" > "$name.sha256")
fi
- name: Upload mling package
uses: actions/upload-artifact@v4
with:
name: mling-${{ steps.metadata.outputs.os }}-pkg
path: dist/mling-*
if-no-files-found: error
Move-Unreleased-Tag:
if: github.ref == 'refs/heads/main'
needs: [Check, Build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- run: |
git tag -f unreleased
git push origin unreleased --force
# Collects every matrix run's reports and renders the consolidated result.md
# into the job summary. Runs even when some checks failed, so the failures
# are still reported.
Report:
needs: [Check]
if: always()
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Download collect reports
uses: actions/download-artifact@v4
with:
path: .temp/reports/collect
pattern: ci-collect-*
merge-multiple: true
- name: Generate report
run: cargo ci report-collect
- name: Publish report to step summary
run: cat .temp/reports/result.md >> "$GITHUB_STEP_SUMMARY"
Deploy-Github-Pages:
needs: [Move-Unreleased-Tag]
permissions:
contents: read
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Install nightly toolchain
run: rustup toolchain install nightly
- name: Build API docs
run: cargo +nightly run --manifest-path .run/Cargo.toml --bin deploy-api-docs -- --docsrs
- name: Install cargo-llvm-cov
run: cargo install --git https://github.com/Weicao-CatilGrass/cargo-llvm-cov cargo-llvm-cov
- name: Run cov-test
run: cargo run --manifest-path .run/Cargo.toml --bin cov-test
- name: Delete .temp directory before deployment
run: rm -rf .temp
- name: Download mling packages
uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: "."
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
|