云原生与容器--CI/CD 流水线设计实践

系列导读:本篇将深入讲解 CI/CD 流水线的设计与最佳实践。


文章目录

    • [一、CI/CD 概述](#一、CI/CD 概述)
      • [1.1 什么是 CI/CD?](#1.1 什么是 CI/CD?)
      • [1.2 CI/CD 工具对比](#1.2 CI/CD 工具对比)
    • [二、GitOps 实践](#二、GitOps 实践)
      • [2.1 GitOps 原则](#2.1 GitOps 原则)
      • [2.2 GitOps 工作流](#2.2 GitOps 工作流)
    • [三、Jenkins 流水线](#三、Jenkins 流水线)
      • [3.1 Jenkinsfile](#3.1 Jenkinsfile)
    • [四、GitLab CI/CD](#四、GitLab CI/CD)
      • [4.1 .gitlab-ci.yml](#4.1 .gitlab-ci.yml)
    • 五、最佳实践
      • [5.1 分支策略](#5.1 分支策略)
      • [5.2 流水线原则](#5.2 流水线原则)
      • [5.3 质量门禁](#5.3 质量门禁)
    • 总结

一、CI/CD 概述

1.1 什么是 CI/CD?

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    CI/CD 流程                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  代码提交 ──► CI ──► CD ──► 生产环境                         │
│              │      │                                       │
│              ▼      ▼                                       │
│           构建     部署                                      │
│           测试     发布                                      │
│           扫描     监控                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 CI/CD 工具对比

工具 类型 特点
Jenkins 自托管 插件丰富、灵活
GitLab CI 内置 与 GitLab 集成
GitHub Actions 云服务 与 GitHub 集成
ArgoCD GitOps K8s 原生
Tekton 云原生 K8s 原生

二、GitOps 实践

2.1 GitOps 原则

复制代码
1. 声明式:所有配置都是声明式的
2. 版本化:Git 作为单一事实来源
3. 自动化:自动应用变更
4. 持续协调:持续监控状态差异

2.2 GitOps 工作流

复制代码
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  应用仓库    │ ──► │  配置仓库   │ ──► │   ArgoCD    │
│  (代码)     │     │  (清单)      │     │  (同步)     │
└─────────────┘     └─────────────┘     └─────────────┘
                                               │
                                               ▼
                                        ┌─────────────┐
                                        │ Kubernetes  │
                                        └─────────────┘

三、Jenkins 流水线

3.1 Jenkinsfile

groovy 复制代码
// Jenkinsfile
pipeline {
    agent any
    
    environment {
        REGISTRY = 'registry.example.com'
        IMAGE_NAME = 'order-service'
        IMAGE_TAG = "${env.BUILD_NUMBER}"
    }
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        
        stage('Build') {
            steps {
                sh './mvnw clean package -DskipTests'
            }
        }
        
        stage('Test') {
            steps {
                sh './mvnw test'
            }
            post {
                always {
                    junit '**/target/surefire-reports/*.xml'
                }
            }
        }
        
        stage('SonarQube') {
            steps {
                withSonarQubeEnv('SonarQube') {
                    sh './mvnw sonar:sonar'
                }
            }
        }
        
        stage('Build Image') {
            steps {
                sh "docker build -t ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} ."
            }
        }
        
        stage('Push Image') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'registry-credentials',
                    usernameVariable: 'USER',
                    passwordVariable: 'PASS'
                )]) {
                    sh "docker login -u ${USER} -p ${PASS} ${REGISTRY}"
                    sh "docker push ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
                }
            }
        }
        
        stage('Deploy to Dev') {
            steps {
                sh "kubectl set image deployment/${IMAGE_NAME} ${IMAGE_NAME}=${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} -n dev"
            }
        }
        
        stage('Deploy to Prod') {
            when {
                branch 'main'
            }
            input {
                message "Deploy to Production?"
                ok "Deploy"
            }
            steps {
                sh "kubectl set image deployment/${IMAGE_NAME} ${IMAGE_NAME}=${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} -n prod"
            }
        }
    }
    
    post {
        success {
            slackSend(color: 'good', message: "Build ${IMAGE_TAG} succeeded!")
        }
        failure {
            slackSend(color: 'danger', message: "Build ${IMAGE_TAG} failed!")
        }
    }
}

四、GitLab CI/CD

4.1 .gitlab-ci.yml

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

variables:
  REGISTRY: registry.example.com
  IMAGE_NAME: order-service

build:
  stage: build
  image: maven:3.8-openjdk-11
  script:
    - mvn clean package -DskipTests
  artifacts:
    paths:
      - target/*.jar
    expire_in: 1 hour

test:
  stage: test
  image: maven:3.8-openjdk-11
  script:
    - mvn test
  artifacts:
    reports:
      junit: target/surefire-reports/*.xml

sonarqube:
  stage: test
  image: maven:3.8-openjdk-11
  script:
    - mvn sonar:sonar -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_TOKEN

docker-build:
  stage: package
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $REGISTRY_USER -p $REGISTRY_PASS $REGISTRY
    - docker build -t $REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHA .
    - docker push $REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHA

deploy-dev:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/$IMAGE_NAME $IMAGE_NAME=$REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHA -n dev
  environment:
    name: development
  only:
    - develop

deploy-prod:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/$IMAGE_NAME $IMAGE_NAME=$REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHA -n prod
  environment:
    name: production
  when: manual
  only:
    - main

五、最佳实践

5.1 分支策略

复制代码
main (生产)
  │
  ├── develop (开发)
  │     │
  │     ├── feature/xxx (功能)
  │     ├── feature/yyy
  │     │
  │     └── release/x.x (发布)
  │
  └── hotfix/xxx (修复)

5.2 流水线原则

复制代码
1. 快速反馈:CI 阶段 < 10分钟
2. 自动化测试:单元测试 + 集成测试
3. 安全扫描:代码扫描 + 镜像扫描
4. 环境隔离:Dev → Test → Staging → Prod
5. 回滚机制:一键回滚

5.3 质量门禁

yaml 复制代码
# 质量门禁配置
quality-gates:
  unit-test-coverage: 80%
  sonar-quality-gate: true
  security-vulnerabilities: 0 critical
  docker-image-scan: pass

总结

✅ CI/CD 概述 :持续集成、持续部署

✅ GitOps 实践 :声明式、版本化

✅ Jenkins 流水线 :Jenkinsfile 配置

✅ GitLab CI/CD :.gitlab-ci.yml 配置

✅ 最佳实践:分支策略、质量门禁

下篇预告 :云原生架构设计模式


作者 :刘~浪地球
系列 :云原生与容器(四)
更新时间:2026-04-15

相关推荐
Henry-SAP30 分钟前
SAP MMBE跨工厂库存层级展示解析
人工智能·云原生·sap·erp
troy1284 小时前
K8s 平台测试清单:深度分析与实战指南
云原生·容器·kubernetes
Henry-SAP10 小时前
SAP PP核心引擎计划策略业务解析
人工智能·云原生·sap·erp
陈陈CHENCHEN1 天前
【Kubernetes】纯 IPv6 K8s 集群访问外部 IPv4 服务
云原生·容器·kubernetes
troy1281 天前
如何在谷歌云(Google Cloud)上部署 Kubernetes 集群
云原生·容器·kubernetes
xiaoligangting1 天前
太原岗亭款式齐全
云原生
行者-全栈开发1 天前
【码动四季·秋】从 commit 到发版全自动:Conventional Commits + semantic-release 发布流水线实战
git·ci/cd·自动化发布·atomgit·semantic-releas·语义化版本自动化·git 提交规范落地
分布式存储与RustFS2 天前
升级 RustFS 二进制不停机:一条一条换,留一条退路
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
xiaoligangting2 天前
太原防火岗亭
云原生
键盘鼓手苏苏2 天前
ESLint 规则渐进式升级:从 0 警告到全面开启的迁移策略(续篇)
云原生·kubernetes·k8