当前位置: 首页 > news >正文

DevOps -CI/CD 与自动化部署

DevOps - CI/CD 与自动化部署详解

DevOps 是一种结合开发(Development)与运维(Operations)的方法论,旨在通过工具和文化变革,促进软件开发和运维之间的协作,提升软件交付的效率、质量和稳定性。而在 DevOps 实践中,持续集成(CI)持续交付/持续部署(CD)自动化部署 是最为核心的组成部分。


1. CI/CD 的概念

1.1 持续集成(Continuous Integration, CI)

持续集成 是指开发者将代码频繁地(通常每天多次)集成到主干代码库中,并通过自动化构建和测试,确保集成后的代码是可用的、无冲突的。

CI 的关键目标是通过频繁的小规模集成,及时发现和解决代码冲突、集成错误以及潜在的质量问题,从而减少合并和集成的复杂性。典型的 CI 流程包括:

  • 每次代码提交(如 git push)时,自动触发构建过程。
  • 构建过程中运行单元测试和集成测试。
  • 如果测试失败,立即反馈给开发者,要求修复。
1.2 持续交付与持续部署(Continuous Delivery/Continuous Deployment, CD)

持续交付持续部署 是 CI 的延伸。两者的区别主要在于发布的自动化程度。

  • 持续交付(Continuous Delivery, CD):指在经过 CI 流程后,代码自动部署到预生产环境,并做好随时可以手动部署到生产环境的准备。持续交付的核心理念是让代码始终处于可以发布的状态,但最终的生产发布通常仍由开发或运维团队手动触发。

  • 持续部署(Continuous Deployment, CD):进一步自动化了持续交付的过程,即在代码通过所有测试和验证步骤后,自动将其发布到生产环境,不需要人为干预。持续部署的关键目标是让软件能够在任何时候自动交付到最终用户手中。

1.3 CI/CD 的好处

CI/CD 是现代软件开发流程中的核心部分,其好处包括:

  • 减少集成冲突:通过频繁集成和小规模变更,开发者可以更快发现和解决冲突问题。
  • 提高发布频率:CI/CD 流程让每次代码提交都经过严格的自动化测试和验证,使得发布流程更加可靠,从而提升发布频率。
  • 提高软件质量:通过自动化测试和代码检查,CI/CD 流程确保代码质量,降低发布到生产环境中的错误风险。
  • 增强团队协作:通过共享的 CI/CD 流程,开发和运维团队可以更好地协同工作,减少交付过程中的沟通成本。

2. CI/CD 的实现过程

CI/CD 的实现通常依赖一系列的自动化工具和流程,涵盖从代码提交到最终生产部署的全过程。下面介绍如何实现 CI/CD 流程。

2.1 持续集成的实现
2.1.1 代码版本控制

持续集成的基础是使用代码版本控制工具(如 Git)。开发者通过 Git 提交代码,自动化工具可以基于代码仓库中的事件(如 pushmerge request)自动触发构建和测试。

git add .
git commit -m "New feature implementation"
git push origin main
2.1.2 自动化构建

每次代码提交或合并后,CI 工具会自动拉取最新的代码,执行构建脚本,生成可执行文件或应用包。

常用的 CI 工具:

  • Jenkins:一个开源的自动化服务器,支持各种构建、测试和部署工具。
  • GitLab CI/CD:GitLab 集成的 CI/CD 工具,支持自动化构建、测试和部署。
  • CircleCITravis CIGitHub Actions 等。

示例:GitLab CI 配置文件 .gitlab-ci.yml

stages:- build- testbuild:stage: buildscript:- mvn clean installtest:stage: testscript:- mvn test
2.1.3 自动化测试

构建成功后,CI 工具会执行自动化测试。测试可以包括单元测试、集成测试、功能测试、性能测试等。自动化测试是确保代码质量的关键步骤。

JUnit 测试示例:

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;class ExampleTest {@Testvoid testAddition() {assertEquals(2, 1 + 1);}
}

CI 工具会自动运行这些测试,并报告测试结果。如果测试失败,CI 工具会发出警告或通知,要求开发者立即修复。

2.2 持续交付与持续部署的实现
2.2.1 部署到预生产环境

在代码通过所有测试后,CI/CD 工具可以自动将应用程序部署到预生产环境(如 QA 或 Staging 环境),以便进行更多的手动测试或自动化验收测试。

在部署过程中,通常会使用部署工具,如:

  • Ansible:配置管理和部署工具,适合大规模服务器管理。
  • Kubernetes:容器编排工具,支持自动化部署、扩展和管理容器化应用。
  • Docker:容器化平台,支持轻量级的应用部署。
