1、
gitlab-ci.yml中构建阶段单独构建,上传到minio缓存服务,下次构建时,只需要重新拉取缓存服务器上的依赖包,增量打包构建。

.gitlab-ci.yml中配置如下:

  1. stages:
  2. - validate
  3. - unit-test
  4. - build
  5. - package
  6. - deploy
  7. - .post
  8. image: registry.cn-hangzhou.aliyuncs.com/123/maven:3-jdk-8-slim
  9. ......
  10. build:jar:
  11. stage: build
  12. script:
  13. - mvn $MAVEN_OPTS -Dmaven.test.skip=true -U package deploy
  14. tags:
  15. - maven
  16. artifacts:
  17. paths:
  18. - manage-provider/target/manage-provider*.jar
  19. expire_in: 1 week
  20. only:
  21. refs:
  22. - tags
  23. - master
  24. build:image:
  25. stage: package
  26. image: gcr.azk8s.cn/kaniko-project/executor:debug
  27. dependencies:
  28. - build:jar
  29. script:
  30. - |
  31. docker build $CI_PROJECT_DIR \
  32. -t $IMAGE:$IMAGE_TAG \
  33. -t $IMAGE:latest
  34. - docker push $IMAGE:$IMAGE_TAG
  35. - docker push $IMAGE:latest
  36. tags:
  37. - docker-builder
  38. when: manual
  39. allow_failure: false
  40. only:
  41. refs:
  42. - tags
  43. - master
  44. .....

这种方式将maven项目的package和Dockerfile制作推送分成两步,好处是可以看到每次package时候的日志输出,缺点是每次打完包都要上传依赖包到缓存服务器,加长了部署时间。
2、
Dockerfile中使用多阶段构建,只取jar包,添加到镜像中,构建在服务器上。依赖存放服务器本地或者私有镜像仓库

使用多阶段构建Dockerfile
以Java Maven项目为例,在Java Maven项目中新建Dockerfile文件,并在Dockerfile文件添加以下内容。
说明 该Dockerfile文件使用了二阶段构建。
第一阶段:选择Maven基础镜像(Gradle类型也可以选择相应Gradle基础镜像)完成项目编译,拷贝源代码到基础镜像并运行RUN命令,从而构建Jar包。
第二阶段:拷贝第一阶段生成的Jar包到OpenJDK镜像中,设置CMD运行命令。

  1. # First stage: complete build environment
  2. FROM maven:3.5.0-jdk-8-alpine AS builder
  3. # add pom.xml and source code
  4. ADD ./pom.xml pom.xml
  5. ADD ./src src/
  6. # package jar
  7. RUN mvn clean package
  8. # Second stage: minimal runtime environment
  9. From openjdk:8-jre-alpine
  10. # copy jar from the first stage
  11. COPY --from=builder target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jar
  12. EXPOSE 8080
  13. CMD ["java", "-jar", "my-app-1.0-SNAPSHOT.jar"]

这种方式将package和制作镜像,推送镜像放到了一起,省去了推送依赖包到缓存服务的时间。