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

11
我们想要尝试使用Jenkins为我们的项目设置CI/CD。该项目本身具有Elasticsearch和PostgreSQL作为运行时依赖项,以及Webdriver用于验收测试。
在开发环境中,一切都在一个docker-compose.yml文件中设置,并且我们有acceptance.sh脚本来运行验收测试。
在查阅文档后,我发现可以通过以下步骤构建CI:
1. 将项目docker化 2. 从git仓库拉取项目 3. 以某种方式拉取docker-compose.yml和项目Dockerfile - 可以将其放在项目存储库中,也可以将其放在单独的存储库中(目前是这样做的),或者将其放在服务器上并复制它们 4. 执行docker-compose up 5. 项目的Dockerfile将有ONBUILT部分来运行测试。单元测试通过mix tests运行,验收测试通过scripts/acceptance.sh运行。最好同时运行它们。 6. 关闭docker-compose,清除容器
因为这是我的第一次使用Jenkins的经验,所以会出现一系列问题:
- 这是可行的策略吗? - 如何将测试输出与Jenkins连接起来? - 如何运行和关闭docker-compose? - 我们需要/希望为此编写管道吗?当我们到达下一个阶段的CD时,我们是否需要/希望管道?
谢谢

是的,这是一种可行的策略。但是它需要在Docker中运行Docker,这是一项相当高级的技术。您可以在此处找到更多信息:Docker book https://www.dockerbook.com。 - Miad Abrin
嗨Miad!谢谢你的推荐,我一定会看这本书的! 也许这个插件可以帮助处理Docker https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/chapter-docker-workflow.html? - lessless
还没有检查过,也许值得一试。 - Miad Abrin
1个回答

7
这是一种可行的策略。我认为最好将docker-compose.ymlDockerfile包含在项目仓库中。这样,任何更改都与使用更改的代码版本相关联。如果它在外部仓库中,更改变得更加困难(除非您以某种方式固定git sha,例如使用子模块)。
我建议避免这样做。只需设置一个不同的命令在容器中运行测试,而不是在构建时运行。
Jenkins只是使用构建步骤的退出状态,因此只要测试脚本在失败时退出非零代码,在成功时退出零代码,那么你所需要的就是这些。打印到stdout/stderr的测试输出将从jenkins控制台可见。
我建议使用以下命令来运行Compose:
docker-compose pull # if you use images from the hub, pull the latest version
docker-compose up --build -d

在构建完成后的一个步骤中关闭:

docker-compose down --volumes

我们需要/想要为此编写一个流水线吗?

不需要,我认为只需要一个单一的任务就可以。先用简单的设置让它运行起来,然后你可以确定需要将哪些部分拆分成不同的任务。


Jenkins只是使用构建步骤的退出状态,因此只要测试脚本在失败时以非零代码退出,在成功时以零代码退出,那就是你所需要的全部。打印到stdout/stderr的测试输出将从jenkins控制台可见。我遇到了一个问题,即运行测试的副作用是创建了一个xml文件,但它在容器内部,需要将其取出。我尝试将其创建的目录挂载到jenkins工作区,但似乎没有出现。这里有什么想法吗? - Cruncher
我建议使用 docker cp 命令来将文件取出。 - dnephin
但是在docker run完成后,容器不再运行 - Cruncher
这正是我们使用docker cp的方式。测试输出(报告或任何内容)甚至可以从已停止的容器中复制。 因此,首先在容器内运行测试,然后使用docker cp将测试结果拷贝到主机上的一个位置,并最终执行docker-compose down以清除所有内容。 还有一件非常重要的事情:请使用非root用户在你的Dockerfile中,否则从测试容器创建的XML文件将拥有root作为所有者,这意味着Jenkins无法删除它。 - Yorgos Katsaros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接