2.2.2 持续部署到生产环境

如果采用持续部署,CI/CD 工具会在所有测试通过后,直接将代码部署到生产环境。这一过程完全自动化,无需人为干预。

例如,在 Kubernetes 中,可以通过 Helm Chart 实现自动化部署:

helm install my-app ./chart --set image.tag=latest

CI/CD 管道中的生产部署可以配置为在通过所有验证步骤后自动进行。以下是 Jenkins Pipeline 的示例,用于自动部署到 Kubernetes:

pipeline {agent anystages {stage('Build') {steps {sh 'mvn clean package'}}stage('Deploy to Kubernetes') {steps {sh 'kubectl apply -f k8s/deployment.yaml'}}}
}

3. 自动化部署的最佳实践

自动化部署是 DevOps 实践中的一个关键部分。以下是一些实施自动化部署的最佳实践:

3.1 基础设施即代码(IaC)

基础设施即代码(Infrastructure as Code, IaC)是一种通过代码来定义和管理基础设施的方式。使用工具如 Terraform、CloudFormation 或 Ansible,可以将服务器、网络、数据库等配置以代码的形式进行管理和版本控制。

resource "aws_instance" "web" {ami           = "ami-12345678"instance_type = "t2.micro"tags = {Name = "web-server"}
}

使用 IaC 可以确保环境的可重复性和一致性,避免手动配置带来的差异。

3.2 使用蓝绿部署和金丝雀部署

自动化部署到生产环境时,使用蓝绿部署(Blue-Green Deployment)和金丝雀部署(Canary Deployment)是常见的安全策略。

  • 蓝绿部署:同时运行两个生产环境(蓝色和绿色)。新的代码部署到绿色环境,验证其稳定性后再将流量切换到绿色环境,旧的蓝色环境可以作为回退的备用。
  • 金丝雀部署:将新版本应用逐步发布到一部分用户,监控其性能和稳定性,若无问题再将其全面发布。这种方式降低了全量发布的风险。
3.3 自动化回滚

当自动化部署发生失败时,应该支持自动化回滚机制,以便系统能够迅速恢复到上一个稳定状态。Kubernetes 和 Docker 等平台支持快速的回滚操作。

在 Kubernetes 中,可以通过如下命令进行回滚:

kubectl rollout undo deployment my-app
3.4 安全策略

在自动化部署中,安全性至关重要。确保自动化管道中使用的所有凭证、API 密钥和环境变量都受到保护。例如:

  • 使用密钥管理工具(如 HashiCorp Vault)存储和管理凭证。
  • 在 CI/CD 系统中使用 Secret 存储敏感信息,如 GitLab CI 的 secrets

4. CI/CD 工具生态

CI/CD 工具是实现持续集成和持续交付的核心,以下是一些流行的 CI/CD 工具:

4.1 Jenkins

Jenkins 是最为流行的

开源 CI/CD 工具,提供了强大的插件生态,支持几乎所有的编程语言和工具。Jenkins 通过流水线(Pipeline)配置文件,能够自动执行代码构建、测试和部署。

pipeline {agent anystages {stage('Build') {steps {sh 'mvn clean install'}}stage('Test') {steps {sh 'mvn test'}}}
}
4.2 GitLab CI/CD

GitLab CI/CD 是 GitLab 提供的内置 CI/CD 工具,完全集成在 GitLab 仓库中,方便开发者直接在版本控制系统中配置和管理 CI/CD 流程。

GitLab CI/CD 使用 .gitlab-ci.yml 文件定义流水线:

stages:- build- deploybuild:stage: buildscript:- mvn clean installdeploy:stage: deployscript:- kubectl apply -f k8s/deployment.yaml
4.3 GitHub Actions

GitHub Actions 是 GitHub 提供的 CI/CD 服务,允许开发者直接在 GitHub 仓库中编写自动化脚本。

name: CI Pipeline
on: [push]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Buildrun: mvn clean install

5. 总结

CI/CD 和自动化部署是 DevOps 实践的核心环节。通过持续集成(CI),开发团队可以更快地发现代码问题,提升代码质量;通过持续交付(CD)和持续部署,代码能够自动化部署到生产环境,从而缩短软件发布周期,减少人工干预。

