Skip to content

Commit e73c9e5

Browse files
committed
流水线教程
1 parent 149a9a1 commit e73c9e5

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

docs/tutorials/10-appendix-2-develop.md

+88
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,91 @@ def build(backend: Literal["llvm", "pcode"]):
177177

178178
## 三、流水线
179179

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+
![workflow-result](./imgs/chapter10-2/workflow.png)
266+
267+
当然流水线所能做到的不止自动化测试,还可以实现版本发布或自动化部署等功能。由于与本教程的主题并不相关,因此不做介绍。各位同学可以自行探索。
90.3 KB
Loading

0 commit comments

Comments
 (0)