在写测试代码时,我们会 mock 各种外部服务(比如测转账,显然不能真的调用银行转账接口),但不会 mock 基础设施,比如 MySQL、Redis、Elasticsearch

而且跑测试用的 MySQL 等服务都是一次性的,跑完就清空数据不再需要了,所以买台服务器长期开着是不划算的。最佳实践是:测试时启动多个 Docker 后台服务。

在 CircleCI 中,启动多个 Docker image 很方便,但不支持 Dockerfile,导致 Dockerfileconfig.yml 重复,违反 DRY。

在 Jenkins 中也可以实现,而且更强大(支持 Dockerfile)。

查看 Jenkins 官方文档,发现 sidecar 嵌套支持2个 Docker,如果更多会导致嵌套太深难以维护(比如 MySQL、Redis 作为服务,debian 跑 tests);而且用了 link,已被 Docker 官方淘汰:

Warning: The –link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using –link.

按照 Docker 官方推荐,创建一个 network 即可。关键在于等待启动成功,代码如下(完整代码):

已在 coding.net 持续集成(免费的 Jenkins 云服务)中运行成功,截图:

CODING 持续集成