DevOps 的最终目标是通过自动化的工具链、流程和文化变革,打破开发与运维之间的障碍,提升软件交付的频率和质量。在实施 CI/CD 和自动化部署时,使用正确的工具(如 Jenkins、GitLab CI、GitHub Actions 等)、应用基础设施即代码(IaC)理念、以及遵循蓝绿部署、金丝雀发布等策略,能够让整个软件开发、测试和部署过程变得更加高效、稳定和安全。

相关文章:

DevOps -CI/CD 与自动化部署

DevOps - CI/CD 与自动化部署详解 DevOps 是一种结合开发(Development)与运维(Operations)的方法论,旨在通过工具和文化变革,促进软件开发和运维之间的协作,提升软件交付的效率、质量和稳定性。…...

单体架构系统是不是已经彻底死亡?

单体架构系统并未“彻底死亡”,尽管在复杂和大规模的应用场景中,它可能不再是首选的架构模式。单体架构系统,也称为巨石系统(Monolithic),在软件发展过程中是最广泛的架构风格之一,出现时间最早…...

mathorcup发邮件:参赛必看邮件撰写技巧?

mathorcup发邮件的注意事项?如何使用mathorcup发信? 无论是提交参赛作品、咨询比赛规则,还是与组委会沟通,一封清晰、专业的邮件都能为你赢得更多机会。AokSend将为你详细介绍mathorcup发邮件的撰写技巧,帮助你在比赛…...

ESP01烧入AT出厂固件

ESP01是一种常见的WIFI模块,其核心是esp8266,常用于给主控拓展WIFI功能,因其体积较小、集成度高、造价便宜,常受到消费者喜爱,ESP01常用的开发方式有两种,一种是利用基于Arduino框架作为独立设备开发&#…...

Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽

一、概念 Qt 的信号与槽(Signals and Slots)机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信,从而提升了代码的模块化和可维护性。 信号(Signal):对象状态的变化或事件…...

民间故事推广系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,民族文化管理,节日类型管理,传统节日管理,故事类型管理,民间故事管理,系统管理 微信端账号功能包括:系统首…...

关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.总线超时,自动断开连接 当 SDAOUT 或 SCLOUT 为低电平时,将启动内部定时器。定时器仅在相应输入变为高电平时重置。如果在 30ms (典型值) 内没有变为高…...

C++ 异常

这里写目录标题 1.C语言传统的处理错误的方式2.C异常概念3.异常的用法3.1 异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.自定义异常体系5.标准库异常体系6.异常的优缺点 1.C语言传统的处理错误的方式 传统的错误处理机制: 1. 终止程序&#xff0c…...

ST官方 VSCode 插件安装及配置工程参考

写在前头 VSCode的用法和插件是月初参加ST官方北京站举办的线下培训中,厂家AE工程师给我们讲的,不同于已经很多人用的(并且一直在吵的)keil assistant什么的,用的是CMake编译,抛弃了原有的keil,…...

使用Pandas读取和写入数据库的Python函数实现

使用Pandas读取和写入数据库的Python函数实现 Pandas是一个强大的数据处理和分析库,广泛应用于数据科学和机器学习领域。结合数据库操作,Pandas可以极大地简化数据的读取和写入过程。本文将详细介绍如何使用Pandas实现读取和写入数据库的函数,涵盖数据库连接、数据读取、数…...

Redis——常用数据类型hash

目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值:设置成功的键值对的个数hget HGET key field//hdel HDEL key…...

基于Python实现一个庆祝中秋节的小程序

功能包括: 使用复杂的库来计算农历日期:可以使用 lunarcalendar 库来计算农历日期。提供更多的祝福语:可以通过随机选择祝福语来增加趣味性。加入图形用户界面 (GUI):可以使用 tkinter 库来创建一个简单的图形用户界面。 我们可…...

近期最值得买的数码好物有什么?2024兼具功能和实用性的好物分享

在如今这个科技飞速发展的时代,数码好物层出不穷,它们为我们带来了前所未有的便捷与乐趣。而对于学生党和上班族来说,挑选到既实用又性价比高的数码好物,更是能为学习和办公生活增添一抹亮丽的色彩。其中,电容笔便是备…...

云服务器中的MinIO 配置 HTTPS 过程(图文)

目录 1. 基本知识2. 实战3. 彩蛋1. 基本知识 具体证书的格式如下: 私钥:private.key公钥:public.crt (公钥以pem格式结尾,可直接改为crt格式)证书和私钥文件的命名和路径应该是: 证书文件: ~/.minio/certs/public.crt 私钥文件: ~/.minio/certs/private.key使用了自定义…...

注册安全分析报告:熊猫频道

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

计算机毕业设计 自习室座位预约系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

