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

相关推荐
阿里云云原生7 小时前
HiClaw 上线 Worker 模板市场,提供稳定可共享的 Agent 生产力
云原生
zhangfeng113312 小时前
CI/CD 是软件开发中的两个核心实践,合起来指代一套自动化的软件交付流程
运维·ci/cd·自动化
linux修理工12 小时前
在 Kali Linux 上安装 Docker
云原生·eureka
前端不太难13 小时前
鸿蒙游戏 CI/CD:为什么你还在手动打包?
游戏·ci/cd·harmonyos
牛奶咖啡1314 小时前
CI/CD——使用Jenkins自动化构建java项目之使用传统方式部署java web项目jpress
ci/cd·jenkins·jenkins创建任务·实现jpress的自动化部署·git的ssh主机密钥问题解决·配置ssh免密登录·在线安装jdk1.8环境
吃胖点儿16 小时前
云原生技术原理分层详解
云原生
菜鸟40419 小时前
Hermes实战案例_NAS 上跑了个 AI 管家:从信息孤岛到飞书一句话调度
云原生·eureka
牛奶咖啡131 天前
CI/CD——使用Jenkins实现自动化部署与持续集成之jenkins插件与凭据配置
ci/cd·jenkins·jenkins必备插件安装·jenkins全局工具配置·jenkins的凭据配置·jenkins自动化部署流程·jenkinsgitlab集成
吃胖点儿1 天前
CNCF全景图与云原生成熟度模型
云原生
胡小禾1 天前
K8S常识-如何指定只更新一个deployment中的某一个实例
云原生·容器·kubernetes