当前位置:首页 > 技术 > 正文内容

SpringBoot2 流水线构建方案

访客 技术 2026年10月2日 1

构建脚本

前提条件:系统需具备 git、maven 和 docker 环境。

说明:当前脚本为独立运行脚本,可用于镜像制作。

已集成项目构建的核心步骤,可根据实际项目需求进一步扩展功能。

#!/bin/bash

# ============================================
# Git 获取 + Maven 构建 + Docker 镜像生成
#
# 使用方法:./deploy.sh develop seaboot-admin:2.0.0
# ============================================

set -e  # 遇到错误即退出
set -o pipefail  # 管道任一环节失败则整体失败

# ==================== 配置部分 ====================
WORKSPACE='/app/project'
GIT_REPO="https://github.com/your-repo/seaboot-admin.git"  # Git仓库地址
GIT_BRANCH="${1:-main}"                     # 默认分支 main
IMAGE_NAME="${2:-seaboot-admin:1.0.0}"      # 镜像名称默认值
PROJECT_DIR="${WORKSPACE}/code"
TARGET_DIR="${PROJECT_DIR}/target"
DOCKERFILE="${PROJECT_DIR}/Dockerfile"

# 颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# ==================== 辅助函数 ====================
log_info() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] INFO:${NC} $1"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✓ $1${NC}"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ✗ $1${NC}"
}

log_warn() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] ⚠ $1${NC}"
}

# 检查必要命令
check_command() {
    if ! command -v "$1" &> /dev/null; then
        log_error "未检测到命令 '$1',请先安装!"
        exit 1
    fi
}

# ==================== 执行流程 ====================
echo -e "${GREEN}========== 开始部署流程 ==========${NC}"
log_info "分支: $GIT_BRANCH | 镜像: $IMAGE_NAME"

# 0. 环境校验
check_command git
check_command mvn
check_command docker

# 1. 初始化工作目录
log_info "创建并进入工作目录..."
mkdir -p "$WORKSPACE"
cd "$WORKSPACE"

# 2. Git 拉取源码
log_info "开始从 Git 拉取代码(分支:$GIT_BRANCH)..."

if [ ! -d "$PROJECT_DIR/.git" ]; then
    # 初次克隆
    log_warn "首次克隆代码仓库..."
    git clone -b "$GIT_BRANCH" "$GIT_REPO" "$PROJECT_DIR"
    if [ $? -ne 0 ]; then
        log_error "Git 克隆失败!"
        exit 1
    fi
else
    # 更新已有仓库
    cd "$PROJECT_DIR"
    git fetch origin
    git checkout "$GIT_BRANCH"
    git pull origin "$GIT_BRANCH"
fi

if [ $? -eq 0 ]; then
    log_success "Git 拉取完成"
else
    log_error "Git 拉取失败!"
    exit 1
fi

# 3. Maven 打包
log_info "开始 Maven 构建..."
cd "$PROJECT_DIR"

# 清除历史产物
rm -rf "$TARGET_DIR"

mvn clean package -DskipTests -Pprod

if [ $? -eq 0 ]; then
    # 确认 JAR 文件存在
    JAR_FILE=$(find "$TARGET_DIR" -name "*.jar" -type f | head -n 1)
    if [ -z "$JAR_FILE" ]; then
        log_error "未发现构建产物 JAR 文件!"
        exit 1
    fi
    log_success "Maven 构建成功: $JAR_FILE"
else
    log_error "Maven 构建失败!"
    exit 1
fi

# 4. Docker 构建镜像
log_info "开始构建 Docker 镜像..."

# 验证 Dockerfile 存在
if [ ! -f "$DOCKERFILE" ]; then
    log_error "缺少 Dockerfile: $DOCKERFILE"
    exit 1
fi

# 清理旧镜像(可选)
# docker rmi -f "${IMAGE_NAME%:*}" 2>/dev/null || true

docker build -t "${IMAGE_NAME}" .

if [ $? -eq 0 ]; then
    log_success "Docker 镜像构建成功: ${IMAGE_NAME}"

    # 展示镜像信息
    docker images "${IMAGE_NAME%:*}"
else
    log_error "Docker 镜像构建失败!"
    exit 1
fi

# 5. 清理缓存(可选)
log_info "清理 Maven 本地依赖..."
mvn dependency:purge-local-repository -q 2>/dev/null || true

echo -e "${GREEN}========== 脚本执行完毕!==========${NC}"
log_success "部署完成 🎉"

CI/CD 流水线结构优化建议

若希望将该脚本集成进正式的 CI/CD 系统,建议按模块拆分脚本。

结构示意如下:

 scripts/
├── 01-git-pull.sh        # 仅处理 Git 操作
├── 02-maven-build.sh     # 仅执行 Maven 构建
├── 03-docker-build.sh    # 仅构建 Docker 镜像
├── 04-docker-push.sh     # 仅推送镜像
├── 05-k8s-deploy.sh      # 仅部署至 Kubernetes
└── pipeline.sh           # 总控脚本(协调上述脚本)

例如使用 Jenkins Pipeline 的配置:

pipeline {
    agent any
    
    parameters {
        choice(name: 'ENV', choices: ['dev', 'test', 'prod'])
        string(name: 'GIT_BRANCH', defaultValue: 'main')
    }
    
    stages {
        stage('获取代码') {
            steps {
                sh 'bash scripts/01-git-pull.sh ${GIT_BRANCH}'
            }
        }
        
        stage('Maven 构建') {
            steps {
                sh 'bash scripts/02-maven-build.sh ${ENV}'
            }
        }
        
        stage('Docker 构建') {
            steps {
                sh 'bash scripts/03-docker-build.sh ${BUILD_NUMBER}'
            }
        }
        
        stage('推送镜像') {
            when { branch 'main' }
            steps {
                sh 'bash scripts/04-docker-push.sh ${BUILD_NUMBER}'
            }
        }
        
        stage('K8s 部署') {
            when { branch 'main' }
            steps {
                sh 'bash scripts/05-k8s-deploy.sh ${BUILD_NUMBER} prod'
            }
        }
    }
    
    post {
        success {
            dingtalk(
                robot: 'your-robot-id',
                type: 'MARKDOWN',
                title: '✅ 部署成功',
                text: "分支: ${GIT_BRANCH}\n镜像: seaboot-admin:${BUILD_NUMBER}"
            )
        }
        failure {
            dingtalk(
                robot: 'your-robot-id',
                type: 'MARKDOWN',
                title: '❌ 部署失败',
                text: "请查看 Jenkins 控制台"
            )
        }
    }
}

项目目录结构建议:

 project/
├── 📁 scripts/
│   ├── 01-git-pull.sh
│   ├── 02-maven-build.sh
│   ├── 03-docker-build.sh
│   ├── 04-docker-push.sh
│   ├── 05-k8s-deploy.sh
│   └── pipeline.sh           # 主流程控制
├── 📁 k8s/
│   ├── deployment.yaml
│   └── service.yaml
├── Jenkinsfile               # Jenkins 配置
├── .gitlab-ci.yml            # GitLab CI 配置
└── README.md

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。