【网课平台】Day15.Devops:持续集成与持续交付

news2024/11/24 18:37:02

文章目录

  • 一、Devops
    • 1、什么是Devops
    • 2、什么是CI/CD
    • 3、Devops方案参考
  • 二、人工部署
    • 1、项目打jar包
    • 2、生成镜像、创建容器
  • 三、自动化部署
    • 1、代码提交到git
    • 2、修改pom.xml文件
    • 3、前端部署

一、Devops

1、什么是Devops

一个软件的生命周期包括:需求分析阶、设计、开发、测试、上线、维护、升级、废弃。详细如下:

  • 产品人员进行需求分析
  • 设计人员进行软件架构设计和模块设计
  • 每个模块的开发人员并行开发,设计接口、进行编码,并进行单元测试
  • 开发完毕,将代码集成部署到测试服务器,测试人员进行测试
  • 测试人员发现bug,提交bug、开发人员修改bug
  • bug修改完毕再次集成、测试
  • 测试完毕,项目上线
  • 运维人员进行安装部署、培训
  • 用户提出问题,返回给运维人员
  • 运维人员反馈给开发人员,开发人员进行问题处理
  • 再次提交测试
  • 测试完毕再次部署升级

整个生命周期中有两个核心阶段:开发阶段和维护阶段 ⇒ ⇒ 提高开发阶段、运维阶段的工作效率是企业在进行软件项目管理的重点。⇒ ⇒Devops

在这里插入图片描述

DevOps(Development和Operations的组合词),DevOps不是一种工具,也不是一个工作岗位,而是一种思想理念,它涵盖开发、测试、运维的整个过程。DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件集成,使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件。

在这里插入图片描述

2、什么是CI/CD

关于Devops理念如何落地,对每个阶段都开发出一大批工具,这些工具包含了开发、测试、运维等各个阶段。下图是Devops工具集:

在这里插入图片描述

有了工具,接下来就是实施Devops的具体方案⇒ ⇒CI/CD,其中:

  • CI:Continuous Intergration,即持续集成
  • CD:Continuous Delivery 和 Continuous Depolyment,即持续交付和持续部署
CI:持续集成

即团队成员需要频繁的集成他们的工作(将开发分支合并到主分支),每次集成都通过自动化构建(包括编译、构建、自动化测试)来验证,从而尽快地发现集成中的错误,让产品可以快速迭代,同时还能保持高质量

在这里插入图片描述

CD:持续交付

持续交付将集成后的代码部署到类生产环境(测试、预发布环境),除了交付到类生产环境之外,还会执行一些集成测试、API测试。持续交付强调的是“交付”,交付给测试、产品验收,不管怎么更新,软件是随时随地可以交付的。

在这里插入图片描述

CD:持续部署

在持续交付的基础上由开发人员或运维人员自助式的定期向生产环境部署稳定的构建版本,持续部署的目标是代码在任何时刻都是可部署的,并可自动进入到生产环境。

在这里插入图片描述
以上三个过程环环相扣,每个过程都自动化执行。

3、Devops方案参考

下图是一种可行的CI/CD方案:

在这里插入图片描述

二、人工部署

1、项目打jar包

STEP1:项目打包

  • 在父工程pom文件中使用<modules>聚合各模块
<!--聚合的好处是Maven自动识别依赖关系,如checkcode服务依赖base服务,打包的时候则会先把base打包,再打包checkcode-->
<modules>
    <module>../xuecheng-plus-base</module>
    <module>../xuecheng-plus-checkcode</module>
    <module>../xuecheng-plus-gateway</module>
    <module>../xuecheng-plus-auth</module>
    <module>../xuecheng-plus-content</module>
    <module>../xuecheng-plus-learning</module>
    <module>../xuecheng-plus-media</module>
    <module>../xuecheng-plus-orders</module>
    <module>../xuecheng-plus-message-sdk</module>
    <module>../xuecheng-plus-search</module>
    <module>../xuecheng-plus-system</module>
</modules>
<!--父工程中还有依赖版本的统一管理-->
  • 配置打包插件(在每个要打可执行jar包的工程中配置该插件,否则直接执行maven的package指令出来的jar包无法运行。base这种工程就不用加了。)
<!--在需要打可执行包的工程中配置spring-boot-maven-plugin插件
否则报 “jar中没有主清单属性” 
"Unable to access jarfile "-->
<build>
 <!--以后jar包的名字-->   
 <finalName>${project.artifactId}-${project.version}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

  • 插件安装成功
    在这里插入图片描述
