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

编写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。

条件跳过示例:

通过 exceptrules 关键字,您可以条件地执行或跳过特定的作业。例如,如果提交信息包含 “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)

rulesonly/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 将会被替换为 masterdeploy 命令将会接到 --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 的基本步骤:

  1. 安装 GitLab Runner:首先需要在你想要运行 CI/CD 作业的服务器上安装 GitLab Runner。GitLab 官方文档提供了不同操作系统上的安装指南。

  2. 注册 GitLab Runner:安装完毕后,你需要注册 Runner 到你的 GitLab 实例。这个过程涉及到为 Runner 指定 GitLab 实例的 URL 和一个注册令牌(token)。在注册过程中,你可以指定一些标签(tags)来描述 Runner 的特性或功能。

  3. 配置 .gitlab-ci.yml 文件:在你的 GitLab 项目中,配置 .gitlab-ci.yml 文件来定义 CI/CD 作业。如果需要,可以在作业中使用 tags 来指定应该由哪个 Runner 执行这些作业。

  4. 执行作业:当你的项目中发生了像代码推送(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&#xff09…...

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让人工智能技术完全破圈,带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命,远超出我们今天的想象,这意味着一个巨大的历史机遇正…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...