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

我用工作目录创建了一个詹金斯奴隶。然后,我有了一个带有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-compose文件中尝试了卷

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代码覆盖率?

jerry8080 回答:容器化应用程序(Docker)和Jenkins从属CICD

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

Jenkins正在运行一个Docker构建,该构建将构建您的应用并在$APP_HOME/target下输出您的代码覆盖率报告,但是由于您是在Docker中构建的,因此这些文件对从属将不可用,而映像本身将不可使用。

我会考虑在Docker构建之外运行代码覆盖范围,或者您可能需要做一些黑客操作,例如运行此构建,然后将映像中的文件复制到${WORKSPACE}中,我相信您必须在其中运行它首先是一个容器,然后复制文件,然后销毁该容器。

,

似乎您已将从属服务器上的/ 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

本文链接:https://www.f2er.com/2965709.html

大家都在问