美文网首页
SpringBoot自动打镜像--Gitlab CI流程

SpringBoot自动打镜像--Gitlab CI流程

作者: Teddy_b | 来源:发表于2023-09-27 10:38 被阅读0次

    背景

    简单记录下Spring boot项目通过maven自动打包,然后打镜像的的Gitlab ci流程

    Gitlab Runner部署

    Runner是实际的Job运行者,可以直接部署在主机上,也可以直接容器部署

    这里为了方便,Gitlab Runner就直接用docker容器部署了

    docker run -d --name xxx-public-runner --restart always -v /data/ci_xxx_public/gitlab/runner/:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock -v /data:/data gitlab/gitlab-runner:latest
    

    这里的第一个挂载是为了runner配置的持久化;

    下面是一份配置,指向的是Gitlab代码库,并且指定了使用容器方式运行我们的任务

    concurrent = 1
    check_interval = 0
    
    [session_server]
      session_timeout = 1800
    
    [[runners]]
      name = "xxx-public-runner"
      url = "https://git.sysop.xxx.xx/"
      token = "9TfGzxxxxxxxxxxxxWbks"
      executor = "docker"
      [runners.custom_build_dir]
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
        [runners.cache.azure]
      [runners.docker]
        tls_verify = false
        image = "alpine:3.16.2"
        pull_policy = "if-not-present"
        privileged = false
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/root/.m2:/.m2"]
        shm_size = 0
    
    • 这里的/var/run/docker.sock挂载是为了共享宿主机上的docker文件,这样Gitlab Runner使用容器运行任务的时候,将会直接和宿主机上的dockerd交互;而不需要使用dind方式;

    • 第三个挂载是为了共享宿主机上的maven依赖,避免每次都要重新下载依赖;

    代码修改

    上述Runner部署完成后,还需要对代码进行修改,主要是添加Gitlab的配置文件.gitlab-ci.yml;容器化部署的时候还需要添加Dockerfile文件

    Dockerfile
    FROM myharbor.xxx.com:80/library/jdk:8u292-jdk-jfx
    WORKDIR /work
    COPY my-web/target/my-web-0.0.1-SNAPSHOT.jar /work/bin/
    COPY my-web/src/main/resources/log4j2.yml  my-web/src/main/resources/application-test.properties my-web/src/main/resources/application-prod.properties my-service/src/main/resources/application-servicetest.properties my-service/src/main/resources/application-serviceprod.properties   /work/conf/
    ENTRYPOINT ["java", "-jar", "./bin/my-web-0.0.1-SNAPSHOT.jar"]
    CMD ["-Xms4096m", "-Xmx4096m", "-Xmn2048m", "-Dfile.encoding=UTF-8", "-Dsun.net.inetaddr.ttl=5", "-Dsun.net.inetaddr.negative.ttl=1", "-Dlog4j.configurationFile=./conf/log4j2.yml", "--spring.profiles.active=test,servicetest", "--spring.config.location=./conf/", "--server.port=8334", "--cas.default.domain=https://my-public.xxx.com"]
    

    这里的基础镜像是自定义的,主要是为了解决项目中使用JFX相关的工具类,这个自定义也比较简单,只需要往openjdk中加入JFX的依赖即可,它的构建Dockerfile:

    FROM openjdk:8u292-jdk
    COPY jfxrt.jar /usr/local/openjdk-8/jre/lib/ext/
    
    其次Gitlab的配置文件.gitlab-ci.yml,这份配置文件是CI工作的关键
    image: alpine:3.17.1
    
    # 本次构建的阶段:build package
    stages:
      - package
      - build
    
    # 生产jar的job
    make_jar:
      image: myharbor.xxx.com:80/library/maven:3.8.6-jdk-8-jfx
      stage: package
      rules:
        - if: '$CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_BRANCH == "dev"'
      tags:
        - my-public-runner
      script:
        - echo "=============== 开始编译 ==============="
        - mvn -Dmaven.repo.local=/.m2/repository -Dmaven.test.skip=true clean package
        - echo "=============== 编译完成 ==============="
      artifacts:
        paths:
          - my-web/target/my-web-0.0.1-SNAPSHOT.jar
        expire_in: 30 days
    
    # 生产镜像的job
    make_image:
      image: docker:20.10.7
      stage: build
      rules:
        - if: '$CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_BRANCH == "dev"'
      tags:
        - my-public-runner
      script:
        - echo "target文件夹" `ls my-web/target/`
        - echo "=============== login===============" 
        - echo $HARBOR_PWD | docker login $HARBOR_URL -u $HARBOR_USER --password-stdin
        - echo "=============== build =============="
        - docker build -t $HARBOR_URL/library/my_public_be:$CI_COMMIT_SHORT_SHA .
        - echo "=============== push==============="
        - docker push $HARBOR_URL/library/my_public_be:$CI_COMMIT_SHORT_SHA
        - echo "=============== logout==============="
        - docker logout $HARBOR_URL
        - echo "clear"
        - rm -rf my-web/target/my-web-0.0.1-SNAPSHOT.jar
    
    

    这份配置文件主要指定了CI流程包括两步:

    • 打包:这一步主要是启动一个maven容器,对项目代码进行打包,生成jar文件

    • 镜像:这一步主要是启动一个docker cli容器,读取我们的Dockerfile,并使用第一步中生成的jar包,然后构建镜像并推送;由于我们挂载了宿主机上的dockerd文件,因此会直接在宿主机上创建一个容器来运行Job

    简单说明:

    • 使用的基础镜像,如 myharbor.xxx.com:80/library/maven:3.8.6-jdk-8-jfx 都是重新构建出来的,因为都必须加入jfx依赖

    • 都指定了条件 $CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_BRANCH == "dev" ,仅在dev分支触发,并且只能从web触发

    • $HARBOR_URL这些参数是直接定义在Gitlab上面的

    踩坑

    • $HARBOR_PWD也是直接定义在Gitlab上的,如果密码中包含$字符,需要转义,如$anc需要写成$$anc

    相关文章

      网友评论

          本文标题:SpringBoot自动打镜像--Gitlab CI流程

          本文链接:https://www.haomeiwen.com/subject/vbisvdtx.html