CI/CD流水线创建方法?( 三 )
假设现在运行测试需要从源代码获取测试用例 。 在原始代码中 , 我们只需使用: src将测试图像更改为测试图像 。 在arrow版本中 , 我们需要在生成步骤之前复制源代码 , 使用带dockerfile的firstbuild_运行生成 , 并确保参数是新测试使用的正确方法 。
Dart方法
我开始怀疑是否有一种更简单的方法来实现与箭头相同的静态分析 , 但是没有无点语法 , 而且似乎有 。 考虑示例1的一元版本 。 我们有:
valbuild:source->imagepromisevaltest:image->resultspromiseletexample1commit=let* src=https://pcff.toutiao.jxnews.com.cn/p/20210218/fetchcommitinlet*image=build srcintestimage如果你不知道蒙娜兹的事 , 你还有别的办法 。 您可以定义build和test , 将promises作为输入 , 而不是使用let*等待获取完成 , 然后使用源调用build:
valbuild:sourcepromise->imagepromisevaltest:imagepromise->resultspromise毕竟 , fetching给了你一个源代码承诺 , 你想要一个图像承诺 , 所以这看起来很自然 。 我们甚至可以以承诺为例 。 然后看起来是这样的:
letexample1commit=let src=https://pcff.toutiao.jxnews.com.cn/p/20210218/fetchcommitinletimage=build srcintestimage很好 , 因为它和我们刚开始的简单版本是一样的 。 问题是效率低下:
我们用承诺的方式调用example1(我们还不知道它是什么) 。 我们不必等待找出要测试的提交 , 而是调用fetch , 获取某个源的承诺 。 不需要等待获取源代码 , 我们就调用build , 获取图像的承诺 。 不用等待构建 , 我们调用test , 得到结果的承诺 。我们立即返回测试结果的最终承诺 , 但我们还没有做任何真正的工作 。 相反 , 我们建立了一长串的承诺 , 浪费了记忆 。
但是 , 在这种情况下 , 我们希望执行静态分析 。 i、我们想在内存中建立一些表示流水线的数据结构……这正是我们对monad的“低效”使用所产生的结果!
为了使其有用 , 我们需要基本操作(比如fetch)来为静态分析提供一些信息(比如标签) 。 OCaml的let语法没有为标签提供明显的位置 , 但是我能够定义一个运算符(let**) , 该运算符返回一个接受label参数的函数 。 它可用于生成如下基本操作:
letfetchcommit=''fetch''|>let**commit=commitin(*(standardmonadicimplementationoffetchgoeshere)*)因此 , fetch接受一个提交的承诺 , 对它执行一个单字节绑定以等待实际的提交 , 然后像以前一样继续 , 但它将绑定标记为一个fetch操作 。 如果fetch包含多个参数 , 则可以使用and*并行等待所有参数 。
理论上 , let**Infetch的主体可以包含进一步的绑定 。 如果那样的话 , 我们在一开始就无法分析整个管道 。 但是 , 只要原语在开始时等待所有输入 , 并且不在内部进行任何绑定 , 我们就可以静态地发现整个管道 。
我们可以选择是否将这些绑定操作公开给应用程序代码 。 如果let*(或let**)被公开 , 那么应用程序就可以使用monad的所有表达能力 , 但是在某些承诺解决之前 , 我们将无法显示整个管道 。 如果我们隐藏它们 , 那么应用程序只能生成静态管道 。
到目前为止 , 我的方法是使用let*作为逃生舱口 , 这样就可以建造任何所需的管道 , 但我后来用更专业的操作来代替它的任何用途 。 例如 , 我添加了:
vallist_map:('at->'bt)->'alistt->'blistt这将处理运行时才知道的列表中的每个项 。 然而 , 我们仍然可以静态地知道我们将应用于每个项的管道 , 即使我们不知道项本身是什么 。 list_map本来可以使用let*实现 , 但这样我们就无法静态地看到管道 。
下面是另外两个使用dart方法的示例:
letexample2commit=let src=https://pcff.toutiao.jxnews.com.cn/p/20210218/fetchcommitinletbase=docker_pull''ocaml/opam2''inletbuildocaml_version=letdockerfile=let+base=baseinmake_dockerfile~base~ocaml_versioninletimage=build~dockerfile src~label:ocaml_versionintestimageinall[build''4.07'';build''4.08'']与原来相比 , 我们有一个all来合并结果 , 并且在计算dockerfile时有一个额外的let+base=base 。 let+只是map的另一种语法 , 在这里使用 , 因为我选择不更改make_dockerfile的签名 。 或者 , 我们可以让你的dockerfile接受一个基本图像的承诺 , 并在里面做地图 。 因为map需要一个纯实体(make_dockerfile只生成一个字符串;没有承诺或错误) , 所以它不需要在图表上有自己的框 , 并且我们不会因为允许使用它而丢失任何东西 。
letexample3commit=let src=https://pcff.toutiao.jxnews.com.cn/p/20210218/fetchcommitinletimage=build srcinletok=testimageinletrevdeps=get_revdeps srcingaterevdeps~on:ok|>list_iter~pp:Fmt.stringexample1这显示了另一个自定义操作:gaterevdeps~on:ok是一个承诺 , 只有在revdeps和ok都解决后才能解决 。 这将阻止它在库自己的测试通过之前测试库的revdeps , 即使如果我们希望它可以并行地这样做 。 而对于monad , 我们必须在需要的地方显式地启用并发(使用和*) , 而对于dart , 我们必须在不需要的地方显式地禁用并发(使用gate) 。
- 老年|德兴市境内山水如画,被评为“中国天然氧吧”创建地区
- 为欧洲MaaS模型创建功能基础
- 基于串联充放电的锂动力电池单体一致性筛选方法
- 原神胡桃武器应该选择方法 胡桃武器应该怎么选择
- 奇迹暖暖云海拾珍/薄荷蜜旅套装怎么获得 获取方法分享
- 小白鞋用什么东西能洗白?这几个方法效果不错哦
- 春花生要想根系好,换一个方法种植,长势变化很明显
- 妄想山海新手入门指南 宠物寿命恢复方法
- 今日头像丨开心100%的方法
- 莴笋高产的种植方法,农民掌握以下要点,收获高产优质的莴笋
