ThomasLeonard策划
田晓旭本文将用三种方法来创建CI/CD流水线。Monad不能对流水线进行静态分析,Arrow语法很难用,我称之为Dart(不知道它是否已经有名字了)的一种轻量级的Arrow方法可以像Arrow一样进行静态分析,但语法比Monad更简单。
我需要构建一个用于创建CI/CD流水线的系统。它起初是为了构建一个CI系统,测试Github上的OCaml项目(针对多个版本的OCaml编译器和多个操作系统,测试每个提交)。下面是一个简单的流水线,获取某个Git分支最新的提交,构建,并执行测试用例。
CI/CD:持续集成(ContinuousIntegration)和持续部署(ContinuousDeployment)简称,指在开发过程中自动执行一系列脚本来减低开发引入bug的概率,在新代码从开发到部署的过程中,尽量减少人工的介入。
这里的配色标识是:绿色的方框是已经完成,橙色的是正在进行,灰色的意味着这一步还不能开始。
这里有一个稍微复杂点的例子,它还下载了一个Docker基础镜像,使用两个不同版本的OCaml编译器并行构建提交,然后测试得到的镜像。红框表示此步骤失败:
一个更复杂的例子是测试项目本身,然后搜索依赖它的其他项目,并根据新版本测试这些项目:
在这里,圆圈意味着在检查反向依赖项之前,我们应该等待测试通过。
我们可以用YAML或类似的方法来描述这些管道,但这将是非常有限的。相反,我决定使用一种特定于领域的嵌入式语言,这样我们就可以免费使用宿主语言的特性(例如字符串操作、变量、函数、导入、类型检查等)。
最明显的方法是使每个框成为正则函数。然后上面的第一个例子可以是(这里,使用OCaml语法):
letexample1