淘客返利系统的CI/CD流水线搭建:Docker镜像构建与K8s部署实践

淘客返利系统的CI/CD流水线搭建:Docker镜像构建与K8s部署实践

大家好,我是 微赚淘客系统3.0 的研发者省赚客!

在微赚淘客系统3.0的演进过程中,为提升交付效率与系统稳定性,我们基于 GitLab CI + Harbor + Kubernetes 构建了完整的 CI/CD 流水线。从代码提交到生产环境部署,全程自动化,确保每次发布可追溯、可回滚、高可靠。

一、项目结构与Dockerfile设计

系统采用 Spring Boot 构建,主模块位于 juwatech.cn.rebate 包下。项目根目录包含标准 Dockerfile

dockerfile 复制代码
# 使用官方 OpenJDK 17 镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制 JAR 文件
COPY target/rebate-system-3.0.jar rebate-system.jar

# 暴露端口
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "rebate-system.jar"]

Maven 打包配置确保生成可执行 JAR:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>juwatech.cn.rebate.RebateApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

二、GitLab CI 流水线定义

.gitlab-ci.yml 定义四阶段流水线:build → test → build-image → deploy

yaml 复制代码
stages:
  - build
  - test
  - build-image
  - deploy

variables:
  DOCKER_IMAGE: harbor.juwatech.cn/rebate/rebate-system:${CI_COMMIT_SHORT_SHA}
  K8S_NAMESPACE: rebate-prod

# 构建阶段
build:
  stage: build
  image: maven:3.8-openjdk-17
  script:
    - mvn clean package -DskipTests
  artifacts:
    paths:
      - target/*.jar

# 单元测试
test:
  stage: test
  image: maven:3.8-openjdk-17
  script:
    - mvn test
  coverage: '/Total.*?([0-9]{1,3})%/'

# 构建并推送镜像
build-image:
  stage: build-image
  image: docker:20.10
  services:
    - docker:20.10-dind
  before_script:
    - echo "$HARBOR_PASSWORD" | docker login harbor.juwatech.cn -u "$HARBOR_USER" --password-stdin
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main

# 生产部署
deploy-prod:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - sed "s|{{IMAGE}}|$DOCKER_IMAGE|g" k8s/deployment.yaml | kubectl apply -f -
    - kubectl rollout status deployment/rebate-deployment -n $K8S_NAMESPACE --timeout=300s
  environment:
    name: production
  only:
    - main

三、Kubernetes 部署清单

k8s/deployment.yaml 模板使用占位符 {``{IMAGE}} 供 CI 替换:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rebate-deployment
  namespace: rebate-prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: rebate-system
  template:
    metadata:
      labels:
        app: rebate-system
    spec:
      containers:
        - name: rebate-app
          image: {{IMAGE}}
          ports:
            - containerPort: 8080
          env:
            - name: SPRING_PROFILES_ACTIVE
              value: "prod"
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: rebate-db-secret
                  key: host
          resources:
            requests:
              memory: "512Mi"
              cpu: "200m"
            limits:
              memory: "1Gi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            initialDelaySeconds: 60
            periodSeconds: 30
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: rebate-service
  namespace: rebate-prod
spec:
  selector:
    app: rebate-system
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

数据库凭证通过 Secret 管理:

bash 复制代码
kubectl create secret generic rebate-db-secret \
  --from-literal=host=db.juwatech.cn \
  --from-literal=username=rebate_user \
  --from-literal=password='S3cr3tP@ss!' \
  -n rebate-prod

四、Java 应用启动类示例

主启动类位于指定包路径,确保与 Dockerfile 一致:

java 复制代码
package juwatech.cn.rebate;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RebateApplication {
    public static void main(String[] args) {
        SpringApplication.run(RebateApplication.class, args);
    }
}

五、回滚与版本追踪

每次部署均基于 Git Commit ID 构建唯一镜像标签,支持快速回滚:

bash 复制代码
# 查看历史 ReplicaSet
kubectl get rs -n rebate-prod

# 回滚至上一版本
kubectl rollout undo deployment/rebate-deployment -n rebate-prod

同时,Prometheus + Grafana 监控 Pod 状态、CPU、内存及 HTTP 错误率,确保部署质量。

本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!

相关推荐
张忠琳2 分钟前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
Elastic 中国社区官方博客2 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
风曦Kisaki4 小时前
#企业级docker私有仓库构建:harbor仓库与阿里云镜像仓库
阿里云·docker·容器
期待着20134 小时前
docker 安装 ,在centos7.9
运维·docker·容器
骑上单车去旅行7 小时前
Docker Compose 命令完全指南:从构建到运维
docker·容器·eureka
前端Baymax8 小时前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc8 小时前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
java_logo8 小时前
Docker Compose 部署 Apache Superset:轻松搭建开源 BI 平台
docker·开源·apache·superset·轩辕镜像·superset部署方案·docker superset
zy happy8 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
AOwhisky10 小时前
云原生 DevOps 工具链从入门到实战(第一期)——DevOps概述与GitLab部署——从理念到工具落地
运维·ci/cd·云原生·gitlab·开发·devops