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

标签 docker jenkins docker-compose continuous-integration jacoco

我创建了一个带有工作目录的 jenkins slave。然后我有一个带有 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 代码覆盖率?

最佳答案

看起来你有一个从/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 镜像生成后从 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

关于docker - 容器化应用程序 (Docker) 和 Jenkins Slave CICD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206231/

相关文章:

docker - Docker支持Visual Studio 2017失败

linux - 从 Docker 容器内部杀死子进程会杀死整个容器

docker - 从容器访问本地主机网络而不暴露任何端口?

docker - 来自多阶段Dockerfile的`npm build`和`COPY --from`失败,并且`COPY失败:stat/mnt/data/docker/overlay2/xxxxx/merged/app/build

windows - 如果上一次执行失败,如何执行下一个批处理窗口命令?

jenkins - 使用 hudson 的管道插件获取内联管道脚本中的当前时间戳

jenkins - 修改 jenkins master 中的 PATH 变量

docker - Go App无法通过docker-compose中的websocket连接

docker - Tensorflow服务Docker镜像安装错误curl:(56)GnuTLS recv错误(-54):pull函数错误

Python scrapy+selenium scraper docker build 报错(错误码100)