Java 自动化部署

代码优化插件

在idea中安装阿里检查代码的插件:Alibaba Java Coding Guidelines(XenoAmess TPM),这个插件为 Java 开发者提供了编码标准和建议,旨在提高代码质量,提升可读性,可维护性,以及性能等

持续集成 CI/CD流程

实现流程:

  1. 开发人员持续将功能代码集成到公共功能集成分支,如: develop
  2. 当功能积攒到一定节点,需要进行线上项目升级,需要基于持续集成软件进行一键发布;
  3. 持续集成工具先对develop | master分支代码进行拉取更新,然后对最新功能代码进行清理、编译、测试、打包、打镜像、部署等动作;
  4. 如果构建失败,则发送邮件提醒代码提交人员或管理员; 要实现上面流程,咱们需要了解一款支持持续集成的软件:Jenkins

Jenkins介绍和安装

yml 复制代码
version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    ports:
      - "8000:8080"
    environment:
      - JAVA_OPTS=-Duser.timezone=GMT+08 -Xms2g -Xmx2g
    volumes:
      - ./data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
    user: root

自己本地访问,写本地即可,如果希望别人也可以访问,需要填写IP地址或者域名

什么是流水线

Jenkins 流水线配置是 Jenkins 中用于定义和执行自动化构建、测试和部署过程的一种方式

在声明式流水线中,整个流水线过程被定义在一个 pipeline 块中,该块包含了流水线执行所需的所有指令和阶段。

  1. 基本结构 声明式流水线的基本结构如下:
Groovy 复制代码
pipeline {  
    agent any // 指定流水线运行的节点,any 表示任何可用的节点  
    stages {  
        stage('Stage Name1') { // 定义阶段  
            steps {  
                // 定义在该阶段执行的步骤  
                echo 'Hello, World!'  
            }  
        },
        stage('Stage Name2') { // 定义阶段  
            steps {
                // 定义在该阶段执行的步骤  
                echo 'Hello, World!'  
            }
        }
    }
}
  1. 主要指令和阶段
  • agent:指定流水线或特定阶段在哪个节点上执行。
  • stages:包含流水线中的所有阶段(stage),阶段是流水线的主要分组单元。
  • stage:定义一个阶段,阶段内可以包含一个或多个步骤。
  • steps:定义在某个阶段内执行的步骤,步骤是构建过程中的具体操作。
  • post:定义在所有阶段完成后执行的操作,可以基于不同的条件(如成功、失败、总是)来执行。
  • environment:定义流水线中的环境变量。
  • options:定义全局选项和配置,如超时设置、并行执行等。
  • parameters:定义流水线的参数,用于接收用户输入。
  • triggers:定义触发流水线执行的条件或事件,如定时触发、代码推送触发等。

安装插件

  • Active Choices 参数选择
  • Blue Ocean 流水线可视化插件
  • Adoptium JDK安装插件

在全局配置中安装

创建流水线

下方流水线

安装 JDK 17版本

完整脚本

groovy 复制代码
pipeline {
    agent any
    parameters {
        choice(name: 'services', choices: ['kzzyl-admin'], description: '请选择你的服务')
        choice(name: 'GIT_TAG', choices: ['master', 'dev', 'test', 'prod'], description: '请选择你的分支')
        string(name: 'GIT_URL', defaultValue: 'https://gitee.com/kun020126/zzyl.git', description: '请输入Git仓库地址')
    }
    environment {
        DOCKER_TAG = "1.0"
    }
    // 工具配置
    tools {
        maven 'maven'
         jdk 'jdk17'
    }
    stages {
        stage('清除工作空间') {
            steps {
                cleanWs()
            }
        }
        stage('拉取Git代码') {
            steps {
                echo '正在拉取Git代码'
                // $class 指定使用插件
                // GitSCM 拉取代码插件
                checkout([
                    $class: 'GitSCM',
                    branches: [
                        // 分支
                        [name: "${params.GIT_TAG}"]
                    ],
                    // 是否初始化git子模块
                    doGenerateSubmoduleConfigurations: false,
                    // 配置访问凭证
                    userRemoteConfigs: [[
                       credentialsId: 'github-pt1', url: "${params.GIT_URL}"
                    ]]
                ])
                // 输出当前工作目录
                // sh "pwd"
            }
        }
        stage('Maven打包') {
            steps {
                script {
                    echo '正在执行maven打包....'
                    sh 'mvn clean install -DskipTests'
                }
            }
        }
        stage('构建镜像') {
            steps {
                echo "进入target目录执行镜像打包......"
                sh "docker build -t ${params.services} ${params.services}/."
            }
        }
        stage('启动程序') {
            steps {
                sh 'docker run ${params.services}'
            }
        }
    }
    post {
        success {
            echo '构建成功'
        }
        failure {
            echo '构建失败'
        }
    }
}

