《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)

在这里插入图片描述

文章目录

  • 6.1 CI/CD基础
    • 6.1.1 基础知识讲解
    • 6.1.2 重点案例:为 Python Web 应用实现 CI/CD
    • 6.1.3 拓展案例 1:自动化部署到云平台
    • 6.1.4 拓展案例 2:使用 Docker 容器化部署
  • 6.2 Git 与自动化测试
    • 6.2.1 基础知识讲解
    • 6.2.2 重点案例:为 Python 项目集成自动化测试
    • 6.2.3 拓展案例 1:集成测试与 CI 工具
    • 6.2.4 拓展案例 2:使用 Docker 容器运行测试
  • 6.3 部署策略与 Git
    • 6.3.1 基础知识讲解
    • 6.3.2 重点案例:使用 Git 触发 Python 应用的蓝绿部署
    • 6.3.3 拓展案例 1:使用Git标签管理版本和部署
    • 6.3.4 拓展案例 2:实现金丝雀发布

6.1 CI/CD基础

在现代软件开发实践中,持续集成(CI)和持续部署(CD)构成了快速、可靠地将代码从开发带到生产环境的基石。通过自动化测试和部署流程,团队可以更快地迭代和发布,同时保持高质量标准。

6.1.1 基础知识讲解

  • 持续集成(CI):CI 要求团队成员频繁地将代码变更集成到共享仓库中。每次集成都通过自动化构建和测试来验证,以便尽早发现并解决集成错误,提高代码质量。
  • 持续部署(CD):CD 自动化将软件从开发流程中的各个阶段(包括测试和验证)部署到生产环境。它确保了软件的快速、频繁和可靠的发布。
  • 工具和平台:有许多工具和平台支持 CI/CD 实践,包括 Jenkins、Travis CI、CircleCI 和 GitHub Actions 等。它们可以集成到 Git 工作流中,自动执行测试和部署。

6.1.2 重点案例:为 Python Web 应用实现 CI/CD

假设你正在开发一个基于 Flask 的 Python Web 应用,并希望实现 CI/CD 流程来自动化测试和部署。

步骤 1:配置 CI 工具

你选择 GitHub Actions 作为 CI 工具,因为它可以直接在 GitHub 仓库中配置。你创建了 .github/workflows/python-app.yml 文件来定义 CI 工作流程:

name: Python applicationon: [push]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Pythonuses: actions/setup-python@v2with:python-version: '3.8'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install flake8 pytestif [ -f requirements.txt ]; then pip install -r requirements.txt; fi- name: Lint with flake8run: |flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics- name: Test with pytestrun: |pytest

这个工作流程会在每次推送到仓库时自动运行,设置 Python 环境,安装依赖,运行 linting 和测试。

6.1.3 拓展案例 1:自动化部署到云平台

你的应用部署在 AWS Elastic Beanstalk 上。在相同的 GitHub Actions 工作流中,你添加了自动化部署的步骤:

    - name: Deploy to Elastic Beanstalkrun: |pip install awsebclieb deploy YourEnvironmentNameenv:AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

这确保了每次推送更改时,应用都会被自动部署到 AWS。

6.1.4 拓展案例 2:使用 Docker 容器化部署

为了确保环境一致性,你决定使用 Docker 容器化你的 Flask 应用。在 Docker Hub 上创建了一个仓库后,你更新了 CI 工作流,包括构建 Docker 镜像并将其推送到 Docker Hub 的步骤:

    - name: Build and push Docker imagerun: |docker build -t yourusername/yourappname:${{ github.sha }} .echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdindocker push yourusername/yourappname:${{ github.sha }}

这样,你的 Flask 应用在每次更改时都会被打包为 Docker 镜像并上传,随后可以从任何支持 Docker 的环境中部署。

通过本章,你已经学会了如何利用 Git 和 CI/CD 工具来自动化你的 Python Web 应用的测试和部署过程。这不仅加快了开发和发布速度,还提高了代码质量和部署的可靠性。现在,让我们继续探索 Git 的更多奥秘,让你的开发流程更加自动化、高效吧!

在这里插入图片描述


