1、
gitlab-ci.yml中构建阶段单独构建,上传到minio缓存服务,下次构建时,只需要重新拉取缓存服务器上的依赖包,增量打包构建。
.gitlab-ci.yml中配置如下:
stages:
- validate
- unit-test
- build
- package
- deploy
- .post
image: registry.cn-hangzhou.aliyuncs.com/123/maven:3-jdk-8-slim
......
build:jar:
stage: build
script:
- mvn $MAVEN_OPTS -Dmaven.test.skip=true -U package deploy
tags:
- maven
artifacts:
paths:
- manage-provider/target/manage-provider*.jar
expire_in: 1 week
only:
refs:
- tags
- master
build:image:
stage: package
image: gcr.azk8s.cn/kaniko-project/executor:debug
dependencies:
- build:jar
script:
- |
docker build $CI_PROJECT_DIR \
-t $IMAGE:$IMAGE_TAG \
-t $IMAGE:latest
- docker push $IMAGE:$IMAGE_TAG
- docker push $IMAGE:latest
tags:
- docker-builder
when: manual
allow_failure: false
only:
refs:
- tags
- master
.....
这种方式将maven项目的package和Dockerfile制作推送分成两步,好处是可以看到每次package时候的日志输出,缺点是每次打完包都要上传依赖包到缓存服务器,加长了部署时间。
2、
Dockerfile中使用多阶段构建,只取jar包,添加到镜像中,构建在服务器上。依赖存放服务器本地或者私有镜像仓库
使用多阶段构建Dockerfile
以Java Maven项目为例,在Java Maven项目中新建Dockerfile文件,并在Dockerfile文件添加以下内容。
说明 该Dockerfile文件使用了二阶段构建。
第一阶段:选择Maven基础镜像(Gradle类型也可以选择相应Gradle基础镜像)完成项目编译,拷贝源代码到基础镜像并运行RUN命令,从而构建Jar包。
第二阶段:拷贝第一阶段生成的Jar包到OpenJDK镜像中,设置CMD运行命令。
# First stage: complete build environment
FROM maven:3.5.0-jdk-8-alpine AS builder
# add pom.xml and source code
ADD ./pom.xml pom.xml
ADD ./src src/
# package jar
RUN mvn clean package
# Second stage: minimal runtime environment
From openjdk:8-jre-alpine
# copy jar from the first stage
COPY --from=builder target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jar
EXPOSE 8080
CMD ["java", "-jar", "my-app-1.0-SNAPSHOT.jar"]
这种方式将package和制作镜像,推送镜像放到了一起,省去了推送依赖包到缓存服务的时间。