在dockerfile和CI上运行构建和测试?

时间:2019-02-28 15:34:39

标签: docker testing continuous-integration

在CI上运行测试的最快方法是./gradlew test./gradle build。它将下载所有必要的依赖项(可以某种方式缓存在CI上),运行测试并生成工件(jar文件)

我也想构建一个docker镜像。我考虑过的一些选择:

  • 在CI上构建docker映像,并假设工件已经存在。这是最快的方法,但是将构建过程与CI绑定在一起。它不能只是使用1个命令(docker build)手动构建

  • 作为Docker构建的一部分运行测试。在CI上,我需要花费更多时间才能获得有关失败测试的信息(因为它必须下载映像,依赖项等)。但它允许在本地轻松构建docker(可能很少使用的功能,但对本地docker-compose进行测试很有用)

  • 参数化构建以默认情况下禁用/启用测试

处理这些要求的标准方法是什么?任何最佳做法?

1 个答案:

答案 0 :(得分:0)

构建要在Dockerfile中部署的应用程序。不包括仅测试依赖项,IDE,源代码控制工具或其他任何东西:仅包括实际运行应用程序所需的最少内容,仅此而已。不必费心尝试在Dockerfile中运行测试:这只是打包步骤,您应该在此之前运行测试。

编写良好的本地测试(例如,在Java领域使用JUnit),并确保它们通过。如果您需要同时依赖于代码详细信息和外部服务的“白盒”集成测试,请在本地或在您的CI系统中但不在Docker外部运行它们。

最小化“生产”和“开发人员”设置之间的差异。理想情况下,根本没有代码更改,唯一的配置更改是诸如数据库主机名之类的东西。

使用基于Docker的设置运行完整的端到端测试。此步骤可能涉及在Jenkins中运行Docker Compose(有点毛)。这是一个“黑匣子”测试,仅与服务的UI或外部API通信。这些测试可能存在也可能不存在于源代码树中,但它们并未内置在Docker容器中。从关于设置的SO问题的数量来看,在Docker空间之外启动Selenium之类的工具也可能会更容易。