【CI/CD】Jenkins + Docker +SpringCloud微服务项目持续集成

news/2025/2/27 5:45:27

文章目录

  • Jenkins + Docker + SpringCloud 微服务持续集成流程
    • 一、流程概述
    • 二、Harbor 安装与配置
      • 1. 环境准备
      • 2. 安装 Docker
      • 3. 安装 Docker Compose
      • 4. 安装 Harbor
      • 5. 访问 Harbor
      • 6. 创建项目与用户
    • 三、Docker 节点配置
      • 1. 信任 Harbor 仓库
    • 四、微服务持续集成实现
      • 1. 项目代码管理
      • 2. Jenkins Pipeline 脚本
      • 3. 部署脚本 (`deploy.sh`)
    • 五、多服务器部署扩展
      • 1. 动态选择部署目标
      • 2. 配置文件参数
    • 注意

Jenkins + Docker + SpringCloud 微服务持续集成流程

一、流程概述

  1. 代码提交:开发人员将代码推送至 GitLab 仓库。
  2. 镜像构建:Jenkins 拉取代码,编译打包为 WAR/JAR,并构建 Docker 镜像。
  3. 镜像推送:将镜像上传至 Harbor 私有仓库。
  4. 部署应用:Jenkins 通过 SSH 触发生产服务器从 Harbor 拉取镜像并启动容器
  5. 用户访问:通过容器暴露的服务访问应用。

二、Harbor 安装与配置

1. 环境准备

服务器:192.168.80.14
依赖组件:Docker、Docker Compose

2. 安装 Docker

# 安装 Docker
yum install -y docker
systemctl start docker
systemctl enable docker

3. 安装 Docker Compose

# 下载并安装 Docker Compose
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v  # 验证安装

4. 安装 Harbor

# 下载并解压 Harbor
wget https://github.com/goharbor/harbor/releases/download/v1.9.2/harbor-offline-installer-v1.9.2.tgz
tar -zxvf harbor-offline-installer-v1.9.2.tgz -C /opt
cd /opt/harbor

# 修改配置文件
vim harbor.yml
---
hostname: 192.168.80.14  # 修改为当前服务器 IP
port: 85                  # 修改监听端口
---

# 启动 Harbor
./install.sh
docker-compose ps         # 查看服务状态

5. 访问 Harbor

  • 地址http://192.168.80.14:85
  • 默认账户admin / Harbor12345

6. 创建项目与用户

  1. 新建项目
    • 项目名称:tensquare
    • 访问级别:私有
  2. 创建用户
    • 用户名:zhangsan
    • 密码:Abc123456
  3. 添加成员
    • 将用户 zhangsan 添加到项目 tensquare,角色为 维护人员

三、Docker 节点配置

1. 信任 Harbor 仓库

在所有 Docker 节点修改配置文件:

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.80.14:85"]
}
EOF

systemctl daemon-reload
systemctl restart docker

四、微服务持续集成实现

1. 项目代码管理

  1. GitLab 创建项目
    • 项目名称:tensquare_back
    • 群组:devops_group
    • 可见性:私有
  2. 上传代码
git clone http://192.168.80.20:82/devops_group/tensquare_back.git
cd tensquare_back
git add .
git commit -m "Initial commit"
git push -u origin master

2. Jenkins Pipeline 脚本

pipeline {
  agent any
  environment {
    git_url = "http://192.168.80.20:82/devops_group/tensquare_back.git"
    git_auth = "gitlab-auth-id"                # Jenkins 中配置的 GitLab 凭据 ID
    harbor_url = "192.168.80.14:85"
    harbor_project_name = "tensquare"
    harbor_auth = "harbor-auth-id"             # Jenkins 中配置的 Harbor 凭据 ID
    project_name = "tensquare-service"         # 微服务项目名称
    port = "8080"                              # 服务端口
  }
  stages {
    // 1. 拉取代码
    stage('拉取代码') {
      steps {
        checkout([
          $class: 'GitSCM',
          branches: [[name: "*/${branch}"]],
          extensions: [],
          userRemoteConfigs: [[
            credentialsId: "${git_auth}",
            url: "${git_url}"
          ]]
        ])
      }
    }

    // 2. 编译公共子工程
    stage('编译公共子工程') {
      steps {
        sh "mvn -f common-module clean install"
      }
    }

    // 3. 构建镜像并推送至 Harbor
    stage('构建与推送镜像') {
      steps {
        script {
          sh "mvn -f ${project_name} clean package dockerfile:build"
          def imageName = "${project_name}:latest"
          sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
          withCredentials([usernamePassword(
            credentialsId: "${harbor_auth}",
            usernameVariable: 'USERNAME',
            passwordVariable: 'PASSWORD'
          )]) {
            sh "docker login -u ${USERNAME} -p ${PASSWORD} ${harbor_url}"
            sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
          }
          sh "docker rmi -f ${imageName}"
          sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
        }
      }
    }

    // 4. 部署到生产服务器
    stage('部署应用') {
      steps {
        sshPublisher(
          publishers: [
            sshPublisherDesc(
              configName: 'production-server',  # Jenkins 中配置的 SSH 服务器名称
              transfers: [
                sshTransfer(
                  execCommand: "bash /opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_project_name} ${project_name} ${port}",
                  sourceFiles: 'deploy.sh'       # 部署脚本上传到服务器
                )
              ]
            )
          ]
        )
      }
    }
  }
}