# 功能说明
build-info: 生成项目的构建信息文件 build-info.properties
repackage: 这个是默认 goal,在 mvn package 执行之后,这个命令再次打包生成可执行的 jar,同时将 mvn package 生成的 jar 重命名为 *.origin
run: 这个可以用来运行 Spring Boot 应用
start: 这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
stop: 这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理

  • 在父工程执行:clean install -DskipTests -f pom.xml 对所有工程进行打包
    在这里插入图片描述
package、install、deploy三者的区别:
package: 打包
install: 打包完以后拷贝到本地仓库
deploy: 打包完后上传到局域网的私服
# -DskipTests跳过测试
  • 等待打包成功,在target目录下即可看到jar包
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 验证一下jar包是否正常,打开cmd:java -Dfile.encoding=utf-8 -jar xuecheng-plus-checkcode-0.0.1-SNAPSHOT.jar
    在这里插入图片描述
    在这里插入图片描述

2、生成镜像、创建容器

STEP2:部署到Linux

  • 在Linxu目录下编写DockerFile文件
FROM java:8u20
MAINTAINER docker_maven docker_maven@email.com
WORKDIR /ROOT
ADD xuecheng-plus-checkcode-0.0.1-SNAPSHOT.jar xuecheng-plus-checkcode.jar
CMD ["java", "-version"]
//对比启动jar包的指令
ENTRYPOINT ["java", "-Dfile.encoding=utf-8","-jar", "xuecheng-plus-checkcode.jar"]
EXPOSE 63075


  • 将打好的jar包拷贝到该目录
    在这里插入图片描述
  • 执行镜像构建指令docker build -t checkcode:1.0 .

指令中最后的. 即当前目录在这里插入图片描述
报这个错,是因为Dockerfile文件被命名成了DockerFile,不想改名就-f指定一下
docker build -t checkcode:1.0 -f DockerFiler .

  • 构建成功
    在这里插入图片描述

  • 根据镜像启动容器
    在这里插入图片描述

docker run --name checkcode -p 63075:63075 -idt checkcode:1.0

到此,Java工程,从代码到jar包,再到镜像,再到Docker容器部署到Linux上的整个过程,手动完成了!

此时,请求虚拟机IP:63075/checkcode/pic即可
docker logs -f 容器ID查看日志

三、自动化部署

接下来使用Jenkins来完成CI/CD:

在这里插入图片描述

  • 代码使用git托管
  • 在jenkins创建任务,从Git拉取代码
  • 拉取代码后进行自动构建
  • 将代码打成镜像包上传到docker私服
  • 自动创建容器、启动容器
  • 当有代码push到git实现自动构建

1、代码提交到git

git commit
git push

在这里插入图片描述

2、修改pom.xml文件

添加docker-maven-plugin插件实现将springboot工程创建镜像。在要部署到容器的每个微服务中添加以下插件:

<build>

<!--生成可执行的jar包-->    
<finalName>${project.artifactId}-${project.version}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!--创建镜像,上传镜像-->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.2.2</version>
            <configuration>
                <!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和 TAG,我们要直接传到私服-->
                <!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本-->
                <!--<imageName>${project.artifactId}:${project.version}</imageName>-->
                <imageName>192.168.101.65:5000/${project.artifactId}:${project.version}</imageName>
                <!--也可以通过以下方式定义image的tag信息。 -->
                <!-- <imageTags>
                     <imageTag>${project.version}</imageTag>
                     &lt;!&ndash;build 时强制覆盖 tag,配合 imageTags 使用&ndash;&gt;
                     <forceTags>true</forceTags>
                     &lt;!&ndash;build 完成后,push 指定 tag 的镜像,配合 imageTags 使用&ndash;&gt;
                     <pushImageTag>true</pushImageTag>
                 </imageTags>-->
                <baseImage>java:8u20</baseImage>
                <maintainer>docker_maven docker_maven@email.com</maintainer>
                <workdir>/root</workdir>
                <cmd>["java", "-version"]</cmd>
                <!--来指明Dockerfile文件的所在目录,如果配置了dockerDirectory则忽略baseImage,maintainer等配置-->
                <!--<dockerDirectory>./</dockerDirectory>-->
                <!--2375是docker的远程端口,插件生成镜像时连接docker,这里需要指定docker远程端口-->
                <dockerHost>http://192.168.101.65:2375</dockerHost>
                <!--入口点,project.build.finalName就是project标签下的build标签下 的filename标签内容,testDocker-->
                <!--相当于启动容器后,会自动执行java -jar ...-->
                <entryPoint>["java", "-Dfile.encoding=utf-8","-jar", "/root/${project.build.finalName}.jar"]</entryPoint>
                <!--是否推送到docker私有仓库,旧版本插件要配置maven的settings文件。 -->
                <pushImage>true</pushImage>
                <registryUrl>192.168.101.65:5000</registryUrl>  <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                <resources>
                    <resource>
                        <targetPath>/root</targetPath>
                        <directory>${project.build.directory}</directory>
                        <!--把哪个文件上传到docker,相当于Dockerfile里的add app.jar /-->
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

  • 在Jenkins源码管理中配置git仓库的地址
    在这里插入图片描述
  • 打包指令、生成镜像上传镜像到私服
    在这里插入图片描述
  • 进入任务点击build now
    在这里插入图片描述
  • 控制台查看日志
    在这里插入图片描述
  • 配置触发器,当代码提交时,jenkins自动构建任务

