GitLab CI构建SpringBoot-2.3应用( 二 )

  • pom.xml所在目录增加文件夹.m2 , 里面放入settings.xml , 这是maven的配置文件 , 可以设置您的特殊的maven信息;
  • pom.xml所在目录增加Dockerfile文件 , 用于制作镜像:
# 指定基础镜像 , 这是分阶段构建的前期阶段FROM openjdk:8u212-jdk-stretch as builder# 执行工作目录WORKDIR application# 配置参数ARG JAR_FILE=target/*.jar# 将编译构建得到的jar文件复制到镜像空间中COPY ${JAR_FILE} application.jar# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果RUN java -Djarmode=layertools -jar application.jar extract# 正式构建镜像FROM openjdk:8u212-jdk-stretchWORKDIR application# 前一阶段从jar中提取除了多个文件 , 这里分别执行COPY命令复制到镜像空间中 , 每次COPY都是一个layerCOPY --from=builder application/dependencies/ ./COPY --from=builder application/spring-boot-loader/ ./COPY --from=builder application/snapshot-dependencies/ ./COPY --from=builder application/application/ ./ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
  • pom.xml所在目录增加.gitlab-ci.yml文件 , 这就是CI时的pipeline脚本:
image: maven:3.6.3-jdk-8variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"# 定义缓存# 如果gitlab runner是shell或者docker , 此缓存功能没有问题# 如果是k8s环境 , 要确保已经设置了分布式文件服务作为缓存cache:key: dockerlayerdemo-ci-cachepaths:- .m2/repository/- target/*.jar# 本次构建的阶段:build packagestages:- package- build# 生产jar的jobmake_jar:image: maven:3.6.3-jdk-8stage: packagetags:- k8sscript:- echo "=============== 开始编译源码 , 在target目录生成jar文件 ==============="- mvn $MAVEN_CLI_OPTS clean compile package -Dmaven.test.skip=true- echo "target文件夹" `ls target/`# 生产镜像的jobmake_image:image: docker:lateststage: buildtags:- k8sscript:- echo "从缓存中恢复的target文件夹" `ls target/`- echo "=============== 登录Harbor==============="- docker login 192.168.50.43:5888 -u admin -p Harbor12345- echo "=============== 打包Docker镜像 : " gitlabci-java-demo:$CI_COMMIT_SHORT_SHA "==============="- docker build -t 192.168.50.43:5888/common/gitlabci-java-demo:$CI_COMMIT_SHORT_SHA .- echo "=============== 推送到镜像仓库==============="- docker push 192.168.50.43:5888/common/gitlabci-java-demo:$CI_COMMIT_SHORT_SHA- echo "=============== 登出==============="- docker logout- echo "清理掉本次构建的jar文件"- rm -rf target/*.jar关于以上pipeline脚本 , 有下面五点需要注意:
第一:关于cache , 如果您的gitlab runner是shell或者docker类型就无需关注 , cache是直接生效的 , 但如果您的gitlab runner是K8S那就要注意了 , 需要在gitlab runner中填写cache相关的配置 , 让分布式文件服务作为cache的底层实现;
第二:一共定义了两个stage:package和build , 顺序是先package再build , 注意生成jar的job一定要是package , 使用jar构建镜像的job要是build , 这样在构建镜像的时候才能顺利从缓存中取得jar;
第三:make_image这个job的脚本中 , 会执行登录私有镜像仓库的操作 , 为了操作方便 , 登录的账号密码都是直接写在脚本里面的 , 实际使用时请不要这样做 , 建议使用Harbor的机器人账号密码 , 并且写入GitLab CI的环境变量配置页面 , 而不是直接写在pipeline脚本中
第四:tags参数用来和已有的GitLab Runner匹配 , 请按照您自己的runner的情况设置;
第五:生成docker镜像的tag等于$CI_COMMIT_SHORT_SHA , 这是本次提交的commit id , 因此 , 每次提交都会导致镜像仓库中多一个镜像 , 其tag等于commit id;
  • 最终整个工程的内容如下:

GitLab CI构建SpringBoot-2.3应用

文章插图
 
至此 , 所有开发工作已经完成 , 接下来验证执行情况;
验证CI
  • 将所有内容提交到GitLab , 如果CI环境配置OK的话会立即触发构建 , 下图是构建成功的效果:

GitLab CI构建SpringBoot-2.3应用

文章插图