6.2 Git 与自动化测试

在软件开发的世界里,自动化测试不仅是一个好习惯,它是保证代码质量和项目稳定性的生命线。与 Git 结合使用时,自动化测试可以在每次提交和合并时验证代码更改,确保新增的代码不会破坏现有的功能或引入新的错误。

6.2.1 基础知识讲解

  • 自动化测试的重要性:自动化测试通过执行一系列的测试用例来验证代码的正确性,这些测试可以是单元测试、集成测试或端到端测试。
  • 与Git结合的自动化测试:通过在 Git 钩子(如 pre-commitpre-push)中触发测试脚本,或在 CI/CD 流程中集成测试,可以确保每次代码提交或部署之前都不会违反测试约束。
  • 测试框架:Python 社区有多种测试框架可用,如 unittestpytest 等,它们可以帮助你编写和执行测试。

6.2.2 重点案例:为 Python 项目集成自动化测试

假设你正在开发一个 Python 库,用于处理日期和时间的计算。你希望在每次提交代码时自动运行单元测试,以确保更改不会引入错误。

步骤 1:编写单元测试

首先,使用 pytest 为你的功能编写单元测试:

# test_datetime_calculations.py
from datetime_calculations import add_days_to_datedef test_add_days_to_date():assert add_days_to_date("2021-01-01", 30) == "2021-01-31"

步骤 2:配置 pre-commit 钩子

.git/hooks/pre-commit 文件中,添加以下内容以运行测试:

#!/bin/sh
pytest
if [ $? -ne 0 ]; thenecho "Tests failed, commit aborted."exit 1
fi

不要忘记使钩子脚本可执行:

chmod +x .git/hooks/pre-commit

现在,每次尝试提交时,pytest 都会自动运行,如果任何测试失败,提交将被阻止。

6.2.3 拓展案例 1:集成测试与 CI 工具

你的项目开始增加复杂度,需要集成测试来验证各个组件如何协同工作。你决定使用 GitHub Actions 来自动化这一过程。

.github/workflows/python-app.yml 中配置 CI 工作流:

name: Python applicationon: [push]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Pythonuses: actions/setup-python@v2with:python-version: '3.8'- name: Install dependenciesrun: |pip install pytest- name: Run testsrun: |pytest

这样,每次推送到仓库时,GitHub Actions 都会自动运行你的集成测试。

6.2.4 拓展案例 2:使用 Docker 容器运行测试

随着你的应用依赖于更多外部服务,如数据库,你决定使用 Docker 来运行测试,以确保环境的一致性。

你创建了一个 Dockerfiledocker-compose.test.yml 来定义测试环境:

# Dockerfile
FROM python:3.8
WORKDIR /app
COPY . .
RUN pip install pytest
CMD ["pytest"]
# docker-compose.test.yml
version: '3'
services:test:build: .volumes:- .:/app

然后,你可以使用以下命令运行测试:

docker-compose -f docker-compose.test.yml up --build

通过本章,你已经探索了如何将 Git 与自动化测试结合,从而提高代码质量和项目稳定性。不管是通过 Git 钩子在本地运行测试,还是通过 CI/CD 工具在云端自动化测试流程,或是在 Docker 容器中确保测试环境的一致性,这些技巧都将成为你软件开发工具箱中不可或缺的部分。继续前进,让自动化测试成为你软件开发过程中的忠实伙伴吧!

在这里插入图片描述


6.3 部署策略与 Git

在软件开发的征程中,如何将代码从仓库安全高效地部署到生产环境,是一个值得深入探讨的话题。Git,作为版本控制的利器,不仅帮助我们管理代码变更,还能与部署策略紧密结合,确保软件交付的流畅性和稳定性。

6.3.1 基础知识讲解

  • 部署策略概述:部署策略定义了代码从开发过程中如何移动到生产环境的方法论。常见的策略包括直接部署、蓝绿部署和金丝雀发布。
  • 直接部署:最简单的部署方式,直接将更改推送到生产环境。虽然操作简单,但缺乏灵活性和安全网。
  • 蓝绿部署:同时运行两个生产环境(蓝和绿)。一旦新版本准备就绪(绿),就将流量从旧版本(蓝)切换到新版本,从而减少了部署风险。
  • 金丝雀发布:逐步向用户推出新版本,先从少数用户开始,逐渐扩大范围,以监控新版本的表现并减少风险。

