【发布时间】:2021-10-06 07:29:19
【问题描述】:
我找到了定义(见下文)以及它们通常如何使用(即 Hydra 作业集正在跟踪 git 分支),但我仍然无法弄清楚它们在一般意义上是什么。也许你能用具体的例子来解释它的外行术语?
-
Eelco Dolstra, Eelco Visser: "Hydra: A Declarative Approach to Continuous Integration"
Nix 表达式位置的规范,以及 Nix 表达式定义的作业的函数参数的可能值。
-
工作集
将要运行的作业列表。 Jobset 通常适合某个分支(master、staging、stable)。作业集由其输入定义,如果这些输入发生变化,将触发,例如就像添加到分支上的新提交一样。作业集可能相互依赖
-
3.2 作业集
一个项目可以包含多个作业集(以下简称作业集),可以单独构建的独立任务,但可能相互依赖(当然没有循环依赖)。
列出所有这些定义后,我的问题似乎毫无意义,但这里有一个例子来证明我的困惑:我查看了https://hydra.nixos.org/ 的项目列表,我的印象是项目是一个渠道,而工作集是回购中的分支。 (我知道,那里没有提到“频道”,在频道页面上甚至说"Nix channels are not supported by this Hydra server." :) 在查看Hydra project 时,我可以自欺欺人,但是当我单击flakes one 时,这个论点就崩溃了(也就是说,找不到支持的 github 存储库,但通常作业集名称不像分支名字)。
此外,在 Dolstra/Visser 论文中,Hydra 是使用 SVN 设置的;我不知道 SVN 是否甚至使用分支(主要是因为论文没有提到它们),但这确实证明了 Hydra 可以使用 VCS/SCM 而不是 git 设置,其中底层概念可能根本不同。同样,我很容易出错。
【问题讨论】:
-
作业集实际上指定了一组表达式,以根据回购的内容进行评估。将 -small 频道与大频道进行比较;唯一的区别是在晋升之前需要成功完成的作业集的大小。
-
并非可能从频道构建的所有内容实际上都是由 Hydra 构建的(请记住,nixpkgs 包含像
muslPkgs这样的东西,它本身包含 所有 nixpkgs ,但针对 musl libc 而不是 glibc 编译;同样,如果我们查看总可寻址空间,它包括过时的包,例如python38Packages,它们不再默认构建二进制文件——因为当前的默认值是3.9 - 但仍然可供真正需要它们使用的人使用)。 由 Hydra 构建的子集由作业集定义。 -
顺便说一句,svn 用户调用分支与 git 调用分支不同。实际上,SVN 存储库是一棵巨大的树,客户端只需要检出其中的一个子集,因此在 SVN 中,
/projects/foobar/trunk和/projects/foobar/branches/1.2.x可能是该总体树的两个部分,因此创建一个 1.3.x 分支离开主干看起来像svn cp https://svn.example.com/projects/foo/trunk https://svn.example.com/projects/foo/branches/1.3.x,标记 1.3.1 可能是svn cp "$root/projects/foo/branches/1.3.x" "$root/projects/foo/tags/1.3.1" -
...所以在 svn 世界中,修订控制系统只是提供了一个大版本的文件系统,而“分支”和“标签”是用户提供的语义分层。不过,上面的(re: svn details)只是一个旁白;与这里的问题没有特别的相关性。
-
(旁白:如果 git 输掉了争夺 DSCM 霸权的战争,我是少数认为世界会变得更好的人;如果技术社区再花几年时间就可以团结起来一个单一的版本控制系统, 该系统可能最终成为 Mercurial 或 Bazaar, 我们不会有破坏性的强制推送工作流之类的可恶. 这没有发生, 因为 git 是第一个在规模上具有良好性能的系统,当其他人赶上时已经太晚了)