day10-项目部署_持续集成

发布于:2025-05-23 ⋅ 阅读:(16) ⋅ 点赞:(0)
1. 持续集成(CI)的核心概念与优势
  • 定义:频繁将代码集成到主干(如每日多次),通过自动化构建、测试和部署流程确保代码质量。
  • 组成要素
    • 自动化构建:包含代码检出、编译、测试、结果记录等步骤。
    • 代码存储库:使用Git或SVN管理代码版本。
    • 持续集成服务器:如Jenkins,用于调度和执行自动化流程。
  • 优势
    • 降低风险:早期发现问题,减少修复成本。
    • 减少重复工作:自动化流程替代手动操作。
    • 支持持续交付:快速生成可部署的单元包。
2. 软件开发模式对比
  • 瀑布模型
    • 线性流程:需求分析→设计→实现→测试→进化。
    • 缺点:无法适应需求变化,交付周期长。
  • 敏捷开发
    • 迭代开发:将大项目拆分为多个小周期(迭代),每个迭代完成完整功能。
    • 增量开发:每个版本新增完整功能,而非分阶段完成所有模块。
    • 优势:早期交付、快速响应需求变化。
3. Jenkins核心配置与工具集成
  • 安装与初始化
    • 通过YUM或RPM安装Jenkins,配置端口和用户权限。
    • 访问管理后台,安装默认插件并创建管理员用户。
  • 插件安装
    • 必要插件:Maven Integration、GitLab、Docker、SSH等。
    • 配置镜像源:解决插件安装失败问题。
  • 全局工具配置
    • 指定JDK、Maven、Docker路径,确保构建环境一致性。
4. 微服务部署与Docker集成
  • 多环境配置
    • 通过spring.profiles.active指定环境(dev/test/prod)。
    • 在Nacos配置中心管理不同环境的配置文件。
  • Docker镜像构建
    • Dockerfile示例
      FROM java:8
      VOLUME /tmp
      ARG JAR_FILE
      COPY ${JAR_FILE} app.jar
      ENV JAVA_OPTS="-server -Xms256m -Xmx512m"
      ENTRYPOINT ["sh", "-c", "java -jar $JAR_FILE $PARAMS"]
      
      • VOLUME:避免容器存储层写入临时文件。
      • ENTRYPOINT:启动时执行Java命令,支持动态传参(如--spring.profiles.active=prod)。
    • Maven插件配置
      <plugin>
          <groupId>com.spotify</groupId>
          <artifactId>dockerfile-maven-plugin</artifactId>
          <configuration>
              <repository>${docker.image}/${project.artifactId}</repository>
          </configuration>
      </plugin>
      
      用于将微服务打包为Docker镜像并推送至私有仓库。
5. Jenkins自动化部署流程
  • 基础依赖打包
    • 从Git拉取代码,执行mvn install安装公共依赖到本地仓库。
  • 微服务打包与镜像构建
    • Maven命令
      clean install -Dmaven.test.skip=true dockerfile:build -f heima-leadnews-service/pom.xml
      
      • -Dmaven.test.skip=true:跳过测试。
      • dockerfile:build:触发Docker镜像构建。
    • Shell脚本
      # 清理旧容器和镜像
      docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
      docker image prune -f
      # 启动新容器
      docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $IMAGE_TAG
      
      • --net=host:容器使用宿主机网络,避免端口映射问题。
      • -e PARAMS:传递启动参数(如指定环境)。
6. 远程服务器部署与私有仓库
  • 私有仓库配置
    • 启动Docker Registry服务:
      docker run -d -p 5000:5000 --name registry -v /data/registry:/var/lib/registry registry:latest
      
    • 客户端配置insecure-registry以允许HTTP访问。
  • Jenkins远程部署流程
    • 镜像推送
      docker tag local-image 192.168.200.100:5000/remote-image
      docker push 192.168.200.100:5000/remote-image
      
    • 远程服务器拉取并启动
      docker pull 192.168.200.100:5000/remote-image
      docker run -d --name service-name 192.168.200.100:5000/remote-image
      
7. Jenkins触发器配置
  • 触发方式
    • URL触发:通过访问特定URL触发构建(如http://jenkins-server/job/job-name/build?token=TOKEN)。
    • 定时构建:使用Cron表达式(如H H/2 * * *表示每2小时构建一次)。
    • 轮询SCM:定时检查代码仓库变更,触发构建。

关键代码解释说明

1. Dockerfile指令
  • FROM java:8:基于Java 8镜像构建。
  • ARG JAR_FILE:定义构建参数,用于传递JAR包路径。
  • COPY ${JAR_FILE} app.jar:将本地JAR包复制到容器内。
  • ENTRYPOINT:指定容器启动时执行的命令,支持动态参数(如$PARAMS)。
2. Maven多环境配置
  • pom.xml中的profiles
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
            </properties>
        </profile>
    </profiles>
    
    通过Maven Profile切换不同环境配置。
3. Jenkins Shell脚本
  • 清理旧容器
    docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
    
    根据任务名称($JOB_NAME)删除旧容器,避免冲突。
  • 镜像清理
    docker image prune -f
    
    删除未被使用的镜像,释放磁盘空间。
4. Cron表达式示例
  • H/30 * * * *:每30分钟构建一次。
  • 0 8,12,22 * * *:每天8点、12点、22点构建。

技术亮点

  1. 全流程自动化:从代码提交到镜像构建、测试、部署,全程无需人工干预。
  2. 环境隔离:通过Docker和Nacos实现多环境配置隔离,确保生产环境稳定性。
  3. 高效资源管理:利用Docker镜像和私有仓库,实现快速部署和版本回滚。
  4. 灵活触发机制:支持多种触发方式(如定时、代码变更),适应不同场景需求。