我们各个 track 的工具都以 Docker 镜像的形式部署。
每个工具都需要一个 Dockerfile,用它来说明机器是如何构建的。它应该放在你的代码仓库的根目录下,并且命名为Dockerfile。
Dockerfile 应该创建尽量精简的镜像,让工具能够正确、快速地运行。我们的最佳实践页面里有很多技巧,可以帮助你实现这个目标。
每个提交的解答都有 20 秒的时间窗口,在这段时间里测试运行器可以获得 100% 的 CPU 和 3GB 内存。超过 20 秒后,进程会被终止,并报告超时,错误码为 408。
我们强烈建议你参考我们的性能最佳实践文档,以降低超时发生的可能性。
一次工具运行最多可以产生 1 兆字节的stdout和stderr。如果超出这个上限,进程就会被终止,错误码为 413。
每次运行时stdout和stderr的内容都会保存到文件里。你可以在输出目录中写入一个results.out文件,里面包含调试信息。
目前,维护者还无法查看这些文件的内容。
结果文件不能大于 500 千字节(包括任何堆栈跟踪等)。如果文件超过这个大小,工具运行就会被终止,错误码为 460。
每个提交的解答在 20 秒的时间窗口内可以使用 100% 的机器资源。超过 20 秒后,进程会被终止,并报告为超时。
有些工具需要(略微)偏离默认配置。如果需要,就在 Tooling Invoker 代码仓库的tools.json文件中配置。
工具运行时无法访问互联网。你可以使用两种不同的配置:
none。这会禁用容器内的网络设备。internal。这会在容器内添加一个网络设备,但该网络无法访问任何外部内容。不同语言在不同配置下的表现有好有坏(例如,Ruby 用none时快 2 倍,Elixir 用internal时快12x)。
你可以在本地做实验:运行 docker 时加上--network参数。--network none默认就受支持。要使用 internal 网络,先运行docker network create --internal internal创建该网络,然后在运行容器时加上--network internal。
各语言可以设置运行作业时最多需要使用的内存。把这个值设得尽可能低,我们就能更快地并行运行更多作业。这也意味着想滥用内存的人无法得逞。不同语言需要的最大内存差别极大。我们建议你对 docker 运行做基准测试,确定它使用的最大内存,对此我们非常感激。
内存应该用带后缀的数字来指定,后缀 b、k、m、g 分别表示字节、千字节、兆字节或千兆字节。
你可以用下面这条命令测试上面的设置:
docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/
对 Dockerfile 的所有改动都需要@exercism/maintainers-admin团队进行 PR 审核,以避免引入安全漏洞。