Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在dockerfile和CI上运行构建和测试?_Docker_Testing_Continuous Integration - Fatal编程技术网

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

在dockerfile和CI上运行构建和测试?,docker,testing,continuous-integration,Docker,Testing,Continuous Integration,在CI上运行测试的最快方法是/gradlew test或/gradle build。它将下载所有必要的依赖项(可以以某种方式缓存在CI上),运行测试并生成工件(jar文件) 我还想建立一个码头工人的形象。我考虑的一些选择: 在CI上构建docker映像,并假设工件已经存在。这是最快的方法,但将构建过程与CI联系起来。它不能只用1个命令(docker build)手动构建 作为docker构建的一部分运行测试。在CI上,我需要更多的时间才能获得关于测试失败的信息(因为它必须下载映像、依赖项等)。

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

我还想建立一个码头工人的形象。我考虑的一些选择:

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

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

  • 默认情况下禁用/启用测试的参数化生成


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

在Dockerfile中构建要部署的应用程序。不要只包含测试依赖项、IDE、源代码管理工具或其他任何内容:只包含实际运行应用程序所需的最少内容。不要费心在
Dockerfile
中运行测试:这只是一个打包步骤,您应该在此之前运行测试

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

尽量减少“生产”和“开发人员”设置之间的差异。理想情况下,根本没有代码更改,唯一的配置更改是数据库主机名之类的内容


使用基于Docker的设置运行完整的端到端测试。这一步可能需要在Jenkins中运行Docker Compose(有点毛茸茸的)。这是一个“黑盒”测试,只与服务的UI或外部API通信。这些测试可能存在于源代码树中,也可能不存在于源代码树中,但它们并不内置于Docker容器中。在Docker空间之外启动Selenium之类的工具可能也会更容易,这可以从设置这些工具时遇到的问题数量来判断。

在Docker文件中构建要部署的应用程序。不要只包含测试依赖项、IDE、源代码管理工具或其他任何内容:只包含实际运行应用程序所需的最少内容。不要费心在
Dockerfile
中运行测试:这只是一个打包步骤,您应该在此之前运行测试

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

尽量减少“生产”和“开发人员”设置之间的差异。理想情况下,根本没有代码更改,唯一的配置更改是数据库主机名之类的内容


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

因此,您建议在CI上运行测试(以及构建为依赖于构建的测试),然后在Docker文件中没有测试的情况下再次运行构建?这是一种方法。您还可以将构建的工件注入Docker构建序列(例如,注入一个jar文件而不是源文件)。原则上,多阶段构建也可以做到这一点,但如果测试出错,则很难深入了解原因。因此,您建议在CI上运行测试(以及构建为依赖于构建的测试),然后在dockerfile中没有测试的情况下再次运行构建?这是一种方法。您还可以将构建的工件注入Docker构建序列(例如,注入一个jar文件而不是源文件)。原则上,多阶段构建也可以做到这一点,但如果测试出错,那么深入了解原因可能会很困难。