2000-2021年3月海关数据库

2000-2021年3月海关数据库 1、时间:2000-2021年3月 2、指标:2000-2015数据变量包括:年份、截止日期、进出口分类代码、进出口分类名称、HS商品编码、HS商品名称、金额_美元、数量、价格、经营单位代码、经营单位名称、经营单位地址、电话、…...

【YashanDB知识库】archivelog磁盘满导致数据库abnormal

本文转自YashanDB官网,具体内容可见archivelog磁盘满导致数据库abnormal 【问题分类】功能使用 【关键字】磁盘空间满,archivelog日志,archivelog自动清理 【问题描述】数据库状态变更为abnormal,检查V$DIAG_INCIDENT视图&#…...

远程跨境传输大文件如何做到安全又稳定?

在当今全球化的商业环境中,企业跨境传输大文件的需求日益增长。这不仅涉及到数据的快速迁移,还包括了安全性、稳定性和合规性等多重挑战。本文将探讨企业在跨境传输大文件时可能遇到的问题,以及在传输过程中应注意的事项,并重点介…...

JSON报文根据正则过滤消息

有时候业务系统在接收外部传过来的JSON报文,可能需要根据某个标识来判断是否是自己系统的消息,不是需要过滤。正常我们可能是先将JSON反序列化为具体实体类(例: A a JSON.parseObject(body,A.class)),然后获取具体字段来判断。此方法面对接收…...

BOM编程

什么是 BOM? BOM(Browser Object Model)是浏览器提供的对象和方法的集合,允许开发者操作浏览器窗口、页面跳转、URL、浏览器历史记录、用户设备信息等。window 对象是 BOM 的顶层对象,所有 BOM API 都直接或间接作为 …...

【C++ Primer Plus习题】16.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> usin…...

音视频入门基础:AAC专题(1)——AAC官方文档下载

一、AAC简介 高级音频编码&#xff08;英语&#xff1a;Advanced Audio Coding&#xff0c;AAC&#xff09;是有损音频压缩的专利数字音频编码标准&#xff0c;由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年&#xff0c;为一种基于MPEG…...

RAG与LLM原理及实践(17)---Docker Redis Python Usage

目录 背景 Redis 环境 download 修改镜像 Run Redis Coding python redis download 基本使用 描述 完整代码 运行结果 高阶用法 序列化的方式 Snapshot 与 AOF 快照(RDB) AOF(Append-Only File) 代码 总结 发布与订阅 描述 代码 运行结果 注…...

技术分享-商城篇-营销模块-优惠券种类(二十六)

前言 在之前的文章技术分享-商城篇-优惠券管理-功能介绍及种类&#xff08;二十四&#xff09; &#xff0c;有对优惠券设计做了阐述&#xff0c;优惠券作为一种强大的促销工具&#xff0c;不仅能够吸引新客户&#xff0c;还能促进现有客户的复购与订单金额的提升。但是优惠券…...

Apache-wed服务器环境的安装

一。安装httpd并且开启httpd yum install httpd systemctl start httpd 二。关闭防火墙 systemctl stop firewall 三。常规配置wed服务 mkdir /www vim index.html&#xff08;里面写入自己的内容&#xff09; chmod 755 index.htm chmod 755 /www vim /etc/httpd/co…...

HR8870:可PWM控制,4.5A直流有刷电机驱动数据手册

HR8870芯片描述 HR8870是一款直流有刷电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达4.5A的峰值电流双向控制电机。利用电流衰减模式&#xff0c;可通过对输入进行…...

3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)

前言&#xff1a; 笔者尝试过很多3D标注软件都遇到很多问题&#xff0c;例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐&#xff1b;labelCloud没有三视图&#xff0c;视角难以调整标得不够精确&#xff1b;SUSTechPOINTS换帧麻烦、输出时存储在docker里面…...

获取zabbix API 监控数据shell脚本,自动日常巡检服务器信息、并发送指定群组

一&#xff0c;前言 有zabbix监控&#xff0c;也并不是时刻盯着数据&#xff0c;所以想着&#xff0c;每天固定某个时刻&#xff0c;自动发送服务器数据到指定群组&#xff0c;给其他人更直观的数据。 数据就可以从zabbix API获取。参考官方API文档&#xff1a;https://www.z…...

【spring】maven引入okhttp的日志拦截器打开增量注解进程

HttpLoggingInterceptor 是在logging-interceptor库中的:这个logging库老找不到 import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor;发现这仨是独立的库 pom中三个依赖 <!-- OKHTTP3 --><...