导购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开发者团队,转载请注明出处!

相关推荐
测试修炼手册3 小时前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
米高梅狮子4 小时前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
IpdataCloud5 小时前
稳定的企业级IP数据接口怎么选?可用性指标+离线库高可用方案
运维·网络·tcp/ip
WebGIS开发5 小时前
地信职业百科②:GIS运维
运维·gis·就业·转行
淘矿人5 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
JiaWen技术圈5 小时前
nginx 安全响应头 介绍
运维·nginx·安全
IMPYLH5 小时前
Linux 的 unexpand 命令
linux·运维·服务器·bash
|_⊙6 小时前
Linux 文件知识 补充
linux·运维·服务器
十六年开源服务商8 小时前
2026服务器配置优化与WordPress运维实战指南
android·运维·服务器
LN花开富贵10 小时前
Ubuntu aarch64 架构安装 NoMachine 远程控制 避坑与实战
linux·运维·笔记·学习·ubuntu·嵌入式