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

持续集成与持续部署:CI/CD实现教程

以下是一个基于常见工具实现 CI/CD 的基本教程示例,这里以 Git、Jenkins、Maven(用于 Java 项目构建和管理依赖,其他语言项目可替换为对应构建工具)以及 Docker(用于容器化部署,非必需但很常用)为例,展示如何搭建一个简单的 CI/CD 流程,你可以根据实际项目情况进行调整和扩展。

一、环境准备

1. 安装 Git
  • 根据操作系统不同,在官网(https://git-scm.com/)下载对应版本的 Git 安装包进行安装。安装完成后,通过命令行输入 git --version 验证是否安装成功。
2. 安装 Jenkins
  • Windows 系统
    • 从 Jenkins 官网(Jenkins)下载 Windows 安装包,运行安装程序,按照提示逐步完成安装。安装完成后,在浏览器中访问 http://localhost:8080(默认端口是 8080,如果安装过程中修改了端口则使用修改后的端口号),按照初始设置向导进行配置,包括安装推荐插件等操作。
  • Linux 系统(以 Ubuntu 为例)
    • 先更新系统软件包列表:sudo apt update
    • 安装 Java 环境(Jenkins 依赖 Java),执行命令 sudo apt install openjdk-11-jdk(这里以 Java 11 为例,可根据需求选择其他版本)。
    • 添加 Jenkins 软件源,在 /etc/apt/sources.list.d/ 目录下创建一个名为 jenkins.list 的文件,内容为 deb https://pkg.jenkins.io/debian-stable binary/,然后运行命令 wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - 导入 Jenkins 官方密钥。
    • 再次更新软件包列表后安装 Jenkins:sudo apt install jenkins,安装完成后,启动 Jenkins 服务 sudo service jenkins start,同样在浏览器中访问 http://<服务器 IP 地址>:8080 进行初始配置。
3. 安装 Maven(针对 Java 项目,其他语言项目按需安装对应构建工具)
  • Windows 系统
    • 从 Maven 官网(Welcome to Apache Maven – Maven)下载二进制压缩包,解压到指定目录(如 C:\Program Files\apache-maven),然后配置环境变量,在系统环境变量的 Path 变量中添加 Maven 的 bin 目录路径(如 C:\Program Files\apache-maven\bin),通过命令行输入 mvn -version 验证安装是否成功。
  • Linux 系统(以 Ubuntu 为例)
    • 执行命令 sudo apt install maven 进行安装,安装完成后通过 mvn -version 检查安装情况。
4. 安装 Docker(如果有容器化部署需求)
  • Windows 系统
    • 从 Docker 官网(https://www.docker.com/)下载 Docker Desktop for Windows 安装包,运行安装程序,按照提示完成安装,安装完成后需重启电脑使 Docker 生效,通过命令行输入 docker --version 验证。
  • Linux 系统(以 Ubuntu 为例)
    • 先卸载旧版本(如果有):sudo apt-get remove docker docker-engine docker.io containerd runc
    • 安装依赖包:sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates curl gnupg lsdv
    • 添加 Docker 官方 GPG 密钥:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    • 设置稳定版软件源:echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    • 安装 Docker 引擎:sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io,安装完成后通过 docker --version 验证安装情况,并且可以运行 sudo systemctl start docker 启动 Docker 服务,还可以设置开机自启 sudo systemctl enable docker

二、项目配置

1. 创建 Git 仓库
  • 在 Git 服务器(如 GitHub、GitLab 或者自建的 Git 服务器)上创建一个新的项目仓库,用于存放你的项目源代码。如果是本地已有项目,可以通过命令行进入项目目录,执行 git init 创建本地仓库,然后关联远程仓库(例如 git remote add origin <远程仓库 URL>),再将本地代码推送到远程仓库(git push -origin master 等,具体根据实际分支情况)。
2. 在 Jenkins 中配置项目
  • 登录 Jenkins 网页界面,点击 “新建 Item”,输入项目名称,选择 “Freestyle project”(自由风格项目,对于简单项目比较适用,也可以后续探索更复杂的项目类型如 Pipeline 等),点击 “确定”。
  • 在项目配置页面:
    • General(常规):可设置项目的一些基本描述信息等。
    • 源码管理:选择 “Git”,填写你的 Git 仓库地址(如 https://github.com/<用户名>/<项目名>.git),如果是私有仓库,可能需要配置认证信息(如 SSH 密钥或者用户名密码等),然后设置要构建的分支(如 master 或者其他开发分支)。
    • 构建触发器:有多种触发构建的方式,例如 “Poll SCM” 可以设置定时检查代码仓库是否有更新来触发构建(如 */5 * * * * 表示每 5 分钟检查一次);“GitHub hook trigger for GITscm polling”(如果项目托管在 GitHub 上)可以通过 GitHub 推送事件来触发构建,更加实时高效;你也可以手动点击 “立即构建” 按钮来触发构建。
    • 构建环境:根据项目需求配置,比如是否需要使用 Docker 等,这里如果使用 Docker,可勾选相关 Docker 配置选项(后续还需进一步配置 Docker 相关参数)。
    • 构建步骤
      • 对于 Java 项目,如果使用 Maven 构建,添加 “Execute Maven goal” 构建步骤,在 “Goals” 文本框中输入构建命令,比如 clean install(清除之前的构建结果并重新安装项目到本地仓库,一般会生成可部署的 JAR 文件等制品)。
      • 如果有其他操作,比如运行脚本、复制文件等,可以继续添加相应的构建步骤来完成对应的任务。

三、持续集成(CI)流程实现

1. 开发人员提交代码
  • 开发团队成员在本地完成代码编写、测试(本地可以先进行一些简单的单元测试等)后,将代码提交到前面创建的 Git 仓库对应的分支中(如 master 分支或者开发分支),根据设置的构建触发器,会触发 Jenkins 的构建流程。
2. Jenkins 执行构建和自动化测试
  • 当触发构建后,Jenkins 会按照配置的构建步骤进行操作:
    • 首先从 Git 仓库拉取最新的代码到 Jenkins 工作空间(一个临时的目录,用于存放项目代码及构建相关的文件等)。
    • 然后执行 Maven 的构建命令(以 Java 项目为例),进行编译、打包等操作,生成相应的软件制品(如 JAR 文件等)。
    • 接着会执行自动化测试,对于 Java 项目,如果在项目中有使用 JUnit 等测试框架编写的单元测试用例,Maven 在构建过程中会自动运行这些测试用例,并将测试结果反馈给 Jenkins。如果测试不通过,Jenkins 会在构建历史记录中标记该次构建失败,并通过之前配置的通知机制(如邮件等)通知开发人员,开发人员则需要根据测试报告去查找和修复代码中的问题,然后再次提交代码触发新的构建。
3. 查看构建结果与反馈
  • 在 Jenkins 的项目页面,可以查看每次构建的详细情况,包括构建是否成功、构建时间、测试报告等信息。开发人员和相关团队成员可以通过这些信息及时了解代码集成的状态以及存在的问题,持续优化代码质量,确保每次代码提交后都能顺利通过构建和测试环节,保证代码仓库中的代码处于可随时发布的状态。

四、持续交付 / 持续部署(CD)流程实现

1. 制品管理(以 Nexus 为例,也可选用其他制品库)
  • 安装 Nexus(可选步骤,如果已有合适的制品库可跳过)
    • Windows 系统:从 Nexus 官网下载安装包进行安装,按照提示配置相关参数,比如端口号、仓库设置等。
    • Linux 系统(以 Ubuntu 为例):可以下载 Nexus 的压缩包进行解压安装,也可以通过一些包管理工具(如 apt 等)查找是否有对应的安装包进行安装。安装完成后,配置相关参数并启动服务,通过浏览器访问对应的端口(默认是 8081)进入 Nexus 管理界面,创建相应的仓库(如 Maven 仓库用于存储 Java 项目制品等)。
  • 将构建制品推送到制品库
    • 在 Jenkins 的项目配置中添加 “构建后操作” 步骤,选择 “Deploy artifacts to Maven repository”(针对 Java 项目推送制品到 Maven 仓库的情况,其他项目可根据对应工具和制品库进行相应配置),填写 Nexus 仓库的相关信息,如仓库 URL、认证信息(如果需要)等,这样在每次构建成功后,会自动将生成的软件制品(如 JAR 文件等)推送到 Nexus 制品库中进行存储和管理,方便后续部署使用。
2. 环境部署(以下以 Docker 容器化部署为例)
  • 创建 Dockerfile(如果使用 Docker 部署)
    在项目的根目录下创建一个 Dockerfile 文件,用于定义如何将项目打包成一个 Docker 容器,例如对于一个简单的 Java 项目,其 Dockerfile 内容可能如下:
    FROM openjdk:11-jdk-alpine
    WORKDIR /app
    COPY target/*.jar app.jar
    ENTRYPOINT ["java", "-jar", "app.jar"]

    这表示基于 openjdk:11-jdk-alpine 这个基础 Docker 镜像(轻量级的 Java 11 环境镜像),在容器内创建 /app 工作目录,将项目构建生成的 JAR 文件(假设在 target 目录下)复制到容器内的 /app 目录下,并设置容器启动时执行的命令为运行该 JAR 文件。

  • 配置 Jenkins 进行部署(结合 Docker)
    • 在 Jenkins 的项目配置 “构建后操作” 中,添加 “Execute shell”(如果是 Linux 环境)或者 “Execute Windows batch script”(如果是 Windows 环境)等步骤,在脚本内容中编写 Docker 相关的部署命令,比如:
      docker build -t your-project-image.
      docker run -d -p 8080:8080 your-project-image

      这两条命令分别表示根据项目的 Dockerfile 构建一个名为 your-project-image 的 Docker 容器镜像,然后以守护进程模式(-d)运行该容器,并将容器内的 8080 端口映射到主机的 8080 端口(这里端口可根据项目实际需求修改),使得项目可以通过主机的 8080 端口对外提供服务。

    • 验证部署情况
      在目标环境(如预发布环境、生产环境等)中,通过访问相应的 URL(如 http://<服务器 IP 地址>:8080)来验证项目是否成功部署并正常运行,可以进行一些功能测试、性能测试等操作进一步确认软件在该环境下的状态,确保符合质量要求。
    •  

      对于持续交付来说,在完成上述步骤后,还需要相关人员根据业务情况决定何时将软件从预发布环境等最终部署到生产环境中;而对于持续部署,只要前面所有流程(包括构建、测试、制品管理、环境部署验证等)都顺利通过,就会自动将软件部署到生产环境中,无需人工干预,实现快速高效的软件交付和部署。

       

      这就是一个基于常见工具搭建 CI/CD 流程的基本教程,实际应用中可以根据不同的项目类型、团队规模、业务需求等进行更加复杂和精细化的配置与优化。

相关文章:

持续集成与持续部署:CI/CD实现教程

以下是一个基于常见工具实现 CI/CD 的基本教程示例&#xff0c;这里以 Git、Jenkins、Maven&#xff08;用于 Java 项目构建和管理依赖&#xff0c;其他语言项目可替换为对应构建工具&#xff09;以及 Docker&#xff08;用于容器化部署&#xff0c;非必需但很常用&#xff09;…...

深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验

目录 一、模型构建 1.1残差单元 1.2 残差网络的整体结构 二、统计模型的参数量和计算量 三、数据预处理 四、没有残差连接的ResNet18 五、带残差连接的ResNet18 附&#xff1a;完整的可运行代码 实验大体步骤&#xff1a; 先前说明&#xff1a; 上次LeNet实验用到的那…...

Linux系统如何排查端口占用

如何在Linux系统中排查端口占用 在Linux系统中&#xff0c;当您遇到网络服务无法启动或响应异常的情况时&#xff0c;可能是因为某个特定的端口已经被其他进程占用。这时&#xff0c;您需要进行端口占用情况的排查来解决问题。本文将介绍几种常用的命令行工具和方法&#xff0…...

Linux常用命令之id命令详解

id命令详解 id 命令在 Linux 和 Unix 系统中用于显示用户的标识信息&#xff0c;包括用户ID&#xff08;UID&#xff09;、组ID&#xff08;GID&#xff09;以及用户所属的附加组。这个命令对于系统管理员和开发者来说非常有用&#xff0c;因为它能帮助他们确认运行命令或脚本…...

WGCLOUD如何部署在ARM平台

WGCLOUD是一款开源免费的运维平台&#xff0c;非常强大方便&#xff0c;可以帮我们提高运维效率 我们项目中&#xff0c;大部分是ARM的服务器&#xff0c;那么如何部署WGCLOUD呢&#xff0c;其实挺简单的 首先是部署服务端server 我们只要安装好对应ARM版本的JDK&#xff0c;…...

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…...

HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…...

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5&#xff0c;你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…...

鸿蒙开发Hvigor插件动态生成代码

Hvigor允许开发者实现自己的插件&#xff0c;开发者可以定义自己的构建逻辑&#xff0c;并与他人共享。Hvigor主要提供了两种方式来实现插件&#xff1a;基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。 基于hvigorfile脚本…...

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…...

Java String 字符串常用操作

一、Java String 字符串常用操作 1、替换 Java字符模板替换 public static final String temp"private {0} {1};";public static void main(String[] args) {System.out.println(MessageFormat.format(temp,"String","str"));} replaceAll替换…...

4.4 MySQL 触发器(Trigger)

触发器是一种特殊的数据库对象&#xff0c;在特定事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。 1. 简介 1.1 什么是触发器 触发器&#xff08;Trigger&#xff09;是由用户定义的…...

C语言——break、continue、goto

目录 一、break 二、continue 1、在while循环中 2、在for循环中 三、go to 一、break 作用是终止循环&#xff0c;在循环内遇到break直接就跳出循环。 注&#xff1a; 一个break语句只能跳出一层循环。 代码演示&#xff1a; #include<stdio.h>void test01() {for (…...

oracle数据恢复总结篇

前言:数据恢复的关键 定删除时间点&#xff1a;首先&#xff0c;需要知道是什么时间进行的删除操作。 如果不能确定具体时间点&#xff0c;可以选择尽量准确的删除数据前的时间。 oracle数据库如果使用drop指令误删除了数据应该如何恢复呢&#xff1f; 如果没有进行其他操作&…...

运维面试题.云计算面试题之四.K8S

常见的k8s运维面试题 1、简述ETCD及其特点? etcd是一个用于配置共享和服务发现的键值存储系统,能够为整个分布式集群存储关键数据,协助集群正常运转 服务端将配置信息存储在etcd中,客户端从etcd中得到配置信息,etcd监听配置信息的变化,发现配置变化通知到客户端 特点 - 安…...

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…...

C++11:多线程编程

目录 线程库基本用法创建线程给线程传递参数线程分离 常见数据未定义错误传递指针或引用指向局部变量的问题传递指针或引用指向已释放的内存的问题类成员函数作为入口函数&#xff0c;类对象被提前释放智能指针来解决该问题入口函数为类的私有成员函数 互斥量死锁 lock_guard与…...

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…...

OmniDiskSweeper :一款专为 macOS 设计的磁盘使用分析工具

OmniDiskSweeper 是一款专为 macOS 设计的磁盘使用分析工具&#xff0c;由 The Omni Group 开发。它的主要目的是帮助用户可视化磁盘上的文件和文件夹&#xff0c;并找出占用大量空间的文件&#xff0c;从而帮助用户释放磁盘空间。 OmniDiskSweeper 的特点包括&#xff1a; 简…...

【什么是Redis?】

Redis&#xff1a;高性能内存数据库的深度探索 在当今这个数据驱动的世界里&#xff0c;数据库的选择直接关系到应用程序的性能、可扩展性和可靠性。在众多数据库解决方案中&#xff0c;Redis以其卓越的性能、丰富的数据结构和灵活的使用场景脱颖而出&#xff0c;成为众多开发…...

React第十六章(useLayoutEffect)

useLayoutEffect useLayoutEffect 是 React 中的一个 Hook&#xff0c;用于在浏览器重新绘制屏幕之前触发。与 useEffect 类似。 用法 useLayoutEffect(() > {// 副作用代码return () > {// 清理代码}}, [dependencies]);参数 setup&#xff1a;Effect处理函数,可以返回…...

shell 基础知识2 ---条件测试

目录 一、条件测试的基本语法 二、文件测试表达式 三、字符串测试表达式 四、整数测试表达式 五、逻辑操作符 六、实验 为了能够正确处理 Shell 程序运行过程中遇到的各种情况&#xff0c; Linux Shell 提供了一组测试运算符。 通过这些运算符&#xff0c;Shell 程序能够…...

【线程】Java线程操作

【线程】Java线程操作 一、启动线程1.1 run()和start()的区别 二、终止线程三、等待线程四、线程的状态 一、启动线程 Java中通过start()方法来启动一个线程&#xff0c;其次我们要着重理解start()和run()的区别。 1.1 run()和start()的区别 我们通过一份代码来进行观察&…...

Linux内核

Linux内核是Linux操作系统的核心部分&#xff0c;它管理着硬件资源并提供基本的服务给用户程序。以下是Linux内核的几个关键方面&#xff1a; 1. 架构&#xff1a; 单内核设计&#xff1a;Linux采用的是单内核设计&#xff0c;这意味着所有操作系统服务都在一个地址空间内运行…...

Sentinel服务保护

Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; home | Sentinel Sentinel 的使用可以分为两个部分: 核心库&#xff08;Jar包&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以…...

python代码制作数据集的测试和数据质量检测思路

前言 本文指的数据集为通用数据集&#xff0c;并不单是给机器学习领域使用。包含科研和工业领域需要自己制作数据集的。 首先&#xff0c;在制作大型数据集时&#xff0c;代码错误和数据问题可能会非常复杂。 前期逻辑总是简单的&#xff0c;库库一顿写&#xff0c;等排查的时…...

笔记记录 k8s-install

master节点安装: yum upgrade -y 更新系统 yum update -y 升级内核 ifconfig ens33 关闭swap swapoff -a (临时) vim /etc/fstab (永久) #/dev/mapper/cl-swap swap swap defaults 0 0 vim /etc/sysctl.conf vm.swappin…...

丹摩征文活动|基于丹摩算力的可图(Kolors)的部署与使用

Kolors是一个以生成图像为目标的人工智能系统&#xff0c;可能采用了类似于OpenAI的DALLE、MidJourney等文本生成图像的技术。通过自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;相结合&#xff0c;Kolors能够根据用户提供的文本描述生成符合…...

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了&#xff0c;而且Vue项目就应该正经走项目流程啊喂&#xff01; npm i amap/amap-jsapi-loader --save 官方说这样执行完&#xff0c;就这结束啦&#xff01;它结束了&#xff0c;我还没有&#xff0c;不然不可能记录这篇文…...

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…...