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

Run tests inside Docker container with Jenkins

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

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

  1. docker调整项目
  2. 从 git 仓库中拉取项目
  3. 以某种方式拉 docker-compose.yml 和项目 Dockerfile - 要么:
    • 放在项目仓库中
    • 将它放在单独的 repo 中(现在就是这样做的)
    • 放在服务器上的某个地方然后直接复制过来
  4. 执行docker-compose up
  5. 项目的 Dockerfile 将有 ONBUILT 部分到 运行 测试。单元测试是 运行 到 mix tests 和接受到 scripts/acceptance.sh。并行 运行 它们会很酷。
  6. 关闭docker-compose,清理容器

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

谢谢

Is this a viable strategy?

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

project's Dockerfile will have ONBUILD section to run tests

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

How to connect tests output with Jenkins?

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

How to run and shut down docker-compose?

我会推荐给 运行 撰写:

docker-compose pull # if you use images from the hub, pull the latest version
docker-compose up --build -d

在 post-build 步骤中关闭:

docker-compose down --volumes

Do we need/want to write a pipeline for that?

不,我觉得一份工作就可以了。首先通过简单的设置让它工作,然后你可以弄清楚你需要什么来拆分成不同的工作。