SpringBoot2 流水线构建方案
构建脚本
前提条件:系统需具备 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