3、前端部署

  • 在docker中部署nginx,修改nginx.conf配置文件
  • 将静态资源拷贝到容器映射到宿主机的目录
  • 将机构端的前端工程打包,运行yarn build
  • 打包成功在工程目录生成dist目录
  • 将此目录的内容拷贝到虚拟机的/data/soft/nginx/xuecheng_portal_static/dist

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

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

相关文章

SpringCloud:ElasticSearch之集群

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题、单点故障问题。 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点单点故障问题&#xff1a;将分片数据在不同节…

【原创】运维的终点是开发~chatGPT告诉你真相

文章目录 软件技术岗位鄙视链&#xff0c;你在哪层呢&#xff1f;让chatGPT告诉你运维工作好&#xff0c;还是开发工作好问它几个问题1. 一个三年运维成长的案例和薪资2. 一个三年开发成长的案例和薪资3. 一个五年运维成长的案例和薪资4. 一个五年开发成长的案例和薪资5. 一个十…

云分析迁移:顺应需求

云提供了对新分析功能、工具和生态系统的访问&#xff0c;可以快速利用这些功能、工具和生态系统来测试、试点和推出新产品。然而&#xff0c;尽管迫在眉睫&#xff0c;但企业在将分析迁移到云时仍感到担忧。组织正在寻找能够帮助他们分配资源和集成业务流程的服务提供商&#…

Linux 服务器上安装和使用 Redis,只需这 4 步!

一、使用 yum 安装 Redis 使用以下命令&#xff0c;直接将 redis 安装到 linux 服务器&#xff1a; yum -y install redis 二、配置远程连接 a&#xff09;首先第一步&#xff0c;将 redis 配置文件下载到本地&#xff08;如果你熟悉 vim 操作&#xff0c;直接用 vim 编辑即可…

论文阅读《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID》

论文地址&#xff1a;https://arxiv.org/pdf/2206.02066.pdf 源码地址&#xff1a;https://github.com/XuJiacong/PIDNet 概述 针对双分支模型在语义分割任务上直接融合高分辨率的细节信息与低频的上下文信息过程中细节特征会被上下文信息掩盖的问题&#xff0c;提出了一种新的…

【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)

文章目录 1. 背景2. 技术点3 子模块依赖SpringBoot设置4. 多环境配置4.1 application.yml4.2 application-pro.yml 5. 多数据源配置5.1 yml配置5.2 自定义数据源在Java中配置5.2.1 PhoenixDataSourceConfig5.2.2 MysqlDataSourceConfig 6. 完整的Pom6. 测试6.1 Mapper配置6.2 方…

字符、块、网络设备

设备模型&#xff08;的意义&#xff09; 降低设备多样性带来的Linux驱动开发的复杂度&#xff0c;以及设备热拔插处理、电源管理等&#xff0c;Linux内核提出了设备模型概念。设备模型将硬件设备归纳、分类&#xff0c;然后抽象出一套标准的数据结构和接口。驱动的开发&#…

Java项目上线之云服务器环境篇(四)——Redis的安装与配置

Java项目上线之云服务器环境篇&#xff08;四&#xff09;——Redis的安装与配置 在我们的项目里可能会用到Redis缓存&#xff0c;需要对Redis进行简单的配置。 1、我们的redis最好放在一个事先安装好的文件夹里&#xff0c;这样更方便于管理。 例如&#xff1a; redis我是放在…

