@@ -177,3 +177,91 @@ def build(backend: Literal["llvm", "pcode"]):
177
177
178
178
## 三、流水线
179
179
180
+ 尽管我们通过脚本自动化了项目的测试过程。但脚本的执行依旧需要我们手动触发。像测试、发布、部署这样的操作,本应当随着项目的演进而随时进行。为了实现这一点,我们在 tolangc 中使用 Github Action 配置了一组 CI 流水线,每当向 PR 或 master 分支中推送提交时,便会运行该流水线,自动对代码进行测试。
181
+
182
+ 我们的流水线配置位于 ` .github/workflows ` 中。类似于一个在满足条件时自动触发的脚本。配置文件中较为关键的包括如下几个部分。
183
+
184
+ 首先是触发流水线的条件。对应配置中的 ` on ` 字段。在我们的例子中,触发流水线的条件是更新目标为 master 的 PR 以及向 mater 分支推送。每当仓库中出现此类事件,便会触发该流水线的执行。
185
+
186
+ ``` yml
187
+ # pr-check.yml
188
+ on :
189
+ push :
190
+ branches : [ "master" ]
191
+ pull_request :
192
+ branches : [ "master" ]
193
+ ` ` `
194
+
195
+ 接下来是 ` jobs` 字段,用于定义流水线中运行的任务。在这里我们定义了两个任务 `build` 和 `test`。前者用于验证构建过程的正确性并进行单元测试,后者则用于运行集成测试。任务之间可以设定依赖关系,例如这里我们使 `test` 任务依赖于 `build`。这样若 `build` 任务出现了问题,便不会再运行 `test` 任务。
196
+
197
+ ` ` ` yml
198
+ jobs:
199
+ build:
200
+ # ...
201
+
202
+ test:
203
+ needs: build
204
+ # ...
205
+ ` ` `
206
+
207
+ 在任务内部,我们需要设定任务的运行环境 `runs-on`,每一步的执行操作 `steps`,也可以设置任务的运行策略 `strategy`。
208
+
209
+ 运行环境指任务运行所处的操作系统环境。在这里是 `ubuntu-latest`。
210
+
211
+ ` ` ` yml
212
+ build:
213
+ runs-on: ubuntu-latest
214
+ ` ` `
215
+
216
+ 在运行环境中,我们可以像脚本一样运行一系列命令,或是使用其他人编写好的 Action 应用执行某些操作。例如在 `build` 任务中,我们执行了 `bash ...` 和 `ctest ...` 两条命令。
217
+
218
+ ` ` ` yml
219
+ jobs:
220
+ build:
221
+ # ...
222
+
223
+ steps:
224
+ - uses: actions/checkout@v4
225
+
226
+ - name: Build
227
+ env:
228
+ BUILD_TYPE: ${{env.BUILD_TYPE}}
229
+ run: bash ./scripts/build.sh ${{matrix.backend}}
230
+
231
+ - name: Unit test
232
+ working-directory: ${{github.workspace}}/build
233
+ run: ctest -C ${{env.BUILD_TYPE}}
234
+ ` ` `
235
+
236
+ Action 是其他人封装好的操作。例如在配置中我们使用了 `KyleMayes/install-llvm-action@v2` 用于在运行环境中安装 llvm。
237
+
238
+ ` ` ` yml
239
+ - name: Install llvm
240
+ if: matrix.stage == 'llvm'
241
+ uses: KyleMayes/install-llvm-action@v2
242
+ with:
243
+ version: "16.0"
244
+ ` ` `
245
+
246
+ 通过设置 `matrix` 策略,我们可以并行执行一系列不同相近但配置有所不同的任务。例如在 tolangc 中我们有着 llvm 和 pcode 两个后端。通过 matrix 我们可以同时对这两种后端进行测试。如下图,在 Build 步骤中,我们使用了 `matrix` 中定义的 `matrix.backend`。根据当前 `backend` 的取值不同采用不同的构建方式。
247
+
248
+ ` ` ` yml
249
+ jobs:
250
+ build:
251
+ strategy:
252
+ matrix:
253
+ backend: [ "llvm", "pcode" ]
254
+
255
+ # ...
256
+
257
+ - name: Build
258
+ env:
259
+ BUILD_TYPE: ${{env.BUILD_TYPE}}
260
+ run: bash ./scripts/build.sh ${{matrix.backend}}
261
+ ` ` `
262
+
263
+ 配置完成之后,当满足流水线的触发条件时,流水线便会自行运行,实现项目的自动化测试。
264
+
265
+ 
266
+
267
+ 当然流水线所能做到的不止自动化测试,还可以实现版本发布或自动化部署等功能。由于与本教程的主题并不相关,因此不做介绍。各位同学可以自行探索。
0 commit comments