3. 部署脚本 (deploy.sh)

#!/bin/bash
harbor_url=$1
harbor_project=$2
project_name=$3
port=$4

# 拉取镜像
docker pull ${harbor_url}/${harbor_project}/${project_name}:latest

# 停止并删除旧容器
docker stop ${project_name} || true
docker rm ${project_name} || true

# 启动新容器
docker run -d --name ${project_name} -p ${port}:${port} \
  ${harbor_url}/${harbor_project}/${project_name}:latest

五、多服务器部署扩展

1. 动态选择部署目标

修改 stage('部署应用') 以支持多服务器:

stage('部署应用') {
  steps {
    script {
      def selectedServers = "${publish_server}".split(",")
      for (server in selectedServers) {
        sshPublisher(
          publishers: [
            sshPublisherDesc(
              configName: "${server}",
              transfers: [
                sshTransfer(
                  execCommand: "bash /opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_project_name} ${project_name} ${port}",
                  sourceFiles: 'deploy.sh'
                )
              ]
            )
          ]
        )
      }
    }
  }
}

2. 配置文件参数

  • Jenkins 参数
    • branch:代码分支(如 masterdev
    • publish_server:部署目标服务器(如 master_server,slave_server

注意

  1. 凭据管理

    • GitLab 和 Harbor 的账号密码需在 Jenkins 的 凭据管理 中提前配置。
    • 使用 withCredentials 安全传递敏感信息。
  2. Harbor HTTPS 配置

    • 生产环境建议启用 HTTPS,修改 harbor.yml 并配置证书。
  3. 镜像清理

    • 构建后清理本地镜像,避免磁盘空间占用。
  4. 部署脚本权限

    • 确保生产服务器上的 deploy.sh 有执行权限:
      chmod +x /opt/jenkins_shell/deploy.sh
      
  5. 网络与防火墙

    • 确保 Jenkins、Harbor、生产服务器之间的网络互通,开放相关端口(如 85、8080)。

http://www.niftyadmin.cn/n/5869551.html

相关文章

学习Flask:[特殊字符] Day 3:数据库集成

学习目标&#xff1a;使用SQLAlchemy操作数据库 from flask_sqlalchemy import SQLAlchemyapp.config[SQLALCHEMY_DATABASE_URI] sqlite:///site.db db SQLAlchemy(app)class User(db.Model):id db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(20),…

【论文解读】Kimi开源《Muon is Scalable for LLM Training》

Github&#xff1a;https://github.com/MoonshotAI/Moonlight HF&#xff1a;https://huggingface.co/moonshotai/Moonlight-16B-A3B Paper&#xff1a;https://github.com/MoonshotAI/Moonlight/blob/master/Moonlight.pdf 1. 摘要 背景与动机 随着大语言模型&#xff08;LLM&…

JavaScript 系列之:Ajax、Promise、Axios

前言 同步&#xff1a;会阻塞。同步代码按照编写的顺序逐行依次执行&#xff0c;只有当前的任务完成后&#xff0c;才会执行下一个任务。 异步&#xff1a;异步代码不会阻塞后续代码的执行。当遇到异步操作时&#xff0c;JavaScript 会将该操作放入任务队列中&#xff0c;继续…

苹果折叠屏iPhone突破折痕难题 或将在2026年发布

&#xff08;2025年2月26日&#xff09;据供应链最新消息&#xff0c;苹果联合三星与美国安费诺公司&#xff0c;在折叠屏核心技术上取得重大突破&#xff0c;首款折叠屏iPhone样品已接近理想水平&#xff0c;最快将于2026年底上市。 屏幕采用三星供应的内折OLED柔性屏&#x…

OpenCV计算摄影学(5)处理一系列图像(例如视频帧)的非局部均值去噪的函数fastNlMeansDenoisingColoredMulti()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对用于彩色图像序列的 fastNlMeansDenoisingMulti 函数的修改。 cv::fastNlMeansDenoisingColoredMulti 函数是 OpenCV 中用于处理一系列图像&am…

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…

【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)

本文项目编号 T 219 &#xff0c;文末自助获取源码 \color{red}{T219&#xff0c;文末自助获取源码} T219&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

博云先进算力管理平台AIOS已上线全尺寸DeepSeek系列模型

在异构基础设施上轻松运行全尺寸DeepSeek DeepSeek于2024年12月发布了包括 DeepSeek V3、R1、Janus Pro等多版本模型。V3版本适用于通用型自然语言处理任务&#xff0c;R1专注于复杂推理任务&#xff0c;而 Janus Pro 则擅长多模态理解与生成&#xff0c;可满足企业不同 AI 场…