基于gitlab-ci实现maven及docker缓存的配置

Posted rumeng_you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于gitlab-ci实现maven及docker缓存的配置相关的知识,希望对你有一定的参考价值。

背景

    接手一些java项目,发布方式为docker,但是无cicd,只能实现本地的手动编译打包,非常依赖开发人员的本地开发环境,而且打出镜像的tag也不标准,准备迁移到gitlab-ci上去打包发布。

    询问公司的gitlab的群里同学,也没有maven的很好的cicd方案,查看runner,有个别打了maven的标签,但基本不在线了。

    于是觉得自己研究一下,大概思路就是利用runner的cache功能来实现maven的本地依赖仓库的缓存,然后maven编译的时候可以指定仓库位置。docker build的时候利用 --cache-from来实现spring boot lib层的复用。

注意: 本文内的整个流程是亲测跑通的,但是脚本里的东西隐去了公司相关的信息,做了修改,引用的话需要根据自己的实际情况进行修改,包括一些相对目录.


目标

自建runner实现自动化化打包

实现maven dependency 缓存

实现docker layer 复用


gitlab runner 缓存配置

   ci需要配置缓存目录,且需要runner本身开启了缓存功能。此处选择自建runner来支持缓存。

   runner的安装过程忽略,请自行查找资料。


maven缓存配置

    在gitlab-ci.yml中开启缓存目录配置,并自定义maven repo的目录配置.

build:
stage: build
image: xxx/cicd/ubuntu-java:alpha
script:
- mkdir $HOME/.m2/
- echo <settings xmlns="https://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/SETTINGS/1.2.0/ https://maven.apache.org/xsd/settings-1.2.0.xsd">
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>aliyun2</id>
<mirrorOf>jitpack.io</mirrorOf>
<name>aliyun2</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
</settings>
> $HOME/.m2/settings.xml
- cd $CI_PROJECT_DIR/ && mvn package spring-boot:repackage $MAVEN_CLI_OPTS $MAVEN_OPTS_NOLOG
artifacts:
name: "$CI_COMMIT_REF_NAME-$CI_JOB_ID"
paths:
- ./target/xxx-1.0.0.jar
expire_in: 1 week
tags:
- 3d-backend
cache:
paths:
- .m2/repository


配置了缓存目录为 .m2/repository,这样maven编译时就不会重新下载jar包。


docker缓存配置

    为了优化docker镜像的存储,需要进行分层。本项目是spring-boot项目,把lib目录下的jar单独设置为一层,然后实现层的复用.

    docker本身默认支持缓存,但是由于gitlab-ci使用的是docker executor,每次构建都会是一个全新的环境,导致没有缓存可用。

   所以本次采用 --cache-from的方式,不利于缓存,而是利用上一次的镜像。需要注意的是,需要自己把镜像pull到本地才会生效。


   每次docker build之后 把镜像tag成 xxx:ci-cache(名字任意)

  build之前 pull xxx:ci-cache

  build的时候增加参数  --cache-from=xxx:ci-cache


docker_image:
stage: docker_image
image: xxx/cicd/docker:20-dind
variables:
DOCKER_TLS_CERTDIR: ""
GODEBUG: "x509ignoreCN=0"
DOCKER_HOST: "tcp://docker:2375"
services:
- name: xxx/cicd/docker:20-dind
command: [ "--tls=false" ]
alias: docker
script:
- cd $CI_PROJECT_DIR/target && unzip xxx-1.0.0.jar >/dev/null && mkdir -p BOOT-INF/lib2/ && mv BOOT-INF/lib/xxx-*.jar BOOT-INF/lib/xxx-api*.jar BOOT-INF/lib2/
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
- docker pull $DOCKER_IMAGE_CACHE || true
- cd $CI_PROJECT_DIR && docker build --cache-from=$DOCKER_IMAGE_CACHE -t $DOCKER_IMAGE .
- docker tag $DOCKER_IMAGE $DOCKER_IMAGE_CACHE && docker push $DOCKER_IMAGE_CACHE >/dev/null
- docker push $DOCKER_IMAGE
when: manual
dependencies:
- build
tags:
- 3d-backend


完整的gitlab-ci配置

image: xxx/cicd/ubuntu-java:alpha

stages:
- build
- docker_image

variables:
REPO_NAME: xxx-pro
MAVEN_CLI_OPTS: "-B -T 8 --errors --fail-at-end --show-version -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dmaven.test.skip "
MAVEN_OPTS_NOLOG: " -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn "

before_script:
- TAG_NAME=$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA:0:7
- TAG_NAME=$(echo $TAG_NAME | sed s/\\//-/g)
- mkdir -p /build/$REPO_NAME
- ln -svf $CI_PROJECT_DIR /build/$REPO_NAME
- VERSION=`date +%y.%m.%d.%H.%M`
- DOCKER_IMAGE_REPO=xxxx/xx-img
- DOCKER_IMAGE=$DOCKER_IMAGE_REPO:$TAG_NAME-$VERSION
- DOCKER_IMAGE_CACHE=$DOCKER_IMAGE_REPO:ci-cache


build:
stage: build
image: xxx/cicd/ubuntu-java:alpha
script:
- mkdir $HOME/.m2/
- echo <settings xmlns="https://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/SETTINGS/1.2.0/ https://maven.apache.org/xsd/settings-1.2.0.xsd">
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>aliyun2</id>
<mirrorOf>jitpack.io</mirrorOf>
<name>aliyun2</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
</settings>
> $HOME/.m2/settings.xml
- cd $CI_PROJECT_DIR && mvn package spring-boot:repackage $MAVEN_CLI_OPTS $MAVEN_OPTS_NOLOG
artifacts:
name: "$CI_COMMIT_REF_NAME-$CI_JOB_ID"
paths:
- ./target/xxx-1.0.0.jar
expire_in: 1 week
tags:
- 3d-backend
cache:
paths:
- .m2/repository

docker_image:
stage: docker_image
image: xxx/cicd/docker:20-dind
variables:
DOCKER_TLS_CERTDIR: ""
GODEBUG: "x509ignoreCN=0"
DOCKER_HOST: "tcp://docker:2375"
services:
- name: xxx/cicd/docker:20-dind
command: [ "--tls=false" ]
alias: docker
script:
- cd $CI_PROJECT_DIR/target && unzip xx-1.0.0.jar >/dev/null && mkdir -p BOOT-INF/lib2/ && mv BOOT-INF/lib/ar-*.jar BOOT-INF/lib/xxx-api*.jar BOOT-INF/lib2/
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
- docker pull $DOCKER_IMAGE_CACHE || true
- cd $CI_PROJECT_DIR && docker build --cache-from=$DOCKER_IMAGE_CACHE -t $DOCKER_IMAGE .
- docker tag $DOCKER_IMAGE $DOCKER_IMAGE_CACHE && docker push $DOCKER_IMAGE_CACHE >/dev/null
- docker push $DOCKER_IMAGE
when: manual
dependencies:
- build
tags:
- 3d-backend


以上是关于基于gitlab-ci实现maven及docker缓存的配置的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)

无法在 Windows 服务器上使用 docker 为 gitlab-ci 运行构建

基于Jenkins和Maven实现Docker镜像的CI/CD

使用 gitlab-ci.yml 的 Docker 内部的 Docker

使用 gitlab-ci 构建多个 Docker 镜像

基于jib-maven-plugin快速构建微服务docker镜像