6.3.2 重点案例:使用 Git 触发 Python 应用的蓝绿部署

假设你负责一个用Flask编写的Python Web应用,你决定采用蓝绿部署策略来减少部署风险。

步骤 1:配置Git钩子

你在服务器上配置了一个Git钩子,在post-receive中添加脚本来触发部署流程。

#!/bin/sh
# 在 post-receive 钩子中
git --work-tree=/path/to/green/deployment checkout -f
# 触发脚本来切换蓝绿环境
./switch-blue-green.sh

步骤 2:实施蓝绿切换

switch-blue-green.sh 脚本负责将生产流量从蓝环境切换到绿环境。

#!/bin/bash
# switch-blue-green.sh
# 此脚本假设你有一个负载均衡器能够切换流量
# 切换流量到绿环境
echo "切换到绿环境"
# 更新负载均衡器配置的逻辑

6.3.3 拓展案例 1:使用Git标签管理版本和部署

在一个更成熟的CI/CD流程中,你可以使用Git标签来标记发布版本。这样,每次部署都基于一个确切的版本,增加了可追溯性。

步骤:在你的本地仓库,当你准备发布新版本时:

git tag -a v1.0.1 -m "Release version 1.0.1"
git push origin v1.0.1

然后,你的CI/CD流程可以配置为在新标签被推送时自动部署对应的版本到生产环境。

6.3.4 拓展案例 2:实现金丝雀发布

为了渐进式地部署新版本,你决定实施金丝雀发布。这需要更复杂的基础设施支持,如可以根据特定规则路由流量的负载均衡器。

步骤:通过Git分支来管理不同的发布阶段。例如,将新功能合并到canary分支,并配置CI/CD工具在这个分支上的更新触发金丝雀发布流程。

git checkout canary
git merge feature/new-awesome-feature
git push origin canary

CI/CD工具检测到canary分支的更新后,自动部署这些更改到仅限一小部分用户访问的环境。根据反馈,你可以决定是否将更改推广到所有用户。

通过本章,你已经了解了如何利用Git和不同的部署策略来优化你的软件交付过程。蓝绿部署和金丝雀发布提供了安全网,让你可以更自信地发布新版本,而Git的灵活性则确保了整个过程的顺畅和高效。现在,让我们继续探索,将这些策略应用到你的项目中,为你的用户带来更好的软件体验吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2776398.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】数据结构

