淘客返利系统的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 研发团队,转载请注明出处!

相关推荐
奥格列的魔法拖鞋~7 分钟前
Docker安装OpenClaw并接入飞书
docker·容器·飞书·openclaw
摇滚侠8 分钟前
我需要一个 Docker 安装 MySQL 8.0 的命令
mysql·docker·容器
Q168496451515 分钟前
k8s-通过ansible-playbook脚本将其他节点加入集群失败?
容器·kubernetes·ansible
糟糕喔1 小时前
k8s运维-亲和(5)
运维·容器·kubernetes
高旭博1 小时前
对openfuyao-bkeadm的内容分析
kubernetes
芥子沫1 小时前
有声书应用Audiobookshelf:Docker一键部署教程和使用指南
运维·docker·容器
海鸥811 小时前
k8s中实现进程环境的自动更新
云原生·容器·kubernetes
Ernest.Wu1 小时前
Canal基于Docker的部署操作手册
运维·docker
程序员爱酸奶1 小时前
Git + 云原生:构建坚如磐石的 Kubernetes 配置版本管理
git·云原生·kubernetes
面对疾风叭!哈撒给2 小时前
Linux之Docker使用JDK21安装包制作JDK21镜像包
java·linux·运维·docker