Jenkins 在 docker 容器中构建并生成报告

Posted

技术标签:

【中文标题】Jenkins 在 docker 容器中构建并生成报告【英文标题】:Jenkins build inside a docker container with generated reports 【发布时间】:2016-11-23 10:15:44 【问题描述】:

我是 Jenkins 和 Docker 的新手,即使经过一些研究,我也找不到做这些事情的方法。

我想:

在 docker 容器内对我的项目执行 pytest 和 python-coverage。 这应该会生成测试和覆盖率报告 使用一些 Jenkins 插件访问生成的报告并阅读它们。

当我在本地尝试使用 Docker 时,它正在工作。我创建了一个 Dockerfile,它创建了一个包含所需库和其中的源代码的 docker 映像,然后在创建容器并运行测试时调用一个脚本。我可以看到它正在工作,因为我使用了 cat 并且能够在终端中看到生成的报告。

我的问题是:如何访问 Jenkins 容器内生成的报告并在之后使用插件读取它们。

编辑:这里有一个我正在尝试做的示例,以便您有更好的想法。

首先,我的 Dockerfile 示例:

# starting from debian image
FROM debian

# install pytest and coverage to execute my tests
RUN apt-get update && apt-get install -y \
    python-pytest \
    python-coverage

# add source files to the image
ADD . /HelloPython/

WORKDIR /HelloPython/

# execute shell script which run tests
CMD sh ./compil.sh

我的 compil.sh 包含我的测试执行

# Run unit tests and generate JUnit reports in the reports directory
py.test --junitxml reports/test-results.xml test*.py

# Generate reports of the test code coverage
python-coverage run -m unittest discover
python-coverage xml -o reports/test-coverage.xml

当我使用 Cloudbees 插件运行它时,这里是我的 jenkins 日志:

Démarré par l'utilisateur chris
Building in workspace /var/lib/jenkins/workspace/HelloPythonCover
Build Docker image from ./Dockerfile ...
$ docker build --file /var/lib/jenkins/workspace/HelloPythonCover/Dockerfile /var/lib/jenkins/workspace/HelloPythonCover
Sending build context to Docker daemon 8.704 kB

Step 1 : FROM debian
 ---> 1b088884749b
Step 2 : RUN apt-get update && apt-get install -y   python-pytest   python-coverage
 ---> Using cache
 ---> a5883bbc27e4
Step 3 : ADD . /HelloPython/
 ---> c03ecb80040c
Removing intermediate container d2cc8ea14c11
Step 4 : WORKDIR /HelloPython/
 ---> Running in dc3b08c6fa02
 ---> 20f41970849c
Removing intermediate container dc3b08c6fa02
Step 5 : CMD sh ./compil.sh
 ---> Running in 14ceca0e5975
 ---> 853cb296b94f
Removing intermediate container 14ceca0e5975
Successfully built 853cb296b94f
Docker container faaedb777e032e38586278ad776e1561a9f1c5a92536c06bca7e3af12b74a355 started to host the build
$ docker exec --tty faaedb777e032e38586278ad776e1561a9f1c5a92536c06bca7e3af12b74a355 env
[HelloPythonCover] $ docker exec --tty --user 116:125 faaedb777e032e38586278ad776e1561a9f1c5a92536c06bca7e3af12b74a355 env BUILD_DISPLAY_NAME=#29 BUILD_ID=29 BUILD_NUMBER=29 BUILD_TAG=jenkins-HelloPythonCover-29 BUILD_URL=http://localhost:8080/job/HelloPythonCover/29/ CLASSPATH= EXECUTOR_NUMBER=0 HOME=/root HOSTNAME=faaedb777e03 HUDSON_HOME=/var/lib/jenkins HUDSON_SERVER_COOKIE=bd683ee6091ff880 HUDSON_URL=http://localhost:8080/ JENKINS_SERVER_COOKIE=bd683ee6091ff880 JENKINS_URL=http://localhost:8080/ JOB_NAME=HelloPythonCover JOB_URL=http://localhost:8080/job/HelloPythonCover/ NODE_LABELS=master NODE_NAME=master PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TERM=xterm WORKSPACE=/var/lib/jenkins/workspace/HelloPythonCover /bin/sh -xe /tmp/hudson6836918802627685893.sh
Stopping Docker container after build completion
Finished: SUCCESS

所以我在这里的主要目标是找到一种让 jenkins 访问生成的报告的方法。另外,有没有办法在构建时查看 docker 容器内部的情况?例如,我尝试在我的 shell 脚本中放置一个 cat 以查看报告,而我在本地尝试时,但在 Jenkins 中我找不到查看它的方法。

【问题讨论】:

您使用的是哪种构建机制?你能检查一下你的构建文件中提到的日志位置吗? 我的解释有误,我会编辑一下。事实上,我只是在我的源代码上运行 pytest 和 python-coverage 来生成有关单元测试和代码覆盖率的报告。 我建议共享卷。 你用这个plugin吗? 我使用this one。我真的不知道哪个更适合我的情况。 【参考方案1】:

Docker Plugin 或 Docker Slaves Plugin 都可以正常工作。

只需确保生成的报告采用 Jenkins 可以“理解”的 xUnit 格式,并添加一个 Post-build Action 以发布指向正确路径的测试结果,如下所示:

Jenkins 会将生成的报告复制到容器外部。

如果您的覆盖工具正在生成 html 报告,您可以使用 HTML Publisher Plugin,就像上面描述的发布步骤一样。

【讨论】:

生成的报告是JUnit格式,所以没问题。但是,我尝试使用 docker 插件,但在构建开始时,我尝试使用“py.test --junitxml reports/test-results.xml test*.py”执行我的测试,但它说它找不到文件。我尝试在 docker 映像中使用和不使用我的源,但它对两者都不起作用。 您的测试或至少在测试报告器中可能存在问题。为确保您的测试生成报告,请尝试运行一个 Shell 脚本,列出您定义的目标路径中的文件,将其作为构建步骤在发布操作部分之前执行以进行调试。 我的测试似乎工作正常。当我在本地或 jenkins 中执行它而不是在容器中时,一切都很好。我认为问题在于我无法访问容器内的内容。我需要做的“唯一”事情是访问容器内的文件,而我目前没有找到如何去做。 @Whin3 你设法让它在容器内工作吗? @whin3 好的...对我来说没问题我使用管道脚本`newApp.inside('-e NODE_ENV=test') sh 'npm install --dev' sh 'gulp test:unit' junit 'reports/*.xml'` 由于 docker 容器主存储库是与本地 jenkins 工作区的共享卷【参考方案2】:

Docker 复制(docker cp)可以将文件从容器文件系统中复制出来。有关详细信息,请参阅this page。您可以在 Jenkins 中使用此命令在构建完成后从您的容器中检索覆盖率和单元测试结果。

【讨论】:

以上是关于Jenkins 在 docker 容器中构建并生成报告的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器中安装Docker

使用jenkins自动构建docker容器范例

:详解Jenkins集成Docker私服Nexus3

jenkins容器中使用docker

Jenkins-05-Pipeline使用 Docker构建项目并构建进行推送到私有仓库 harbor

Jenkins构建Docker容器