Python Web开发中的持续集成与持续交付(CI/CD)

news2024/9/20 21:17:04

Python Web开发中的持续集成与持续交付(CI/CD)

目录

  1. 🛠 CI/CD 基础
    • 1.1 持续集成(CI)与持续交付(CD)的基本概念
    • 1.2 CI/CD 对敏捷开发的作用
  2. 📝 Pipeline 配置
    • 2.1 使用 GitHub Actions、GitLab CI 配置自动化工作流
    • 2.2 自动化测试、构建、部署流程的实现
  3. 🔄 蓝绿部署与滚动更新
    • 3.1 零停机的应用部署策略
    • 3.2 使用 Docker、Kubernetes 实现滚动更新
  4. 🛡 环境隔离与配置管理
    • 4.1 使用 Docker 容器化部署环境,确保一致性
    • 4.2 使用环境变量进行配置管理

1. 🛠 CI/CD 基础

1.1 持续集成(CI)与持续交付(CD)的基本概念

**持续集成(CI)持续交付(CD)**是现代软件开发中提高效率与质量的核心实践。持续集成意味着开发者在开发过程中频繁地将代码集成到共享的主干中,并通过自动化测试和构建系统及时发现问题。而持续交付则是在持续集成的基础上,自动化地将代码从开发环境交付到生产环境中,确保每次更新都是可交付的。

**持续集成(CI)**主要包括以下几个步骤:

  • 频繁提交代码:开发人员每天或多次将代码推送到主代码库。频繁的小步提交有助于快速发现问题,并缩短开发周期。
  • 自动化测试与构建:每次提交代码后,自动化系统会进行单元测试、集成测试和代码构建,确保新代码不会破坏已有功能。

**持续交付(CD)**的核心是自动化的部署流程,具体体现在:

  • 自动部署到测试环境:在确保代码通过了所有测试之后,自动将代码部署到测试环境中进行验收测试或性能测试。
  • 自动部署到生产环境:在某些场景下,持续交付还包括自动化的生产部署(通常称为持续部署),每当代码通过所有质量关卡后,能够无缝地发布到生产环境。

CI/CD 结合使用,有助于加速软件开发周期,提高产品发布的频率和质量,减少人工操作带来的错误。

1.2 CI/CD 对敏捷开发的作用

在敏捷开发中,CI/CD 是推动项目迭代和快速交付的关键工具。其主要作用体现在以下几个方面:

  • 快速反馈循环:通过自动化测试与部署,开发团队可以在每次提交后立即得到反馈。这种快速反馈机制有助于迅速定位问题并减少故障的积累。
  • 提升发布频率:通过自动化的持续交付,团队能够更频繁地将新功能或修复发布到生产环境。这样可以确保产品的功能和性能不断优化,符合用户的期望。
  • 减少集成风险:在敏捷开发中,频繁的迭代意味着代码的不断更新。持续集成通过频繁集成与测试,能够及早发现并解决集成过程中产生的冲突与错误,降低集成风险。

因此,CI/CD 是敏捷开发过程中不可或缺的技术手段,它不仅提升了开发效率,还显著降低了产品发布的风险。


2. 📝 Pipeline 配置

2.1 使用 GitHub Actions、GitLab CI 配置自动化工作流

GitHub ActionsGitLab CI 是目前最流行的 CI/CD 工具,它们允许开发者基于代码库直接配置自动化工作流,包括代码测试、构建、部署等操作。两者通过定义 .yaml 文件,实现灵活的 Pipeline 配置。

GitHub Actions 自动化工作流

GitHub Actions 使用 .github/workflows/ 目录下的 YAML 文件进行配置。以下是一个典型的 GitHub Actions 配置示例,它展示了如何在代码提交后自动运行测试并进行构建:

name: Python CI

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Check out the repository
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.8'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run tests
        run: |
          pytest

上述 YAML 配置文件定义了一个名为 Python CI 的工作流。当代码推送到 main 分支时,GitHub Actions 将自动拉取代码,设置 Python 环境,安装依赖并运行测试。

GitLab CI 自动化工作流

GitLab CI 通过 .gitlab-ci.yml 文件配置,类似于 GitHub Actions。以下是一个典型的 GitLab CI 配置,它展示了如何使用 Docker 容器进行 Python 应用的构建与测试:

stages:
  - build
  - test

build:
  stage: build
  image: python:3.8
  script:
    - pip install -r requirements.txt
    - python setup.py build
  only:
    - main

test:
  stage: test
  image: python:3.8
  script:
    - pip install -r requirements.txt
    - pytest
  only:
    - main

.gitlab-ci.yml 文件定义了 buildtest 两个阶段。GitLab CI 将在 main 分支代码推送后自动执行这些阶段,确保代码的正确性。

2.2 自动化测试、构建、部署流程的实现

