【gitlab】认识 持续集成与部署
持续集成(CI)与持续部署(CD)
1. 什么是持续集成(CI)?
持续集成(Continuous Integration,CI)是一种软件开发实践,强调开发人员频繁地将代码提交到共享代码库,并通过自动化构建和测试快速反馈问题。
CI 的关键特性
特性 | 说明 |
---|---|
代码频繁提交 | 确保集成的代码及时合并,减少冲突。 |
自动化构建 | 每次代码提交触发构建,确保代码能正确编译。 |
自动化测试 | 运行单元测试、代码规范扫描等,保证质量。 |
快速反馈 | 及时发现错误,尽早修复,提高团队协作效率。 |
2. 什么是持续部署(CD)?
持续部署(Continuous Deployment,CD)是将构建后的制品自动部署到不同环境(测试、预生产、生产)的过程。它的目标是让开发的功能尽快交付给用户。
CD 的关键特性
特性 | 说明 |
---|---|
自动化部署 | 代码通过 CI 流程后,自动化推送到部署环境。 |
版本管理 | 明确版本控制,支持回滚。 |
快速反馈 | 让测试和运维团队尽早介入,降低风险。 |
最终用户可见 | 生产环境部署后,用户可以直接使用新功能。 |
3. 为什么要使用 CI/CD?
CI/CD 提供了一套高效的软件交付方式,带来了多种优势:
- 加快产品研发进程:减少手动构建和部署的时间。
- 更早发现问题:频繁集成和测试,避免大版本合并时的冲突。
- 降低人为错误:自动化流程减少手动干预,提高稳定性。
- 提高团队协同效率:产品、开发、测试、运维团队更高效协作。
- 更专注于业务逻辑:减少开发人员在集成和部署上的额外工作。
4. CI/CD 存在的问题
尽管 CI/CD 有诸多优点,但在落地时可能面临以下挑战:
问题 | 说明 |
---|---|
需要一定技术门槛 | 需要有 CI/CD 经验的团队支持。 |
不是所有测试都能自动化 | 例如 UI 测试、部分人工测试仍需手动干预。 |
需要良好的协作 | 开发、测试、运维需要明确职责,避免影响彼此流程。 |
需要较长时间实践 | CI/CD 体系需要持续优化和演进,才能适应团队需求。 |
可能与现有流程冲突 | 需要逐步推进,可能遭遇组织内部阻力。 |
5. 三种常见的发布策略
CI/CD 体系下,有三种常见的发布策略,分别是蓝绿发布、A/B 测试和金丝雀发布。
5.1 蓝绿发布(Blue-Green Deployment)
- 思路:将服务集群分为两组(蓝色和绿色),新版本在一组部署后,切换流量至该组,旧版本作为热备。
- 优点:
- 结构简单,部署方便。
- 切换和回滚速度快,影响面小。
- 缺点:
- 需要双倍资源,以支持两个版本的运行。
- 如果新版本故障,仍可能影响全部用户。
5.2 A/B 测试(A/B Testing)
- 思路:根据 HTTP 头部或 Cookie,将部分用户流量定向到新版本,观察效果后再决定全量发布。
- 优点:
- 影响范围可控。
- 适合 UI/UX 变更的逐步测试。
- 缺点:
- 需要流量监控和用户行为分析能力。
- 发布周期较长。
5.3 金丝雀发布(Canary Deployment)
- 思路:最初只让少部分用户使用新版本,逐步增加流量,最终完全替换旧版本。
- 优点:
- 资源利用率高。
- 风险最小,新版本故障影响范围小。
- 缺点:
- 发布周期长。
- 可能会影响关键用户。
6. 基于 GitLab 的持续集成案例
以下是一个基于 GitLab 的持续集成(CI)案例详解
案例背景
假设你有一个简单的 Node.js Web 项目,项目结构如下:
my-web-app/├── src/│ └── index.js├── test/│ └── index.test.js├── package.json└── .gitlab-ci.yml
目标:通过 GitLab CI/CD 实现自动化测试、构建和部署。
一、GitLab CI 基础知识
-
核心概念:
- Pipeline:一次 CI/CD 流程的完整过程。
- Stage:Pipeline 的阶段(如
test
,build
,deploy
)。 - Job:每个阶段中的具体任务(如运行测试、打包代码)。
-
配置文件:
.gitlab-ci.yml
定义 CI/CD 流程的规则,需放在项目根目录。
二、配置持续集成流程
步骤 1:创建 .gitlab-ci.yml
文件
# 定义 Pipeline 的阶段(按顺序执行)
stages:- test- build- deploy# 定义缓存 node_modules 加速后续流程
cache:paths:- node_modules/# 定义全局环境变量
variables:NODE_VERSION: "18"# 1. 测试阶段
test_job:stage: testimage: node:$NODE_VERSION # 使用 Node.js 官方镜像before_script:- npm install # 安装依赖script:- npm test # 运行测试# 2. 构建阶段
build_job:stage: buildimage: node:$NODE_VERSIONscript:- npm run build # 假设 package.json 中有 build 脚本artifacts:paths:- dist/ # 将构建产物传递给后续阶段# 3. 部署阶段(示例:部署到 GitLab Pages)
deploy_job:stage: deployimage: alpine:latestscript:- echo "将 dist/ 目录部署到 GitLab Pages..."- mv dist/ public/ # GitLab Pages 默认从 public 目录部署rules:- if: $CI_COMMIT_BRANCH == "main" # 仅 main 分支触发部署
步骤 2:配置 GitLab Runner
-
什么是 Runner:
一个执行 CI/CD 任务的程序,需注册到 GitLab 项目。 -
如何配置:
- 进入 GitLab 项目 → Settings → CI/CD → Runners。
- 选择 Shared Runner(GitLab 提供)或手动安装 Specific Runner。
- 本地安装 Runner 示例(需服务器或本地机器):
# 下载 Runner 并安装 curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb" sudo dpkg -i gitlab-runner_amd64.deb# 注册 Runner(按提示填写 GitLab URL 和 Token) sudo gitlab-runner register
步骤 3:触发 Pipeline
- 将代码推送到 GitLab 仓库。
- 进入 GitLab 项目 → CI/CD → Pipelines,查看运行状态。
- 点击 Jobs 可查看详细日志。
三、流程详解
-
测试阶段:
- 使用 Node.js 镜像安装依赖并运行测试。
- 若测试失败,Pipeline 终止并通知。
-
构建阶段:
- 生成静态文件(如
dist/
目录)。 artifacts
将产物传递给后续阶段。
- 生成静态文件(如
-
部署阶段:
- 仅当提交到
main
分支时触发。 - 将
dist/
重命名为public/
,自动部署到 GitLab Pages。
- 仅当提交到
四、优化与注意事项
-
缓存依赖:
cache:key: ${CI_COMMIT_REF_SLUG} # 按分支缓存paths:- node_modules/
-
环境变量管理:
敏感信息(如 API 密钥)应在 GitLab 项目 → Settings → CI/CD → Variables 中配置。 -
仅针对特定分支:
job_name:rules:- if: $CI_COMMIT_BRANCH == "main"
-
手动部署:
deploy_job:when: manual # 手动点击触发
https://github.com/0voice
相关文章:
【gitlab】认识 持续集成与部署
持续集成(CI)与持续部署(CD) 1. 什么是持续集成(CI)? 持续集成(Continuous Integration,CI)是一种软件开发实践,强调开发人员频繁地将代码提交到…...
机器学习,我们主要学习什么?
机器学习的发展历程 机器学习的发展历程,大致分为以下几个阶段: 1. 起源与早期探索(20世纪40年代-60年代) 1949年:Hebb提出了基于神经心理学的学习机制,开启了机器学习的先河1950年代:机器学习的…...
React 高阶组件的优缺点
React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装:当多个组件需要实现相同的功能或逻辑时,高阶组件可以将这些逻辑封装起来,避免代码重复。例如,多个组件都需要在挂载时进行数据获取操作,就可以创建一个数…...
算法1-4 数楼梯
题目描述 楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。 编一个程序,计算共有多少种不同的走法。 输入格式 一个数字,楼梯数。 输出格式 输出走的方式总数。 输入输出样例 输入 #1 4 输出 #1 5 说明/提示 对于…...
我的世界1.20.1forge开发教程(6)——自定义燃料,熔炼规则、配方
配方篇 在Minecraft中,配方代码是用于定义合成配方的一种数据格式。在开发者的角度,配方代码通常以JSON格式编写,包含了合成所需的原料、合成产物以及合成方式等信息。 在1.12版本之前,开发者需要通过修改游戏的源代码来添加自定义配方。这通常需要对游戏的Java代码进行修…...
推荐几款SpringBoot项目手脚架
作为程序员、一般需要搭建项目手脚架时、都会去Gitee或Github上去找、但是由于Github在国内并不稳定、所以就只能去Gitee去上查找。 不同语言检索方式不一样、但是也类似。 Gitee WEB应用开发 / 后台管理框架 芋道源码 ELADMIN 后台管理系统 一个基于 Spring Boot 2.7.1…...
01 1个路由器+两个子网
前言 这是最近一个朋友的 ensp 相关的问题, 这里来大致了解一下 ensp, 计算机网络拓扑 相关基础知识 这里一系列文章, 主要是参照了这位博主的 ensp 专栏 这里 我只是做了一个记录, 自己实际操作了一遍, 增强了一些 自己的理解 当然 这里仅仅是一个 简单的示例, 实际场景…...
buu-[OGeek2019]babyrop-好久不见41
打开 /dev/urandom 设备文件,读取4个字节到 buf 中。 将 buf 传递给 sub_804871F() 函数,该函数似乎对输入进行某种处理并返回一个值 v2。 最后,将 v2 传递给 sub_80487D0() 函数。 这个函数首先将 a1 转换为字符串 s。 然后从标准输入读…...
PV和UV的区别
文章目录 1. UV(Unique Visitor / 独立访客):多少人来过2. PV(Page View / 页面浏览量):访问了多少次3. 对比 UV 和 PV4. 示例场景5. 扩展指标 UV 侧重用户规模,反映“多少人来过”。PV 侧重访问…...
DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析
调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...
JavaScript变量的作用域介绍
JavaScript变量的作用域介绍 JavaScript 变量的作用域决定了变量在代码中的可访问性。 var 是 JavaScript 中最早用于声明变量的关键字,它函数作用域或全局作用域。 let 关键字,具有块级作用域、全局作用域。 const关键字,具有块级作用域…...
ollama如何安全卸载,解决Ollama unins000.msg is missing
春节后在本地电脑安装了Ollama的客户端,每次开机自启,影响开机速度,而且本地的模型不如联网的回答效果好,果断选择了卸载,但是今天卸载发现提示下方的错误。根据此文章可以解决当前的问题。 根据此文章可以解决当前的…...
2.5GE 超千兆SFP光模块型号(常用光模块收发光功率范围)
SFP 2.5GE超千兆光模,参考表格: 型号类型工作波长 (nm)发光功率 (dBm)光功率灵敏度 (dBm)传输距离 (m)SFP-25G-SR多模光纤850-10.0 to -3.0-18.0300 (OM3) / 400 (OM4)SFP-25G-LR单模光纤1310-5.0 to 1.0-24.010,000SFP-25G-ER单模光纤1550-1.0 to 4.0…...
Ubuntu24.04安装不同版本的pip
目录 1.安装pip 2. 为不同的Python版本安装pip 3. 安装python库 1.安装pip 一般情况下,Ubuntu系统默认提供Python 3,但可能没有安装pip。可以通过以下命令安装pip sudo apt update sudo apt install python3-pip 安装完成后,可以通过以下…...
fastadmin实现海报批量生成、邮件批量发送
记录一个海报批量生成、邮件批量发送功能开发,业务场景如下: 国外客户做观展预登记,工作人员通过后台,批量给这些观众生成入场证件并发送到观众登记的邮箱,以方便观众入场时快速进场。证件信息包含入场二维码、姓名&a…...
拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!
2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号:AI将掀起工业革命级增长,量子计算突破引爆材料科学革命,游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点,揭示科技巨头的未来十年…...
深度学习(2)-深度学习关键网络架构
关键网络架构 深度学习有4种类型的网络架构:密集连接网络、卷积神经网络、循环神经网络和Transformer。每种类型的模型都是针对特定的输入模式,网络架构包含了关于数据结构的假设,即模型搜索的假设空间。某种架构能否解决某个问题࿰…...
MyBatis中的日志和映射器说明
1.MyBatis中的日志 1.1 什么是日志 在我们编写应用的时候,有一些信息需要及时查看,查看的时候有时需要输出到控制台,有时需要输出到文件。MyBatis也需要日志,一般情况下,使用log4j进行日志管理。 1.2 在MyBatis中…...
pip下载速度变快可以用清华镜像源
pip下载速度变快可以用清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simplepip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple参考清华镜像源地址(国内下载python包必备地址)_清华源镜像地址-CSDN博客...
骶骨神经
骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术(七) 勇闯禁区 骶骨肿瘤切除术...
LeetCode刷题---二分查找---441
排列硬币 441. 排列硬币 - 力扣(LeetCode) 题目 你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n ,计算…...
DeepSeek 提示词:定义、作用、分类与设计原则
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
最短路的方案数+打印路径
这个题目整合了我们最短路用到的很多技能 如何统计最短路径的方案数呢,这就需要我们另外开一个全局数组 如何打印路径呢,还是开一个全局的数组,记录前一个是啥就行 简单的来说,要增加啥新的功能,直接多开全局变量就行…...
Python爬虫系列教程之第十三篇:构建高可用爬虫系统 —— 混合架构与自动化监控
大家好,欢迎继续关注本系列爬虫教程!随着爬虫项目规模的不断扩大和业务需求的提升,单一技术方案往往难以满足实际应用中对高可用性、稳定性和自动化监控的要求。如何构建一个既能应对多种反爬策略,又能在异常情况下自动恢复、实时…...
Python学习心得浅拷贝与深拷贝
一、变量的赋值、浅拷贝以及深拷贝的定义: 1.变量的赋值:只是形成两个变量,实际上还是指向同一个对象 2.浅拷贝:拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象…...
cs106x-lecture13(Autumn 2017)-SPL实现
打卡cs106x(Autumn 2017)-lecture13 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) 1、v1v2p1p2 The following code C uses pointers and produces two lines of output. What is the output? int v1 10; int v2 25; int* p1 &v1…...
3D模型在线转换工具:轻松实现3DM转OBJ
3D模型在线转换是一款功能强大的在线工具,支持多种3D模型格式的在线预览和互转。无论是工业设计、建筑设计,还是数字艺术领域,这款工具都能满足您的需求。 3DM与OBJ格式简介 3DM格式:3DM是一种广泛应用于三维建模的文件格式&…...
AI IDE 新势力 Trae 功能深度解析:Builder与Chat模式的应用场景与市场竞争力分析
文章目录 一、前言二、简介2.1 Trae 的背景与定位 三、Trae 核心功能3.1 Builder模式介绍3.2 Chat模式介绍 四、Trae 实际应用案例4.1 Trae 安装与配置4.1.1 Trae 安装与配置4.1.2 Trae 设置 4.2 实战案例分享4.2.1 Trae Builder模式:从0到1生成对接 DeepSeek 的聊天…...
天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题…...
ADCP处理软件CODAS安装 (conda方法安装)
夏威夷大学出品的ADCP处理软件,我主要用来查看船载ADCP流速数据。 1. 先安装conda(miniconda就可以),这里不再赘述,安装完可以添加conda库和取消登录自动激活conda conda config --add channels conda-forge # 添加库 conda config --set a…...
JUC并发—9.并发安全集合三
大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 1.并发安全的数组列表CopyOnWriteArrayList …...
后端Java Stream数据流的使用=>代替for循环
API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…...
强化学习-GAE方法
2016-ICLR-HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION 解决问题 强化学习的目标为最大化策略的预期总回报,其中一个主要困难为 行为对reward的影响存在一个长时间的延迟(credit assignment problem)。价…...
51c大模型~合集71
我自己的原文哦~ https://blog.51cto.com/whaosoft/12260659 #大模型推理加速技术的学习路线 EfficientQAT 可以在 41 小时内在单个 A100-80GB GPU 上完成对 2-bit Llama-2-70B 模型的量化感知训练。与全精度模型相比,精度仅下降了不到 3%(69.48 v…...
PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
PyTorch-基础 环境准备 CUDA Toolkit安装(核显跳过此步骤) CUDA Toolkit是NVIDIA的开发工具,里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本,如何去下载对应版本的Toolkit工…...
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
安装前检查服务器glibc版本,下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好,下载地址:https://pan.quark.cn/s/3137acc814c0,下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好,下载地址…...
Transformer解析——(四)Decoder
本系列已完结,全部文章地址为: Transformer解析——(一)概述-CSDN博客 Transformer解析——(二)Attention注意力机制-CSDN博客 Transformer解析——(三)Encoder-CSDN博客 Transforme…...
TypeScript 中 type 和 interface 深度对比分析
一、核心概念对比 特性interfacetype本质声明式类型契约(面向对象范式)类型别名(函数式编程思维)可扩展性支持声明合并(多次声明自动合并)不可合并基础类型支持只能描述对象/函数类型可描述任意类型&#…...
unplugin-vue-components,unplugin-auto-import,借用ai去学习
好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先ÿ…...
Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读
Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…...
C++ ——继承
体现的是代码复用的思想 1、子类继承父类,子类就拥有了父类的特性(成员方法和成员属性) 2、已存在的类被称为“基类”或者“父类”或者“超类”;新创建的类被称为“派生类”或者“子类” 注意: (1&#…...
正则表达式常用记录
1. 定义 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),它是一种文本模式,同时也是计算机科学的一个概念,其中包括普通字符(例如,…...
redis的应用,缓存,分布式锁
1.应用 1.1可以用作缓存 作用:提交数据的查询效率,减少对数据库的访问频率 什么数据适合放入缓存 1.查询频率高,修改频率低 2.对安全系数比较低 如何实现 Service public class DeptServer {Autowiredprivate DeptMapper deptMapper;Auto…...
qt5实现表盘的旋转效果,通过提升QLabel类
因为工作需要,需要实现温度的表盘展示效果 实现思路: 通过提示声QLabel控价类,实现报盘的旋转和展示效果 1. 编写一个QLabel的类MyQLabel,实现两个方法 1. void paintEvent(QPaintEvent *event); //重绘函数 2. void valueChanged(int va…...
Flutter项目中设置安卓启动页
AndroidManifest.xml 设置 android:theme“style/LaunchTheme” <applicationandroid:label"string/app_name"android:name"${applicationName}"android:icon"mipmap/ic_launcher"android:roundIcon"mipmap/ic_launcher"android:t…...
人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)
要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集: 二.针对检测结果初始化track 对每一帧数据都输出…...
C语言之枚举类型
目录 前言 一、enum(枚举 总结 前言 在C语言中,枚举类型是一种用户自定义的数据类型,用于定义一组具名的常量集合。枚举类型可以提高代码的可读性和可维护性,同时也能够帮助程序员避免使用魔法数字。通过枚举类型,我们…...
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
推荐一款AI大模型托管平台-OpenWebUI
推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址:https://openwebui.com/ GitHub地址: https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离…...
复习dddddddd
1. 思路:用队列先进先出的特性 #include <iostream> #include <vector> #include <stack> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cma…...