【问题标题】:Containerised Applications (Docker) and Jenkins Slave CICD容器化应用程序 (Docker) 和 Jenkins Slave CICD
【发布时间】:2019-12-06 03:00:21
【问题描述】:

我创建了一个带有工作目录的詹金斯奴隶。然后我有一个带有 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 slave 看到这个 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 slave 看到这个 jacoco 代码覆盖率?

【问题讨论】:

    标签: docker jenkins docker-compose continuous-integration jacoco


    【解决方案1】:

    看起来你有一个从 /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
    

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

    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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-07-18
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 2019-11-06
        • 1970-01-01
        相关资源
        最近更新 更多