在 CI/CD 中,自动化测试、构建和部署是不可或缺的环节。这些操作可以通过工具配置流水线(Pipeline)实现,确保从代码提交到生产环境发布的过程都是全自动化的。

  • 自动化测试:通过集成工具如 pytestunittest,每次提交代码后,自动运行测试,确保功能正常。例如:

    def test_add():
        assert add(2, 3) == 5
    

    该函数可以集成到 CI 工作流中,保证每次提交后的代码都通过测试。

  • 自动化构建:自动化构建包括依赖安装、项目编译等过程。通过配置工作流,代码在每次提交后自动编译并生成构建产物。

  • 自动化部署:通过 GitHub Actions、GitLab CI,结合 Docker 或 Kubernetes,可以将代码自动化部署到生产环境。例如,在完成构建后,可以自动将 Docker 镜像推送到容器注册表,并在 Kubernetes 集群中执行部署更新。


3. 🔄 蓝绿部署与滚动更新

3.1 零停机的应用部署策略

在高可用性系统中,应用更新往往需要做到零停机,这时就需要使用蓝绿部署滚动更新策略。它们都是为了减少用户访问的中断而设计的部署方式。

蓝绿部署

蓝绿部署是一种经典的部署策略,其核心思想是在更新应用时,维护两个环境:蓝色环境(当前的生产环境)和绿色环境(待部署的新环境)。当绿色环境部署并验证通过后,流量会从蓝色环境切换到绿色环境,确保用户几乎感觉不到服务的中断。

# 蓝绿部署示例:切换服务版本
deploy:
  stage: deploy
  script:
    - deploy-to-green-env
    - test-green-env
    - switch-traffic-to-green

在这个示例中,新的应用版本先部署到绿色环境,然后进行测试,最后将流量切换到绿色环境。

3.2 使用 Docker、Kubernetes 实现滚动更新

滚动更新是一种无缝更新的策略,主要应用于容器化和微服务架构中。在滚动更新过程中,系统逐个更新实例,而不是一次性重启所有实例。这样,旧版本的服务在更新期间仍然可用。

使用 Docker 和 Kubernetes 实现滚动更新

Kubernetes 原生支持滚动更新策略,以下是 Kubernetes 配置文件中如何设置滚动更新的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
       

 image: my-app:v2

在这个配置文件中,Kubernetes 会使用滚动更新的方式逐步将容器从版本 v1 更新到 v2,并确保在更新过程中至少有 2 个实例始终可用。


4. 🛡 环境隔离与配置管理

4.1 使用 Docker 容器化部署环境,确保一致性

在 CI/CD 中,环境的一致性是确保代码能够稳定运行的基础。Docker 容器技术可以有效地解决环境配置不一致的问题。通过 Docker,开发人员可以将应用及其依赖打包到一个标准化的容器中,确保在不同的环境中运行时行为一致。

Docker 容器化的关键在于使用 Dockerfile 文件定义应用的运行环境。例如:

FROM python:3.8-slim

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

CMD ["python", "app.py"]

这个简单的 Dockerfile 定义了一个 Python 环境,并自动安装项目的依赖。开发人员可以在 CI/CD Pipeline 中自动构建这个 Docker 镜像,确保部署到任何环境中的应用都具有相同的运行时。

4.2 使用环境变量进行配置管理

配置管理是 CI/CD 中非常重要的一部分。通过环境变量进行配置管理,可以确保应用在不同环境中(开发、测试、生产)的灵活性。使用环境变量而不是硬编码配置,能够提升应用的可移植性和安全性。

在 Docker 和 Kubernetes 中,环境变量的使用非常普遍。例如:

env:
  - name: DATABASE_URL
    value: "mysql://user:password@localhost/db"

通过这种方式,可以确保应用程序在不同环境下连接不同的数据库或其他服务,而无需修改代码。

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

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

相关文章

python获取滑块验证码需要滑动的距离

我们以这个网站为例: http://120.86.191.138/hbgs/zwgk/dirData.do?dirId402881204e959150014e959f42f30014&subjectId93e889f2501d3fe8015024305bdf0efc 往后点到第四页后会出现验证码 一.获取到背景图片和缺口图片 我们发现图片是base64格式通过API直接发送 二.识别缺…

铲屎官进!宠物空气净化器真的有用吗?哪款去浮毛效果好

国庆小长假就要来了,别人都在苦恼抢票问题,而我在想会不会被我妈赶出家门... 毕业后我就留在了广州上班,独自一人租房难免会感觉孤独,就养了一只小猫和我作伴。这次放假这么久,我不放心留它一个人在家,也没…

vulhub搭建漏洞环境docker-compose up -d命令执行报错以及解决方法汇总

在利用vulhub靶场搭建环境进行漏洞复现时,我们通常要使用这一步命令: docker-compose up -d 但是经常报错,今天我们来说几个常见的报错以及解决方法: 1.报错提示: ERROR: Couldnt connect to Docker daemon at httpdoc…

基于atlas环境下YOLOV7的睡岗识别

做到这里,其实只是想探索下新的检测框架、探索下atlas下ACL的推理方式。整个过程持续了3-4周把,回顾一下,感觉还是需要一些技巧才能拿下,如果没有任何经验的是断难搞定此代码的。主要基于华为的官方例子,里面修改了原始…

ApplicationEvent 事件泛型封装记录

