使用 Jenkins 在 Docker 容器内运行测试

les*_*ess 9 jenkins docker docker-compose

我们想尝试使用 Jenkins 为我们的项目设置 CI/CD。该项目本身使用 Elasticsearch 和 PostgreSQL 作为运行时依赖项,并使用 Webdriver 进行验收测试。在开发环境中,一切都在一个docker-compose.yml文件中设置,我们有acceptance.sh脚本来运行验收测试。

在挖掘文档后,我发现有可能通过以下步骤构建 CI:

  1. dockerize 项目
  2. 从 git repo 中拉出项目
  3. 以某种方式拉docker-compose.yml和项目Dockerfile- 要么:
    • 把它放在项目仓库中
    • 把它放在单独的 repo 中(这就是现在的做法)
    • 放在服务器上的某个地方并复制它
  4. 执行 docker-compose up
  5. 项目的 Dockerfile 将包含ONBUILT运行测试的部分。单元测试通过mix tests,验收通过scripts/acceptance.sh。并行运行它们会很酷。
  6. 关闭docker-compose,清理容器

因为这是我第一次接触 Jenkins,所以出现了一系列问题:

  • 这是一个可行的策略吗?
  • 如何将测试输出与 Jenkins 连接?
  • 如何运行和关闭 docker-compose?
  • 我们是否需要/想要为此编写一个管道?当我们进入下一阶段的 CD 时,我们是否需要/想要管道?

谢谢

dne*_*hin 6

这是一个可行的策略吗?

是的。我认为将docker-compose.yml和包含Dockerfile在项目回购中会更好。这样,任何更改都与使用更改的代码版本相关联。如果它在外部存储库中,则更改变得更加困难(除非您以某种方式固定 git sha ,例如使用子模块)。

项目的 Dockerfile 将包含ONBUILD运行测试的部分

我会避免这种情况。只需设置一个不同的命令来在容器中运行测试,而不是在构建时。

如何将测试输出与 Jenkins 连接?

Jenkins 仅使用构建步骤中的退出状态,因此只要测试脚本退出时出现非零代码失败和零代码成功,这就是您所需要的。打印到 stdout/stderr 的测试输出将在 jenkins 控制台中可见。

如何运行和关闭 docker-compose?

我会推荐这个来运行 Compose:

docker-compose pull # if you use images from the hub, pull the latest version
docker-compose up --build -d
Run Code Online (Sandbox Code Playgroud)

在关闭的构建后步骤中:

docker-compose down --volumes
Run Code Online (Sandbox Code Playgroud)

我们是否需要/想要为此编写一个管道?

不,我认为只做一份工作就可以了。首先通过简单的设置使其工作,然后您可以弄清楚需要将哪些内容拆分为不同的工作。