容器化应用程序(Docker)和Jenkins Slave CICD



我创建了一个带有工作目录的 jenkins 奴隶。然后我有一个带有Dockerfile的maven java应用程序。

Dockerfile

#### BUILD image ###
FROM maven:3-jdk-11 as builder
RUN mkdir -p /build
WORKDIR /build
COPY pom.xml /build
RUN mvn -B dependency:resolve dependency:resolve-plugins
COPY /src /build/src
RUN mvn package
### RUN ###
FROM openjdk:11-slim as runtime
EXPOSE 8080
ENV APP_HOME /app
ENV JAVA_OPTS=""
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/config
RUN mkdir $APP_HOME/log
RUN mkdir $APP_HOME/src
VOLUME $APP_HOME/log
VOLUME $APP_HOME/config
WORKDIR $APP_HOME
COPY --from=builder /build/src  $APP_HOME/src
COPY --from=builder /build/target $APP_HOME/target
COPY --from=builder /build/target/*.jar app.jar
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar" ]

Jenkins 奴隶看到这个 Dockerfile 并执行它。它构建目标文件夹。在目标文件夹中,我有 Jacoco 来显示代码覆盖率。

Jenkins从属工作区无法在 Jenkins jacoco 页面上看到该目标文件夹以显示代码覆盖率。如何使其可见?我尝试了 docker 撰写文件中的卷,如下所示

docker-compose.yml

version: '3'
services:
my-application-service:
image: 'my-application-image:v1.0'
build: .
container_name: my-application-container
ports:
- 8090:8090
volumes:
- /home/bob/Desktop/project/jenkins/workspace/My-Application:/app

但是,我无法在工作区中获取目标文件夹。我怎样才能让 Jenkins 奴隶看到这个 jacoco 代码覆盖率?

看起来你有一个从属的/home/bob/Desktop/project/jenkins/workspace/My-Application 映射到 docker 镜像中的/app 的卷,所以通常情况下,如果你将 jacoco 报告复制回/app/...,它应该出现在 Jenkins Slave 上。

但是卷映射仅适用于 docker 构建过程的第一阶段。一旦您开始第二阶段(FROM openjdk:11-slim as runtime之后(,就不再有映射的体积。因此,这些行将数据复制到目标图像的/app 目录,而不是原始映射目录。

COPY --from=builder /build/src  $APP_HOME/src
COPY --from=builder /build/target $APP_HOME/target

我认为如果你在第一阶段这样做,你可以让它工作:

RUN cp /build/target /app/target

在第二阶段,您可能只需要构建的 jar 文件,因此您只需要:

COPY --from=builder /build/target/*.jar app.jar

另一种方法是在 bult 之后从 docker 镜像本身中提取数据,但这需要一些命令行功夫:

docker cp $(docker ps -a -f "label=image=$IMAGE" -f "label=build=$BUILDNR" -f "status=exited" --format "{{.ID}}"):/app/target .

另请参阅 https://medium.com/@cyril.delmas/how-to-keep-the-build-reports-with-a-docker-multi-stage-build-on-jenkins-507200f4007f

如果我理解正确,您希望从您的 Jenkins 奴隶中看到$APP_HOME/target的内容?如果是这样,您可能需要重新考虑您的方法。

Jenkins 正在运行一个 Docker 构建,该构建构建您的应用程序并在$APP_HOME/target下输出您的代码覆盖率报告,但是由于您是在 Docker 中构建它,这些文件将不适用于从属服务器,而是图像本身。

我会考虑在 Docker 构建之外运行代码覆盖率,或者您可能必须做一些像运行此构建这样的黑客操作,并将文件从映像复制到您的${WORKSPACE}我相信您必须首先在容器中运行它,然后复制文件并销毁容器。

最新更新