一、一个事件的封装、发布以及监听 事件类封装 把需要的信息封装到一个事件类中 Data public class Person {private String name; }Data public class PersonEvent {private Person person;private String addOrUpdate;public PersonEvent(Person person, String addOrUpda…

【云安全】云服务安全攻防

一、云服务安全事件 1、CVE-2021-44228: AWS Log4Shell热补丁漏洞,用来进行容器逃逸和权限提升 2、CVE-2022-30137: Microsoft Azure Service Fabic权限提升漏洞,允许攻击者在容器内提升权限至主机节点root权限 FabricScape: Esca…

神奇的css动画:animation、transform、transition

前言 动画包括两个部分:描述动画的样式和用于指定动画开始、结束以及中间点样式的关键帧。 相比较于传统的脚本实现动画技术,使用css动画三个主要优点: 1.能够非常容易创建简单动画,甚至不需要了解JavaScript就能创建动画 2.动画运行效果…

Trainer API训练属于自己行业的本地大语言模型 医疗本地问答大模型示例

Trainer API 是 Hugging Face transformers 库中强大而灵活的工具,简化了深度学习模型的训练和评估过程。通过提供高层次的接口和多种功能,Trainer API 使研究人员和开发者能够更快地构建和优化自然语言处理模型 文章目录 前言一、Trainer API它能做什么…

Machine Learning Specialization 学习笔记(3)

文章目录 前言一、神经网络基本概念基本组成工作流程训练过程类型应用举例不同层次特征的学习 为什么从基础特征到复杂特征逐渐推进什么是感受野更简单的解释具体示例总结 二、TensorFlow实现简单神经网络安装及环境配置数据预处理标准化 Dense层Convolutional Layer训练DEBUG …

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难,但做到60分基本上照着SOP做到位都没问题,如果我们能把每件事都做到60分,那绝对比至少60%的人都强,除非你的对手不讲武德——那就是他很可能看了我这篇文章,不但每方面都超过及格线&#…

MySQL高阶1853-转换日期格式

目录 题目 准备数据 分析数据 总结 题目 给定一个Days表,请你编写SQL查询语句,将Days表中的每一个日期转化为"day_name, month_name day, year"格式的字符串。 返回的结果表 不计顺序 。 准备数据 Create table If Not Exists Days (d…

Arthas 全攻略:让调试变得简单

文章目录 一、简介二、命令列表 一、简介 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常&#xff…

排序---冒泡排序、堆排序

一、冒泡排序 相邻两个位置交换,假设排升序,就不断把最大的往后拿,所以这段序列从后往前变得有序。 //flag为0,即这个数组已经是有序的了,节省循环次数 二、堆排序(数组实现) 具体原理介绍看这…

jetcache-阿里多级缓存框架神器一定要掌握

文章目录 1. 简介2. springboot集成jetcache2.1 引入依赖2.2 配置文件2.3 高级API模式:通过CacheManager使用缓存,2.7 版本才可使用2.4 (推荐)AOP模式:通过Cached,CacheUpdate,CacheInvalidate注解 1. 简介 JetCache是…

局部整体(六)利用python绘制树状图

局部整体(六)利用python绘制树状图 树状图( Dendrogram)简介 由一个根节点组成,根节点产生多个通过分支连接的子节点。常用于表示层次结构或显示聚类算法的结果。树状图既可以看明白数据的层次结构,也能明…

兴业小知识|法拍房你不知道的省钱小技巧~划走可就亏大了

如果说二手房市场是买卖双方之间的博弈,那法拍房市场则是纯买方的心理游戏。 在法拍房竞拍过程中,有人稳如泰山,有人坐立不安,每一次的出价都是对相互底线的一番试探。 有激进竞拍,拍出天价的,有一举夺魁…

2024.9.20营养小题【2】(动态分配二维数组)

这道题里边涉及到了动态分配二维数组的知识点,不刷这道题我也不知道这个知识点,算是一个比较进阶一点的知识点了。 参考:C语言程序设计_动态分配二维数组_哔哩哔哩_bilibili【C/C 数据结构 】二维数组结构解析 - 知乎 (zhihu.com)

网络爬虫Request静态页面数据获取

在现代 Web 开发中,HTTP 请求(Request)是与服务器进行通信的核心操作。无论是在前端还是后端开发中,数据的获取、传递以及处理都离不开请求的应用。特别是在静态页面的数据获取中,使用请求可以将页面变得更加动态和互动,从而大大提升用户体验,使得页面内容更加丰富和灵活…

电风扇制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

电风扇正悄然成为制造业数字化转型浪潮中的一颗璀璨新星。通过构建5G智能工厂物联数字孪生平台,电风扇制造业正以前所未有的速度和精度,推进着整个行业的智能化、网络化与个性化发展。5G技术的飞速发展,为制造业带来了前所未有的通信速度和低…

vue 入门一

参考&#xff1a;丁丁的哔哩哔哩 1.使用vue 1.1 使用CDN的方式使用Vue mount和<div id"counter">关联起来 1.2 vue中的createApp import { createApp } from "vue"; import App from "./App.vue"; createApp(App).mount("#app&qu…