导购APP容器化CI/CD流程:Jenkins在返利系统持续部署中的实践

导购APP容器化CI/CD流程:Jenkins在返利系统持续部署中的实践

大家好,我是省赚客APP研发者阿宝!

在聚娃科技省赚客返利系统的日常迭代中,我们面临多环境(dev/test/staging/prod)、多微服务(用户中心、订单核销、返现引擎等)的高频发布需求。为提升交付效率与系统稳定性,我们基于Jenkins构建了一套完整的容器化CI/CD流水线,结合Docker、Helm与Kubernetes,实现从代码提交到生产部署的自动化闭环。

整体CI/CD架构

我们的流水线分为四个阶段:

  1. 代码检出与静态检查:Git触发 → SonarQube扫描;
  2. 镜像构建与推送:Maven编译 → Docker Build → 推送至Harbor;
  3. Helm Chart版本管理:动态生成values.yaml,打Tag并推送到Chart仓库;
  4. K8s滚动部署:通过kubectl或ArgoCD应用新版本。

所有配置以Jenkinsfile声明式Pipeline实现,确保流程可复用、可审计。

Jenkinsfile核心实现

以下为返利核心服务cashback-service的Jenkinsfile片段:

groovy 复制代码
pipeline {
    agent any
    environment {
        APP_NAME = 'cashback-service'
        REGISTRY = 'harbor.juwatech.cn'
        CHART_REPO = 'https://charts.juwatech.cn'
        NAMESPACE = "${params.ENV == 'prod' ? 'prod' : 'staging'}"
    }
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        stage('Build & Test') {
            steps {
                sh 'mvn clean compile -DskipTests'
                sh 'mvn test -Dtest=juwatech.cn.cashback.*Test'
            }
        }
        stage('Sonar Scan') {
            steps {
                withSonarQubeEnv('sonar-server') {
                    sh 'mvn sonar:sonar -Dsonar.projectKey=${APP_NAME}'
                }
            }
        }
        stage('Build Docker Image') {
            steps {
                script {
                    def imageTag = "${REGISTRY}/juwatech/${APP_NAME}:${BUILD_NUMBER}"
                    sh "docker build -t ${imageTag} ."
                    sh "docker push ${imageTag}"
                    env.IMAGE_TAG = imageTag
                }
            }
        }
        stage('Deploy to K8s') {
            steps {
                sh """
                    helm upgrade --install ${APP_NAME} \\
                        --repo ${CHART_REPO} cashback-chart \\
                        --namespace ${NAMESPACE} \\
                        --set image.repository=${REGISTRY}/juwatech/${APP_NAME} \\
                        --set image.tag=${BUILD_NUMBER} \\
                        --set replicaCount=${params.REPLICAS ?: 2}
                """
            }
        }
    }
}

Dockerfile与Java工程集成

项目根目录下的Dockerfile采用多阶段构建,仅打包最终JAR:

dockerfile 复制代码
# Stage 1: 编译
FROM maven:3.8.6-jdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# Stage 2: 运行
FROM openjdk:11-jre-slim
LABEL maintainer="dev@juwatech.cn"
COPY --from=builder /app/target/cashback-service-*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

其中,主启动类位于juwatech.cn.cashback.CashbackApplication

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

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

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

Helm Chart结构设计

每个服务对应独立Chart,目录结构如下:

复制代码
cashback-chart/
├── Chart.yaml
├── values.yaml
└── templates/
    ├── deployment.yaml
    └── service.yaml

values.yaml支持动态覆盖:

yaml 复制代码
replicaCount: 2
image:
  repository: harbor.juwatech.cn/juwatech/cashback-service
  tag: "latest"
  pullPolicy: IfNotPresent
env:
  JAVA_OPTS: "-Xmx512m -Xms256m"

在CI中通过--set参数注入构建号,确保版本可追溯。

权限与安全控制

为避免Jenkins过度权限,我们采用最小化原则:

  • Jenkins Agent运行于独立Namespace;
  • 使用K8s ServiceAccount绑定RBAC角色,仅允许操作指定命名空间;
  • Harbor镜像仓库启用项目级权限,Jenkins凭据通过K8s Secret挂载。

Jenkins凭据配置示例(credentials binding插件):

groovy 复制代码
stage('Push to Harbor') {
    environment {
        HARBOR_USER = credentials('harbor-robot-account')
    }
    steps {
        sh "docker login ${REGISTRY} -u ${HARBOR_USER_USR} -p ${HARBOR_USER_PSW}"
        // ... push
    }
}

回滚与蓝绿发布支持

当生产环境出现异常,可通过Jenkins快速回滚至前一版本:

groovy 复制代码
stage('Rollback') {
    when { 
        expression { params.ROLLBACK == true } 
    }
    steps {
        sh """
            PREV_TAG=$(helm history ${APP_NAME} -n ${NAMESPACE} | awk 'NR==3 {print $2}')
            helm rollback ${APP_NAME} \$PREV_TAG -n ${NAMESPACE}
        """
    }
}

对于关键服务,我们正在试点蓝绿发布,通过Istio流量切分实现零 downtime 升级,后续将集成至Jenkins Pipeline。

监控与通知

每次部署完成后,自动发送结果至企业微信:

groovy 复制代码
post {
    success {
        sh 'curl -X POST -H "Content-Type: application/json" -d \'{"msgtype":"text","text":{"content":"[CI/CD] ${APP_NAME} 部署成功,版本:${BUILD_NUMBER}"}}\' ${WECHAT_WEBHOOK}'
    }
    failure {
        sh 'curl -X POST -H "Content-Type: application/json" -d \'{"msgtype":"text","text":{"content":"[CI/CD] ${APP_NAME} 部署失败!"}}\' ${WECHAT_WEBHOOK}'
    }
}

目前,该流程支撑省赚客每日30+次部署,平均交付时长从2小时缩短至8分钟,发布事故率下降90%。

本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!

相关推荐
J2虾虾9 小时前
Docker启动超时,吓得我一身汗
运维·docker·容器
一生只为赢9 小时前
通俗易懂:ARM指令的寻址方式(三)
运维·arm开发·数据结构·嵌入式实时数据库
运维行者_9 小时前
2026 技术升级,OpManager 新增 AI 网络拓扑与带宽预测功能
运维·网络·数据库·人工智能·安全·web安全·自动化
液态不合群10 小时前
Nginx多服务静态资源路径冲突解决方案
运维·nginx
Getgit10 小时前
Linux 下查看 DNS 配置信息的常用命令详解
linux·运维·服务器·面试·maven
数通工程师11 小时前
企业级硬件防火墙基础配置实战:从初始化到规则上线全流程
运维·网络·网络协议·tcp/ip·华为
岁岁种桃花儿11 小时前
详解kubectl get replicaset命令及与kubectl get pods的核心区别
运维·nginx·容器·kubernetes·k8s
捷智算云服务12 小时前
告别运维割裂!捷智算GPU维修中心重新定义“全栈式”维修新标准
运维·服务器·性能优化
青火coding12 小时前
SOFAServerless架构的意义
java·运维·中间件·架构·serverless
橘颂TA12 小时前
【Linux 网络】TCP 拥塞控制与异常处理:从原理到实践的深度剖析
linux·运维·网络·tcp/ip·算法·职场和发展·结构与算法