当前位置: 首页 > news >正文

第十二章:完整的 DevOps 流水线案例:Spring Boot + Docker + K8s + GitLab CI

本章将 CI/CD 系列的所有知识点串联起来,构建一个从代码提交到生产部署的完整 DevOps 流水线。以 Spring Boot 应用为例,涵盖代码检查、单元测试、镜像构建与扫描、Helm 部署、多环境管理、健康检查与回滚等全部环节。这是一个可以直接复制到实际项目中的生产级模板。

一、项目全景
1.1 技术栈

1.2 流水线 Stages
text
lint → test → build → scan → package → deploy-staging → deploy-production
二、项目结构
text
spring-boot-app/
├── .gitlab-ci.yml # CI/CD 流水线定义
├── Dockerfile # 多阶段构建
├── pom.xml # Maven 配置
├── src/ # 应用源码
│ └── main/
│ └── java/
├── chart/ # Helm Chart
│ ├── Chart.yaml
│ ├── values.yaml
│ ├── values/
│ │ ├── staging.yaml
│ │ └── production.yaml
│ └── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl
└── k8s/ # GitOps 部署清单(可选)
└── overlays/
├── staging/
└── production/
三、Dockerfile:多阶段构建
dockerfile

阶段1:构建(使用完整 JDK)

FROM maven:3.8.4-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

阶段2:运行(使用精简 JRE)

FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT [“java”, “-jar”, “/app/app.jar”]
四、Helm Chart 模板
chart/values.yaml:

# 默认配置replicaCount:2image:repository:${CI_REGISTRY_IMAGE}tag:latestpullPolicy:IfNotPresentservice:type:ClusterIPport:8080ingress:enabled:falsehost:""resources:limits:cpu:500mmemory:512Mirequests:cpu:250mmemory:256MilivenessProbe:httpGet:path:/actuator/healthport:8080initialDelaySeconds:30periodSeconds:10readinessProbe:httpGet:path:/actuator/healthport:8080initialDelaySeconds:10periodSeconds:5chart/templates/deployment.yaml:
apiVersion:apps/v1kind:Deploymentmetadata:name:{{include "myapp.fullname" .}}labels:app.kubernetes.io/name:{{include "myapp.name" .}}app.kubernetes.io/instance:{{.Release.Name}}spec:replicas:{{.Values.replicaCount}}selector:matchLabels:app.kubernetes.io/name:{{include "myapp.name" .}}app.kubernetes.io/instance:{{.Release.Name}}template:metadata:labels:app.kubernetes.io/name:{{include "myapp.name" .}}app.kubernetes.io/instance:{{.Release.Name}}spec:containers:-name:{{.Chart.Name}}image:"{{ .Values.image.repository }}:{{ .Values.image.tag }}"imagePullPolicy:{{.Values.image.pullPolicy}}ports:-containerPort:{{.Values.service.port}}livenessProbe:{{-toYaml .Values.livenessProbe|nindent 10}}readinessProbe:{{-toYaml .Values.readinessProbe|nindent 10}}resources:{{-toYaml .Values.resources|nindent 10}}

五、GitLab CI 完整流水线
.gitlab-ci.yml:

