编写CI/CD自动化部署脚本
编写CI/CD自动化部署脚本
什么是CI/CD
CI/CD 是现代软件开发过程中的关键实践,它包含两个缩写:
- CI,或者持续集成(Continuous Integration)
- CD,可以指持续交付(Continuous Delivery)或持续部署(Continuous Deployment)
持续集成 (CI)
持续集成 是一种软件开发实践,开发人员经常(通常是每天多次)将代码变更集成到共享存储库中。每次代码提交都通过自动化的构建和测试来验证,以便尽早发现集成错误,提高软件质量。
CI 的关键步骤包括:
- 版本控制:所有的源代码都维护在版本控制系统中,比如 Git。
- 自动构建:每次提交都会触发自动的构建过程,它包括编译代码,运行测试,打包等步骤。
- 自动测试:构建过程中包含自动化测试(单元测试、集成测试等)的执行,以确保代码更改没有引入任何错误。
- 反馈回馈:如果构建或测试失败,团队会立即收到反馈。
持续交付 (CD - Continuous Delivery)
持续交付 是在持续集成的基础上,确保软件可以随时在生产环境中发布的实践。它意味着除了自动化测试外,你还有一个自动化的发布过程,可以随时手动触发将软件部署到生产环境。
持续交付确保了:
- 软件的新版本能够快速并且可靠地发布。
- 发布过程是自动化的,减少了人为错误。
持续部署 (CD - Continuous Deployment)
持续部署 更进一步,它是持续交付的一个扩展。每次更改通过所有的生产管道阶段自动化测试后,如果通过测试,就会自动部署到生产环境。在持续部署中,从代码提交到生产环境的部署没有人工干预。
持续部署确保了:
- 减少了软件发布的周期,提高了发布的频率。
- 使团队能够更快地收到用户反馈,并对此做出响应。
CI/CD 的实践降低了软件开发的风险,提高了效率和速度,现在几乎成为敏捷开发和DevOps实践的标准组成部分。一些流行的CI/CD工具包括Jenkins、GitLab CI、CircleCI、Travis CI、Bamboo和GitHub Actions等。
逐步编写一个脚本
这份 .gitlab-ci.yml 文件是 GitLab CI/CD 的配置文件,用于自动化地进行软件的构建、测试、打包和部署。我将会逐步教您如何编写一个类似的自动化部署脚本。
1. 定义阶段(Stages)
首先,您需要定义执行的各个阶段,这些阶段按照定义的顺序执行。例如:
stages:- update_project- generate_domain_and_sql- install_entity_and_api- package_modules- deploy
2. 规定工作流程(Workflow)
您可以通过 workflow 关键词来限定什么条件下执行 CI/CD 流程。例如,只有在 dev-deploy 分支上的提交时才运行此流程:
workflow:rules:- if: $CI_COMMIT_BRANCH == "dev-deploy"
3. 编写作业(Jobs)
每个阶段可以包含一个或多个作业。作业是执行特定任务的脚本集合。
更新项目示例:
update:stage: update_projecttags:- support-devscript:- echo "Currently running as..."- whoami- echo "Changing dir..."- cd /home/recruit/support-dev/support-backend- git fetch --all- git reset --hard origin/dev-deploy- echo "Project update finished!"
这段脚本将会在 update_project 阶段执行,标签 support-dev 通常用来指示运行这个作业的特定的Runner。
条件跳过示例:
通过 except 或 rules 关键字,您可以条件地执行或跳过特定的作业。例如,如果提交信息包含 “skip-mbg”,则跳过此作业:
mybatis_generator:stage: generate_domain_and_sqltags:- support-devexcept:variables:- $CI_COMMIT_MESSAGE =~ /skip-mbg/script:- echo "Starting mybatis generator..."- ...
4. 定义脚本(Script)
script 是作业中实际执行的命令序列。这些命令可以是任何 shell 命令。
5. 使用规则(Rules)和只有在更改时(Only Changes)
rules 和 only/changes 用来确定何时执行作业。例如,只有当 support-entity 模块发生变更时才运行此作业:
install_entity:stage: install_entity_and_apitags:- support-devrules:- changes:- support-entity/**/*script:- echo "Installing support-entity"- ...
6. 打包模块(Package Modules)
在 package_modules 阶段,您会编译和打包您的应用程序。例如:
package_core_service:stage: package_modulestags:- support-devonly:changes:- support-core-service/**/*- ...script:- echo "Packaging core service..."- cd /home/recruit/support-dev/support-backend/support-core-service- mvn clean package -Dmaven.test.skip=true- echo "Core service packaged!"- ...
7. 部署模块(Deploy Modules)
最后,在 deploy 阶段,您将部署您的应用程序。这通常涉及移动构建的包到运行环境并重启服务。
deploy_core_service:stage: deploytags:- support-devonly:changes:- support-core-service/**/*- ...needs: ["package_core_service"]script:- echo "Restarting core service..."- systemctl restart support-core- echo "Restart succeed!"
小结
自动化部署脚本的编写需要您根据项目的需要去定义阶段、作业、脚本以及执行条件。每个项目可能有不同的需求
疑问
$CI_COMMIT_BRANCH是一个固定参数吗,为什么用$符号
在 GitLab CI/CD 环境中,$CI_COMMIT_BRANCH 是一个预定义的环境变量。这种变量通常以 $ 符号开始,这是 Unix shell 环境中引用变量的标准方式。在 GitLab CI/CD 脚本中,使用 $ 符号可以获取环境变量的值。
$CI_COMMIT_BRANCH 特别指代了触发当前 CI/CD 流水线的 Git 分支名称。例如,如果您向 feature-branch 推送代码,$CI_COMMIT_BRANCH 将会是 feature-branch。
GitLab CI/CD 为构建环境提供了许多这样的预定义环境变量,它们可以帮助您获取关于仓库、运行作业、流水线等的信息,以便在自动化脚本中使用。
这些环境变量对于写出能够根据不同情况动态改变其行为的 CI/CD 脚本是非常有用的。例如,您可能想要在向特定分支推送时才部署应用程序,或者根据提交信息中的某些关键词来跳过某些测试。通过使用这些环境变量,您可以让 CI/CD 脚本更加灵活和智能。
在 .gitlab-ci.yml 文件中,您可以通过简单地在变量名前加上 $ 符号来使用这些变量。例如:
deploy_to_production:script:- echo "Deploying to production server"- deploy --branch $CI_COMMIT_BRANCHonly:- master
在上面的例子中,如果这个作业在 master 分支上运行,$CI_COMMIT_BRANCH 将会被替换为 master,deploy 命令将会接到 --branch master 参数。
tags的作用是什么,是必须的吗
在 GitLab CI/CD 的 .gitlab-ci.yml 文件中,tags 关键词用于为 CI/CD 作业指定特定的运行器(Runner)。这不是必须的,但是它允许你控制哪些 Runner 能够执行特定的作业。
Runner 是用来执行你的作业和发送结果回 GitLab 的服务器。GitLab Runner 可以注册到 GitLab,并且可以拥有一个或多个标签(tags),这些标签在注册 Runner 时被指定。这些标签可以基于它们的用途、运行环境、部署的位置或者它们拥有的特定硬件特性来设置。
当你在 .gitlab-ci.yml 文件中的作业指定 tags 列表时,GitLab 会查找注册的 Runner 中具有所有这些标签的 Runner 来执行该作业。
例如:
deploy_to_production:stage: deployscript:- echo "Deploying to production server"tags:- production
在这个例子中,只有拥有 production 标签的 Runner 才会被用来执行 deploy_to_production 作业。
如果没有指定 tags,那么任何没有指定 tags 的 Runner(即注册为共有 Runner)都可以执行该作业。如果你的项目或者 Runner 的设置比较特殊,使用 tags 可以帮助保证作业只在具有特定配置的 Runner 上运行,这可以是为了安全、性能或者兼容性的原因。
如果你不需要对 Runner 进行特别的控制,那么 tags 关键词可以省略,作业将由可用的共有 Runner 执行。
我还是对Runner不理解,它是一个jar包吗
GitLab Runner 并不是一个 jar 包。GitLab Runner 是一个开源项目,用于运行你的 CI/CD 作业并发送结果回到 GitLab。它是一个单独的应用程序,可以在 Unix、Linux、macOS、Windows、Docker 容器中,以及 Kubernetes 集群上运行。GitLab Runner 是用 Go 语言编写的,因此它是一个编译后的可执行文件,而不是依赖 Java 运行环境的 jar 包。
你可以将 GitLab Runner 理解为一个客户端,它会接受来自 GitLab CI/CD 的指令(即在 .gitlab-ci.yml 文件中定义的作业),然后在相应的环境中执行这些指令(比如运行测试、部署代码等)。运行结束后,Runner 会将结果反馈给 GitLab。
为了使用 GitLab Runner,你需要在一台服务器或计算资源上安装并注册它。注册 Runner 时,你可以为其分配标签(tags),这些标签可以在 .gitlab-ci.yml 文件中通过 tags 关键词被引用,以决定哪一个 Runner 应该执行特定的作业。
以下是使用 GitLab Runner 的基本步骤:
-
安装 GitLab Runner:首先需要在你想要运行 CI/CD 作业的服务器上安装 GitLab Runner。GitLab 官方文档提供了不同操作系统上的安装指南。
-
注册 GitLab Runner:安装完毕后,你需要注册 Runner 到你的 GitLab 实例。这个过程涉及到为 Runner 指定 GitLab 实例的 URL 和一个注册令牌(token)。在注册过程中,你可以指定一些标签(tags)来描述 Runner 的特性或功能。
-
配置
.gitlab-ci.yml文件:在你的 GitLab 项目中,配置.gitlab-ci.yml文件来定义 CI/CD 作业。如果需要,可以在作业中使用tags来指定应该由哪个 Runner 执行这些作业。 -
执行作业:当你的项目中发生了像代码推送(push)或合并请求(merge request)这样的事件时,GitLab CI/CD 会根据
.gitlab-ci.yml文件中的定义来安排作业。如果作业中指定了tags,GitLab 会找到具有相匹配标签的 Runner 来执行作业。
请注意,GitLab Runner 要与 GitLab(通常是 GitLab.com 或者自托管的 GitLab 实例)进行通信,以便获取作业并报告结果。因此,它需要网络连接到 GitLab 实例。
相关文章:
编写CI/CD自动化部署脚本
编写CI/CD自动化部署脚本 什么是CI/CD CI/CD 是现代软件开发过程中的关键实践,它包含两个缩写: CI,或者持续集成(Continuous Integration)CD,可以指持续交付(Continuous Delivery)…...
Pandas实践_分类数据
文章目录 一、cat对象1.cat对象的属性2.类别的增加、删除和修改 二、有序分类1.序的建立2.排序和比较 三、区间类别1.利用cut和qcut进行区间构造2.一般区间的构造3.区间的属性与方法 一、cat对象 1.cat对象的属性 在pandas中提供了category类型,使用户能够处理分类…...
git的使用思维导图
源文件在github主页:study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)...
Qt 软件界面点击QCombBox控件,造成整个界面移位
Qt 软件界面点击QCombBox控件,造成整个界面移位 最近项目中,遇到了一个问题,在绘制界面的时候,使用了QCombBox控件,在点击QCombBox控件下拉中的item时,会造成整个界面移位的现象。 我重写了下面三个事件函…...
AI Native工程化:百度App AI互动技术实践
作者 | GodStart 导读 随着AI浪潮的兴起,越来越多的应用都在利用大模型重构业务形态,在设计和优化Prompt的过程中,我们发现整个Prompt测评和优化周期非常长,因此,我们提出了一种Prompt生成、评估与迭代的一体化解决方案…...
DDPM推导笔记
各位佬看文章之前,可以先去看看这个视频,并给这位up主点赞投币,这位佬讲解的太好了:大白话AI 1.前置知识的学习 1.1 正态分布特性 (1)正态分布的概率密度函数 f ( x ) 1 2 π σ e − ( x − μ ) …...
【C#/Java】【小白必看】不要只会读写文本文件了!对象序列化助你提高效率
【C#/Java】【小白必看】不要只会读写文本文件了!对象序列化助你提高效率 在编程的世界里,文件的读写操作是我们经常面对的任务之一。 当我们只涉及简单的文本文件时,这个任务似乎并不复杂。但是,当我们处理更为复杂的类对…...
排障启示录-无线终端信号弱
现象:无线终端显示信号弱 信息收集: AP的实际发射功率低。外置天线型AP,天线松动或者没插天线现场环境问题,信号穿透衰减终端接入远端AP终端个体问题 排查步骤: 1、AP的发射功率低 查看AP的射频功率,判…...
gem5 RubyPort: mem_request_port作用与连接 simple-MI_example.py
简介 回答这个问题:RubyPort的口下,一共定义了六个口,分别是mem_request_port,mem_response_port,pio_request_port,pio_response_port,in_ports, interrupt_out_ports,他们分别有什…...
无人机支持的空中无蜂窝大规模MIMO系统中上行链路分布式检测
无人机支持的空中无蜂窝大规模MIMO系统中上行链路分布式检测 无人机支持的空中无蜂窝大规模MIMO系统中上行链路分布式检测介绍题目一. 背景(解决的问题)二. 系统模型信道模型信道系数进行标准化 信道估计 和 数据传输信道估计上行数据传输 三. 具体的流程…...
文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络
文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络(Generative adversarial networks, GANs)在医学影像中的应用。文献…...
前端验收测试驱动开发
我们听说过很多关于测试驱动开发(TDD)的内容。那么什么是ATDD? ATDD代表验收测试驱动开发,这是一种定义验收标准并创建自动化测试来验证是否满足这些标准的软件开发方法。ATDD是一种协作方法,涉及客户、开发人员和测试…...
图像卷积操作
目录 一、互相关运算 二、卷积层 三、图像中目标的边缘检测 四、学习卷积核 五、特征映射和感受野 一、互相关运算 严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算(cross-correlation),而不是…...
目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估
Hi, I’m Shendi 1、目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估 在最近有了个物体识别的需求,于是开始学习 在一番比较与询问后,最终选择 TensorFlow。 对于编程语言,我比较偏向Java或nod…...
【UE5插件推荐】运行时,通过HTTP / HTTPS下载文件(Runtime Files Downloader)
UE5 github Home gtreshchev/RuntimeFilesDownloader Wiki (github.com)...
信息论安全与概率论
目录 一. Markov不等式 二. 选择引理 三. Chebyshev不等式 四. Chernov上限 4.1 变量大于 4.2 变量小于 信息论安全中会用到很多概率论相关的上界,本文章将梳理几个论文中常用的定理,重点关注如何理解这些定理以及怎么用。 一. Markov不等式 假定…...
各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录(SSO)系统
各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录(SSO)系统。 单点登录(SSO)是一个登录服务层,通过一次登录访问多个应用。使用SSO服务可以提高多系统使用的用户体验和安全性,用户不必记忆多个密…...
Netty Review - 优化Netty通信:如何应对粘包和拆包挑战
文章目录 概述Pre概述场景复现解决办法概览方式一: 特殊分隔符分包 (演示Netty提供的众多方案中的一种)流程分析 方式二: 发送长度(推荐) DelimiterBasedFrameDecoder 源码分析 概述 Pre Netty Review - 借助SimpleTalkRoom初体验…...
vue介绍以及基本指令
目录 一、vue是什么 二、使用vue的准备工作 三、创建vue项目 四、vue插值表达式 五、vue基本指令 六、key的作用 七、v-model 九、指令修饰符 一、vue是什么 Vue是一种用于构建用户界面的JavaScript框架。它可以帮助开发人员构建单页应用程序和复杂的前端应用程序。Vue…...
重塑数字生产力体系,生成式AI将开启云计算未来新十年?
科技云报道原创。 今天我们正身处一个历史的洪流,一个巨变的十字路口。生成式AI让人工智能技术完全破圈,带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命,远超出我们今天的想象,这意味着一个巨大的历史机遇正…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