本文是基于中国MOOC平台上,华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记,便于后期讲行系统性查阅和复习。 从个人感受而言,华中科技大学的课程讲解更适合初学者(缺点在于,从概念到…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识; c. 学会自我思考,提升认知,不要只会模仿; 课程内容 1. Fine-Tuning 有什么作用? a. 什么是模型训练&#xff…

redis的主从配置模拟(一主双从)

目录 先来给大家扩展机道面试官经常会问到关于redis的题 一、redis有哪些好处 二、redis相比memcached有哪些优势 三、redis常见性能问题和解决方案 四、redis集群的工作原理 五、redis主从的原理 redis的主从配置模拟(一主双从) 一、准备环境 …

TCP 传输控制协议——详细

目录 1 TCP 1.1 TCP 最主要的特点 1.2 TCP 的连接 TCP 连接,IP 地址,套接字 1.3 可靠传输的工作原理 1.3.1 停止等待协议 (1)无差错情况 (2)出现差错 (3)确认丢失和确认迟到…

JetpackCompose之状态管理

JetPack Compose系列(13)—状态管理 State 即,状态。官方的解释是: State in an application is any value that can change over time. And ****event can notify a part of a program that something has happened. 可以这样…

113.路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

cleanmymacX和腾讯柠檬哪个好用

很多小伙伴在使用Mac时,会遇到硬盘空间不足的情况。遇到这种情况,我们能做的就是清理掉一些不需要的软件或者一些占用磁盘空间较大的文件来腾出空间。我们可以借助一些专门的清理工具,本文中我们来推荐几款好用的Mac知名的清理软件。并且将Cl…

【Git】Windows下通过Docker安装GitLab

私有仓库 前言基本思路拉取镜像创建挂载目录创建容器容器启动成功登录仓库设置中文更改密码人员审核配置邮箱 前言 由于某云存在人数限制,这个其实很好理解,毕竟使用的是云服务器,人家也是要交钱的。把代码完全放在别人的服务器上面&#xf…

百家cms代审

环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。(在Mysql命令行中执行) 接下来访问CMS,会默认跳转至安装界面 数据库名称和…

114.乐理基础-五线谱-快速识别五线谱的谱号

内容参考于:三分钟音乐社 上一个内容:113.乐理基础-五线谱-五线谱的调号(二)-CSDN博客 15个调号,如下图,该怎样才能随便拿出一个来就能快速的知道这是什么调号呢? 一共分为三个要点&#xff1…

单片机学习笔记---DS1302时钟

上一节我们讲了DS1302的工作原理,这一节我们开始代码演示。 新创建一个工程写上框架 我们需要LCD1602进行显示,所以我们要将LCD1602调试工具那一节的LCD1602的模块化代码给添加进来 然后我们开始创建一个DS1302.c和DS1302.h 根据原理图,为了…

牛客网SQL进阶114:更新记录

官网链接: 更新记录(二)_牛客题霸_牛客网现有一张试卷作答记录表exam_record,其中包含多年来的用户作答试卷记录,结构如下表。题目来自【牛客题霸】https://www.nowcoder.com/practice/0c2e81c6b62e4a0f848fa7693291d…

肯尼斯·里科《C和指针》第13章 高级指针话题(2)函数指针

我们不会每天都使用函数指针。但是,它们的确有用武之地,最常见的两个用途是转换表(jump table)和作为参数传递给另一个函数。本节将探索这两方面的一些技巧。但是,首先容我指出一个常见的错误,这是非常重要的。 简单声明一个函数指…

【MATLAB源码-第138期】基于matlab的D2D蜂窝通信仿真,对比启发式算法,最优化算法和随机算法的性能。

操作环境: MATLAB 2022a 1、算法描述 D2D蜂窝通信介绍 D2D蜂窝通信允许在同一蜂窝网络覆盖区域内的终端设备直接相互通信,而无需数据经过基站或网络核心部分转发。这种通信模式具有几个显著优点:首先,它可以显著降低通信延迟&…

铱塔 (iita) 开源 IoT 物联网开发平台,基于 SpringBoot + TDEngine +Vue3

01 铱塔 (iita) 物联网平台 铱塔智联 (open-iita) 基于Java语言的开源物联网基础开发平台,提供了物联网及相关业务开发的常见基础功能, 能帮助你快速搭建自己的物联网相关业务平台。 铱塔智联平台包含了品类、物模型、消息转换、通讯组件(mqtt/EMQX通讯组…

1、 快速上手 [代码级手把手解diffusers库析]

快速上手Pipeline 内部执行步骤后续更新计划 diffusers是Hugging Face推出的一个diffusion库,它提供了简单方便的diffusion推理训练pipe,同时拥有一个模型和数据社区,代码可以像torchhub一样直接从指定的仓库去调用别人上传的数据集和pretrai…

Linux中ps/kill/execl的使用

ps命令: ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令: kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…

RocketMQ(二):领域模型(生产者、消费者)

1 生产者(Producer) 本节介绍Apache RocketMQ 中生产者的定义、模型关系、内部属性、版本兼容和使用建议。 1.1 定义 生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。 生产者通常被集成在业务系统中,将业务消息按照要…

C++基础入门之引用

目录 一.引用 1.1引用和取地址 1.2 别名和原名的区别 1.3 引用的用法 1.31 做参数 1.311 输出型参数:形参改变实参 1.312 可以减少拷贝,增加效率 1.32 引用的约定 1. 引用必须初始化 2. 引用定义后,不能改变指向 4. 给指针取别名 1.33…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…