stages:-lint-test-build-scan-package-deploy-staging-deploy-productionvariables:MAVEN_OPTS:"-Dmaven.repo.local=.m2/repository"IMAGE_TAG:$CI_COMMIT_SHORT_SHACHART_PATH:./chartcache:paths:-.m2/repository/# ========== Stage 1: 代码检查 ==========lint:stage:lintimage:maven:3.8.4-openjdk-17script:-mvn checkstyle:checkallow_failure:trueonly:-merge_requests-main# ========== Stage 2: 单元测试 ==========test:unit:stage:testimage:maven:3.8.4-openjdk-17script:-mvn testartifacts:reports:junit:target/surefire-reports/*.xmlpaths:-target/surefire-reports/coverage:'/Coverage: \d+\.\d+%/'# ========== Stage 3: 构建镜像 ==========build-image:stage:buildimage:docker:latestservices:-docker:dindvariables:DOCKER_TLS_CERTDIR:"/certs"DOCKER_BUILDKIT:1script:-docker login-u $CI_REGISTRY_USER-p $CI_REGISTRY_PASSWORD $CI_REGISTRY-docker build--cache-from $CI_REGISTRY_IMAGE:latest-t $CI_REGISTRY_IMAGE:$IMAGE_TAG .-docker push $CI_REGISTRY_IMAGE:$IMAGE_TAGonly:-main-develop# ========== Stage 4: 镜像安全扫描 ==========scan-image:stage:scanimage:aquasec/trivy:latestscript:-trivy image--severity HIGH,CRITICAL--exit-code 1 $CI_REGISTRY_IMAGE:$IMAGE_TAGonly:-main# ========== Stage 5: 打包 Helm Chart ==========package-chart:stage:packageimage:alpine/helm:3.14script:-cd $CHART_PATH-helm dependency build-helm lint .-helm package .artifacts:paths:-$CHART_PATH/*.tgzonly:-main# ========== Stage 6: 部署到预发布环境 ==========deploy-staging:stage:deploy-stagingimage:alpine/helm:3.14before_script:-mkdir-p $HOME/.kube-echo "$KUBECONFIG_STAGING"|base64-d>$HOME/.kube/configscript:-cd $CHART_PATH-helm upgrade--install myapp ./ \-f values/staging.yaml \--set image.tag=$IMAGE_TAG \--namespace staging \--atomic \--timeout 5m-kubectl rollout status deployment/myapp-n stagingenvironment:name:stagingurl:https://staging.myapp.example.comonly:-develop-main# ========== Stage 7: 部署到生产环境(手动触发) ==========deploy-production:stage:deploy-productionimage:alpine/helm:3.14before_script:-mkdir-p $HOME/.kube-echo "$KUBECONFIG_PRODUCTION"|base64-d>$HOME/.kube/configscript:-cd $CHART_PATH-helm upgrade--install myapp ./ \-f values/production.yaml \--set image.tag=$IMAGE_TAG \--namespace production \--atomic \--timeout 5m-kubectl rollout status deployment/myapp-n productionenvironment:name:productionurl:https://myapp.example.comonly:-mainwhen:manual

六、多环境 Values 文件
chart/values/staging.yaml:

replicaCount:1resources:limits:cpu:200mmemory:256Mirequests:cpu:100mmemory:128Miingress:enabled:truehost:"staging.myapp.example.com"chart/values/production.yaml:
replicaCount:3resources:limits:cpu:500mmemory:512Mirequests:cpu:250mmemory:256Miingress:enabled:truehost:"myapp.example.com"

七、GitOps 版本:使用 ArgoCD 替代直接部署
如果采用 GitOps 模式,将 deploy-staging 和 deploy-production 替换为更新 Git 仓库的 Job:

update-gitops-staging:stage:deploy-stagingimage:alpine/git:latestscript:-git clone https://gitlab.com/team/gitops-repo.git-cd gitops-repo-sed -i "s|tag:.*|tag:$IMAGE_TAG|g" overlays/staging/kustomization.yaml-git config user.email "ci@gitlab.com"-git config user.name "GitLab CI"-git add .-git commit -m "deploy staging:$IMAGE_TAG"-git push https://$GITLAB_USER:$GITLAB_TOKEN@gitlab.com/team/gitops-repo.git mainenvironment:name:stagingonly:-main

ArgoCD 会自动检测 Git 仓库变更并将新镜像部署到集群。

八、流水线执行流程
text

  1. 开发人员提交代码到 develop 分支
  2. lint:代码风格检查
  3. test:单元测试 + 覆盖率报告
  4. build:构建 Docker 镜像并推送到仓库
  5. scan:Trivy 漏洞扫描(仅 main 分支)
  6. package:打包 Helm Chart
  7. deploy-staging:自动部署到预发布环境
  8. (人工审批)
  9. deploy-production:部署到生产环境
    九、故障处理与回滚
    9.1 自动回滚
    Helm 的 --atomic 参数会在升级失败时自动回滚到上一个版本。

9.2 手动回滚

