Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Containerised Applications (Docker) and Jenkins Slave CICD

I have created a jenkins slave with work directory. I then have a maven java application with a Dockerfile.

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 sees this Dockerfile and executes it. It builds the target folder. In the target folder, I have Jacoco to show code coverage.

Jenkins slave workspace is unable to see that target folder to show Code Coverage on the Jenkins jacoco page. How can i make this visible? I tried volumes in my docker-compose file as shown

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

However, I am not able to get target folder in the workspace. How can i let jenkins slave see this jacoco code coverage?

like image 391
Ninja Dude Avatar asked Oct 15 '22 08:10

Ninja Dude


1 Answers

It looks like you have a mapped volume from /home/bob/Desktop/project/jenkins/workspace/My-Application on the slave to /app in the docker image, so normally, if you copy your jacoco reports back to /app/..., it should appear on the Jenkins Slave.

But the volume mapping only works for the first stage of you docker build process. As soon as you start your 2nd stage (after FROM openjdk:11-slim as runtime), there is no more mapped volume. So these lines copies the data to the target image's /app dir, not the original mapped directory.

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

I think you could make it work if you do this in the first stage:

RUN cp /build/target /app/target

In your second stage you probably only need the built jar file, so you only need:

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

An alternative could be to extract the data from the docker image itself after it has been bult, but that needs some command line kungfu:

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

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

like image 132
GeertPt Avatar answered Oct 18 '22 23:10

GeertPt