DIND 模式

  1. 构建可以连接远程DIND的Jenkins
  2. 创建dind docker 容器

构建可以连接远程DIND的Jenkins

dockerfile 复制代码
FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"

docker-compose 文件

yml 复制代码
version: '3.9'
services:
  jenkins-dind:
    user: root
    image: docker:dind
    container_name: jenkins-docker-dind
    privileged: true
    networks:
      jenkins:
        aliases:
          - docker
    environment:
      - DOCKER_TLS_CERTDIR=/certs
    volumes:
      - ./docker-certs:/certs/client
      - jenkins-data:/var/jenkins_home
    ports:
      - "2376:2376"
  jenkins-docker:
    user: root
    image: jenkins-docker
    container_name: jenkins-docker
    networks:
      jenkins:
        aliases:
          - jenkins
    ports:
      - "8080:8080"
      - "50000:50000"
    environment:
      - DOCKER_HOST=tcp://docker:2376
      - DOCKER_CERT_PATH=/certs/client
      - DOCKER_TLS_VERIFY=1
    volumes:
      - jenkins-data:/var/jenkins_home
      - ./docker-certs:/certs/client:ro
networks:
  jenkins:
    driver: bridge

volumes:
  jenkins-data: 
    driver: local
    driver_opts:
      type: none
      o: bind
      device: D:/docker_config/jenkins/data

ELK日志管理

ELK是一个开源的日志管理平台,由三个核心组件组成:Elasticsearch、Logstash 和 Kibana。这三个组件共同协作,提供了一个从日志收集、处理、存储到分析、可视化的完整解决方案。

  1. Elasticsearch:这是一个基于Lucene的搜索引擎,用于存储和搜索日志数据。它提供了强大的全文搜索功能,支持复杂的查询和聚合操作,并且能够处理大规模的日志数据。
  2. Logstash:这是一个日志收集和处理工具,用于从各种数据源(如文件、数据库、网络等)中收集日志,并将其转换为Elasticsearch可以理解的格式。Logstash还提供了丰富的过滤功能,可以对日志数据进行清洗、转换和增强。
  3. Kibana:这是一个Web界面,用于可视化Elasticsearch中的日志数据。它提供了直观的图形和工具,使用户能够轻松地搜索、分析和可视化日志数据,从而更好地理解系统的运行状态和性能。
相关推荐
Selicens1 小时前
git批量删除本地多余分支
前端·git·后端
哈密瓜的眉毛美1 小时前
Java 基础补充:零基础学Java | Scanner 类详解
后端
ma_king2 小时前
入门 java 和 数据库
java·数据库·后端
平平无奇的开发仔2 小时前
Mybaitis 项目多模块多依赖xml加载classpath:和classpath*:的区别
后端
后端AI实验室2 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
神奇小汤圆2 小时前
MySQL的10种高级SQL,性能飞升
后端
AI探索者2 小时前
LangGraph 人工干预:Human-in-the-loop 机制详解
后端
神奇小汤圆2 小时前
Java并发核心:你以为AQS很复杂?无非是"两个队列"和"一个状态"
后端
shark_chili2 小时前
Spring AI Alibaba 入门与实战:一文构建智能天气查询助手
后端