# 查看发布历史helmhistorymyapp-nproduction# 回滚到指定版本helm rollback myapp2-nproduction

9.3 在 CI 中集成回滚

rollback-production:stage:deploy-productionimage:alpine/helm:3.14script:-helm rollback myapp $ROLLBACK_REVISION-n productiononly:-mainwhen:manual

十、监控与告警集成(可选)
在流水线最后,可集成监控告警:

notify-deployment:stage:deploy-productionimage:curlimages/curl:latestscript:-curl -X POST -H "Content-type:application/json" \--data '{"text":"✅ 部署成功: myapp 版本 $IMAGE_TAG 已上线"}' \ $SLACK_WEBHOOKonly:-main

十一、小结
本章构建了一条完整的 DevOps 流水线,覆盖了从代码提交到生产部署的全流程。核心要点:

多阶段构建:Dockerfile 分离编译和运行环境,减小镜像体积

镜像安全扫描:Trivy 在部署前阻断高危漏洞

Helm 管理配置:通过 values 文件区分环境,保持部署一致性

多环境隔离:staging 自动部署,production 手动触发

原子部署:–atomic 确保失败时自动回滚

将这套流水线应用到实际项目中,即可实现从代码提交到生产的全自动化、可追溯、可回滚的交付体系。

http://www.jsqmd.com/news/1104113/

相关文章:

  • 传输层双模对决:Stdio 与 Streamable HTTP 部署方案性能对比及选型依据
  • 十五年的“冷板凳”:昆仑芯IPO是对百度长期主义的最好回报
  • 2026滁州黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • 为什么你的IDEA多模块项目永远跑不通?揭秘被官方文档隐藏的6个IDEA专属Maven生命周期陷阱
  • 美国公司弃 Claude 选 DeepSeek:成本降了,性能还提升了!
  • Windows 11终极优化指南:使用Win11Debloat实现51%系统性能提升的完整方案
  • Momenta港股招股:营收三年翻三倍,65%市占率能否成物理AI时代定义者?
  • 内部知识库 RAG Skill:构建文档 MCP Server 实现技术问答零延迟
  • Go+DeepSeek-V3构建企业级代码审计系统
  • Windows 11任务栏逆向工程:Taskbar11深度技术解密与高级定制指南
  • 高分Panel复现系列|三元突变比例图:从三组比例到三角坐标映射
  • 2026年食品行业PLM系统实施路径:从需求梳理到平台落地的关键步骤
  • KMR221与PIC18F86J55高精度电压监测系统设计
  • 抖音内容下载终极指南:5分钟掌握批量下载与音频提取技巧
  • 基于TB9051FTG与PIC18F的静音直流电机控制方案
  • 万邦 Onebound alibaba.item.get 1688 商品详情 API(支持传入商品链接自动解析)
  • GESP4级C++考试语法知识(二、指针与数组(3、二维数组与指针)
  • 值班岗亭测评:日硕科技材质工艺佳但价格高,适合预算足的场所
  • PCL-PEO-PCL 三嵌段共聚物的自组装行为
  • 靠谱的openclaw哪家技术强
  • GPT-5.5 多轮对话中容易陷入死循环,有解决方案吗?防循环死锁实战指南
  • 源码级拆解 MCP 初始化握手:能力协商、协议版本识别与安全校验全流程
  • 价差400倍!词元超市终结AI算力定价乱象
  • 项目分析:优势、挑战与初步步骤
  • 性价比高的无外机厨房空调供应商哪个好
  • 华为云Flexus+DeepSeek征文|Flexus X 实例一键部署 Dify + DeepSeek,搭建企业级知识库问答助手
  • 薄膜沉积CVD/PVD/ALD怎么选:一文看懂适用场景
  • 该原标题存在营销诱导词,不符合要求,若按照关键词“重罪辩护”生成趋势洞察型标题,可改为:2026年重罪辩护行业趋势洞察:策略与挑战并存
  • BIMBase 数据直达 CesiumLab 与 CIMRTS:纹理和属性,不必再二选一
  • 山东性价比高的网上阅卷厂家