• CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集


    CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集

    日常开发中,每次代码编写完成后,都需要手动打包,并且上传服务器,无论本地打包的时间或者上传文件到服务器都需要花费大量的时间来完成,都是重复的并且毫无意义,应该将时间花费在更有价值的时间上;所以编写这篇文章,将自己收集、搭建、测试的步骤或经验汇总一下,也欢迎大家提出或一起讨论更好的解决方案。

    前置技能

    • Shell简单脚本编写(此项满足则说明了解并能够使用Linux)
    • Docker
    • Git
    • Java(可选,既然看了这篇文章,这个会的吧,不过无论自动化部署什么,原理都是相通的)

    安装

    因为都是本地测试,采用Docker容器来进行快速安装,减少部署所花费的时间,并且大部分之前都有写过对应的安装文章,这里就不重复粘贴了。

    Docker

    Docker离线安装

    GitLab

    Docker GitLab安装

    GitLab-Runner

    Docker GitLab-Runner安装

    阿里云容器仓库

    (未使用跳过),原本打算使用Harbor镜像私服仓库或者阿里云容器仓库,发现可以省略此步骤,将打包好的docker镜像直接通过宿主机运行(需要Runner配置docker in docker)。

    GitLab-CI

    进入到CI/CD的核心,语法部分,都是死的,这里推荐一篇文章,原本是b站的视频,发现有对应文章就直接浏览了一遍文章再进行测试,文章链接

    Java微服务的GitLab-CI应用

    1. 拉取gitlab-ci模版仓库,并上传到自己的gitlab上(注意CI/CD引入模版的代码仓库需要此仓库权限)

    gitlab-ci模版仓库(develop分支):https://github.com/zsl0/devops-ci-template.git

    1. Java仓库项目目录下创建.gitlab-ci.yml文件

    请添加图片描述

    简化版本,能够满足代码提交后自动docker运行,注意需要根据需要运行的辅助配置stage为deploy的job任务,如下面配置的gatewayadmin服务器自动化部署,需要配置variables的三个变量IMAGE_NAMEMODULE_PATHJAR_NAME,分别对应服务名、服务模块相对路径、打包后的jar包名称。

    项目相对路径:

    请添加图片描述

    .gitlab-ci.yml配置:

    include:
      - project: 'zsl0/devops-ci-template'
        ref: develop
        file: 'templates/default-pipeline.yml'
    
    variables:
      ## 全局配置
      GIT_CLONE_PATH: ${CI_BUILDS_DIR}/builds/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_PIPELINE_ID}
      GIT_CHECKOUT: "false"
      CACHE_DIR: "**/target/**.jar"
    
      ## 作业控制
      RUN_PIPELINE_BUILD:   "yes"     #是否运行构建 yes/no
      RUN_PIPELINE_TEST:    "no"      #是否运行测试 yes/no
      RUN_CODE_ANALYSIS:    "no"     #是否代码扫描 yes/no
      RUN_BUILD_IMAGE:      "no"     #是否生成镜像 yes/no
      RUN_DEPLOY_ARTIFACTS: "no"      #是否上传制品 yes/no
      RUN_DEPLOY_K8S:       "no"     #是否发布K8S yes/no
      RUN_DEPLOY_DOCKER:    "yes"     #是否发布DOCKER yes/no
    
      ## 依赖容器镜像
      BUILD_IMAGE: "registry.cn-hangzhou.aliyuncs.com/zsl0/maven-build:0.0.2"
      CURL_IMAGE: "curlimages/curl:7.70.0"
      SONAR_IMAGE: "sonarsource/sonar-scanner-cli:latest"
      KUBECTL_IMAGE: "lucj/kubectl:1.17.2"
    
    
      ## 构建测试参数
      MAVEN_OPTS: "-Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven "  #maven构建参数
    #  BUILD_SHELL: 'mvn clean package  -DskipTests -P zsl0-prod'   #构建命令
      BUILD_SHELL: 'mvn clean package  -DskipTests -P hxkj-dev'   #构建命令
      #GRADLE_OPTS: ""               #gradle构建参数
    
      ## 单元测试参数
      TEST_SHELL : 'mvn test   '       #测试命令
      JUNIT_REPORT_PATH: 'target/surefire-reports/TEST-*.xml'   #单元测试报告                                #项目扫描参数
    
      ## 构建镜像
      #CI_REGISTRY: 'registry.cn-beijing.aliyuncs.com'               #镜像仓库地址
      #CI_REGISTRY_USER: '610556220zy'                               #仓库用户信息
      #CI_REGISTRY_PASSWD: 'xxxxxxxx.'                              #仓库用户密码
      IMAGE_NAME: "${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}"     #镜像名称
      DOCKER_FILE_PATH: "./Dockerfile"                              #Dockerfile位置
    
      ## 上传制品库(artifactory)
      #ARTIFACTORY_URL: "http://192.168.1.200:30082/artifactory"     #制品库地址
      #ARTIFACTORY_NAME: "${CI_PROJECT_NAMESPACE}"                   #制品库名称
      #ARTIFACT_PACKAGE: "jar"                                       #制品类型
      #ARTIFACT_PATH: "target/*.${ARTIFACT_PACKAGE}"                 #制品位置
      #TARGET_FILE_PATH: "${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}"   #目标制品位置(目录结构)
      #TARGET_ARTIFACT_NAME: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}.${ARTIFACT_PACKAGE}"   #目标制品名称
    
      ## 部署应用k8s
      APP_NAME: "$CI_PROJECT_NAME"                #应用名称 <-->deploymentName
      CONTAINER_PORT: "8081"                      #服务端口 <--> servicesPort
      NAMESPACE: "$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG"             #名称空间
      ENV_URL: "${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com"  #IngressHosts
    
    cache:
      paths:
        # 后续修改解决mvn打包repository缓存问题,需要根据路径设置本地仓库路径
        - /root/.m2/repository
        - /opt/repository
        - ~/.m2/repository
        - ${CACHE_DIR}
    
    ## 构建作业
    build:
      # 指定Runner,不指定默认使用共享Runner
      tags:
        - runner-java
    
    ## 部署
    ## gateway Docker自动化部署
    deploy-gateway:
      stage: deploy
      image: docker:latest
      tags:
        - runner-java
      extends: .deploy_docker
      variables:
        # 镜像名称,默认使用服务名
        IMAGE_NAME: "gateway"
        # 模块路径
        MODULE_PATH: "data-center/gateway/"
        # jar包名称
        JAR_NAME: gateway.jar
    
    ## gateway Docker自动化部署
    deploy-admin-server:
      stage: deploy
      image: docker:latest
      tags:
        - runner-java
      extends: .deploy_docker
      variables:
        # 镜像名称,默认使用服务名
        IMAGE_NAME: "admin-server"
        # 模块路径
        MODULE_PATH: "data-center/admin/admin-server/"
        # jar包名称
        JAR_NAME: admin-server.jar
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    1. 创建Dockerfile_template模版
    FROM openjdk:11
    
    MAINTAINER 249269610@qq.com
    
    WORKDIR /opt/jar
    
    RUN mkdir -p /opt/shell/
    #ADD /zsl0/shell/ /opt/shell/
    
    RUN mkdir -p /opt/jar/
    ADD MODULE_PATH/target/JAR_NAME /opt/jar/java-program.jar
    
    ENTRYPOINT ["java", "-jar"]
    CMD ["java-program.jar"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    其他问题

    Maven本地仓库缓存

    根据 参考文章 选择在配置文件中添加 /.m2缓存目录,并在指定mvn指定 /.m2/repository仓库目录:

    variables:
      MAVEN_OPTS: "-Dmaven.repo.local=/.m2/repository "  #maven构建参数
    
    • 1
    • 2
  • 相关阅读:
    核密度分析
    硅芯思见:【143】问芯吾跬(IC设计验证常见问题汇总二)
    前端页面设计 | 博客系统
    使用vpn后,不能正常上网或连接vpn
    嵌入式Linux八股(三)——计算机基础
    金仓数据库WalMiner日志逻辑解码工具 (3. WalMiner的运行环境准备)
    贪心,排序不等式:acwing第133场周赛:最小和
    Spring - xml实现
    『 MySQL数据库 』数据库基础之表的基本操作
    通过ELRepo修改CentOS 7内核版本的详细步骤
  • 原文地址:https://blog.csdn.net/qq_19152901/article/details/134014665