云原生与容器--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

相关推荐
SilentSamsara2 小时前
Linux 管道与重定向:命令行精髓的结构性解析
linux·运维·服务器·c++·云原生
刘~浪地球16 小时前
云原生与容器--Kubernetes 生产环境部署实战
云原生·容器·kubernetes
cyber_两只龙宝17 小时前
【Docker】Docker的资源限制
linux·运维·服务器·docker·云原生·容器
cyber_两只龙宝1 天前
【Oracle】Oracle之SQL中的单行函数
linux·运维·数据库·sql·云原生·oracle
迷藏4941 天前
**超融合架构下的Go语言实践:从零搭建高性能容器化微服务集群**在现代云原生时代,*
java·python·云原生·架构·golang
立莹Sir1 天前
AI+云原生:当智能遇见敏捷,技术融合的未来之路
人工智能·云原生
刘~浪地球1 天前
云原生与容器--Docker 容器化最佳实践
docker·云原生·容器
老卢聊运维1 天前
CoreDNS配置详解:forward、cache、rewrite插件最佳实践指南
运维·云原生·kubernetes