前端开发:JS的事件循环执行机制详解

前言 在前端开发中&#xff0c;涉及到JS原生的使用原理是非常重要的知识点&#xff0c;尤其是在实际工作过程中会遇到各种复杂的业务需求场景&#xff0c;以及具体开发中可能会遇到一些涉及基于JS原理的使用&#xff0c;这都要求开发者能够很好的了解和掌握JS原生的常用原理。J…

jvm之类加载器

写在前面 当我们通过javac命令将java源代码编译为Java字节码后&#xff0c;必须通过类加载器将其加载到jvm中才能运行&#xff0c;所以类加载器是jvm中非常重要的一个组成部分&#xff0c;本文我们就一起来看下吧&#xff01; 1&#xff1a;类的生命周期 类的生命周期如下图…

leetcode刷题之回文链表and最长回文子串

234.回文链表 方法一:找中间结点,断开链表,后一段链表进行反转 思路:①找中间结点:使用快慢指针fast,slow,fast每次走两个,slow每次走一个; 如果链表的个数是奇数个,那么最后slow指向中间节点 如果链表的个数是偶数个,那么最后slow指向中间两个节点的后一个 ②使用prev指针保…

文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题

八、可以扩展我们的记号到有两个参数n和m的情形&#xff0c;其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n, m)&#xff0c;用O(g(n, m))来表示以下函数集&#xff1a; O(g(n, m)) { f(n, m): 存在正常量c、和&#xff0c;使得对所有n>n0或m>m0&#xff…

unity 性能优化之合批和剔除

批次对渲染的性能影响是比较大的&#xff0c;批次过多会导致cpu提交的次数过多&#xff0c;导致每帧渲染时间过长&#xff0c;所以我们需要对其优化&#xff0c;减少Bathches数量和SetPassCall次数。 批次合并的方法有多种&#xff0c;下面一一列出&#xff1a; 手动合批 将相…

CRM系统多少钱一套?盘点主流各大CRM系统价格

阅读本文你将了解&#xff1a;1.CRM定价规则&#xff1b;2.各大CRM系统报价&#xff08;CRM系统多少钱一套&#xff09;;3.CRM系统费用构成。 一、CRM定价规则 很多企业都寻求使用CRM系统来管理客户关系&#xff0c;从而优化管理流程&#xff0c;提升业绩。 对于企业而言&…

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失)

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1985-2021年 2、范围&#xff1a;包括全国31省 3、来源&#xff1a;各省NJ、社会统计NJ、人口和就业NJ 4、指标包括&#xff1a;省第一产业就业人数、省第…

Baumer工业相机堡盟相机如何使用PixelTransformation像素转换功能(像素转换功能的使用和优点以及行业应用)(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

2023年,web前端工程师20道Vue面试题及解析

本文章列出了20道关于Vue.js的面试题&#xff0c;包括基础和进阶问题&#xff0c;并提供了问题的答案及解析&#xff0c;以帮助读者更好地准备面试。从指令、生命周期函数到组件间通信和路由等各方面都作了涉及。 1. 什么是Vue.js&#xff1f;它有哪些特点&#xff1f; 答案&…

Git服务器集成(一)

本篇文章旨在分享本人在学习Git时的随笔记&#x1f929; 文章目录 Git 远程服务器1、下载 Git 软件&#xff08;linux版本&#xff09;2、安装 Git 软件2.1 解压 Git2.2 安装依赖2.3 删除旧版 Git2.4 编译、安装 Git2.5 配置环境变量2.6 建立链接文件2.7 测试安装 3、创建 Git …

使用Selenium控制Chrome浏览器 --工作自动化

使用Selenium控制Chrome浏览器 --工作自动化 背景&#xff1a; 最近朋友在用秒账做帐时&#xff0c;由于销售单量很大&#xff0c;重复录入工作一天一录就近五个小时&#xff0c;寻求帮助&#xff0c;问能不能把这重复劳动减少些&#xff0c;看后分析&#xff0c;使用web自动…

为网站的中文和英文使用不同的字体

CSS为网站的中文和英文使用不同的字体 前言 最近我在搭建个人网站&#xff0c;在这个过程中遇到很多的问题&#xff0c;不过chatGPT3.5帮助了很多&#xff0c;这是我使用的咒语&#xff1a; 我正在搭建一个个人网站&#xff0c;使用python Flask框架&#xff0c;CSS采用Boots…