【Java实战篇】Day15.在线教育网课平台--持续集成

news2024/12/23 5:03:17

文章目录

  • 一、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/466966.html

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

相关文章

如何利用AI技术提升拍卖小程序开发的用户体验

作为一名拍卖小程序开发者&#xff0c;提供一个优质的用户体验&#xff0c;以吸引更多的用户是我们的目标。然而&#xff0c;如何实现这一目标呢&#xff1f;在本文中&#xff0c;我们将介绍如何利用AI技术来提升拍卖小程序开发的用户体验。 了解用户需求 在开始开发拍卖小程…

centos测试主机网络极限速度

在CentOS主机上测试极限带宽&#xff0c;可以使用iperf工具进行测试,需要两台同一网络的主机 1.安装iperf工具 yum -y install iperf 2.启动iperf服务器 iperf -s 3.启动iperf客户端 iperf -c 10.1.60.118 通过以上输出可以看到 TCP window size&#xff1a;表示TCP窗口大…

Qt音视频开发41-文件推流(支持网页和播放器播放并切换进度)

一、前言 本功能最初也是有一些人提过类似的需求&#xff0c;就是能不能将本地的音视频文件&#xff0c;通过纯Qt程序推流出去&#xff0c;然后用户可以直接在网页上播放&#xff0c;也可以用各种播放器播放&#xff0c;然后还可以任意切换播放进度&#xff0c;其实说白了就是…

炼石参编《2022网信自主创新调研报告》正式发布|附下载

2023年4月19日&#xff0c;“第六届关键信息基础设施自主安全创新论坛-暨纪念‘419’讲话发表七周年活动”隆重召开&#xff0c;网信自主创新调研报告编委会在论坛上正式发布《2022网信自主创新调研报告》&#xff08;以下简称《报告》&#xff09;。《报告》秉持脚踏实地、实事…

APQP开发流程术语及定义

APQP流程 : 概念批准->项目批准->A样设计->B样设计开发->C样设计开发->小批生产及过程验证->量产 A 样件 是指产品的基本概念体现&#xff0c;虚拟产品设计开发&#xff0c; 主要为了得到主机厂的初步确认。处于手工件阶段的产品定义为A样件。 B 样件 是指具…

如何查看OpenAI的api-key?

如何查看OpenAI的api-key&#xff1f; 记录一下如何查看 OpenAI的 api-key 文章目录 如何查看OpenAI的api-key&#xff1f;前提具体操作 前提 作为ChatGPT的开发商&#xff0c;OpenAI为开发者提供了API&#xff0c;使得开发者能在自己的应用程序中调用OpenAI的相关服务。本文…

外网域名访问tomcat服务器上项目并且通过域名路径访问图片接口

今天给大家阐述如何在工作中&#xff0c;利用外网进行访问服务器的项目以及文件图片。 通过域名的形式进行公网访问&#xff1a;如&#xff1a;www.xxxxxx.com访问网站&#xff0c;www.xxxxxx.com/image/upload.png 访问服务器上的网络图片 一&#xff1a;主要就是部署修改服…

将gitbub下载的docker-compose项目运行在docker

目录 一.从github上下载代码到本地 1.通过github指令获取 2.通过zip的方式直接把包下载到本地 3.区别 二.在代码包找到docker-compose.yml文件 1.如果官网有提示路径可以直接在文件夹找到这个文件 2.使用开发软件打开项目查看(可用软件搜索yml) 3.知识补充&#xff08;yml文件编…

GRACE mascon数据下载链接汇总

一直有粉丝询问我数据下载的问题&#xff0c;这里我将汇总三大GRACE Mascon数据的下载链接&#xff0c;以及基础的数据处理方法。 首先&#xff0c;GRACE Mascon数据包含有三大机构&#xff0c;分别是CSR、JPL和GSFC&#xff08;注意不是GFZ&#xff09;。 1.CSR mascon 下载…

使用FFMPEG库封装264视频和acc音频数据到MP4文件中

准备 ffmepeg 4.4 一段H264的视频文件 一段acc格式的音频文件 封装流程 1.使用avformat_open_input分别打开视频和音频文件&#xff0c;初始化其AVFormatContext&#xff0c;使用avformat_find_stream_info获取编码器基本信息 2.使用avformat_alloc_output_context2初始化…

前端04-CSS三大特性

三大特性&#xff1a;层叠性、继承性、优先级 层叠性 相同选择器设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式&#xff0c;层叠性主要解决样式冲突的问题。 —>哪个样式离结构近&#xff0c;就执行哪个样式 继承性 子标…

面试(一)

String、StringBuffer、StringBuilder区别 string 类中使用 final关键字字符数组保存字符串&#xff0c;所以 String 对象是不可变的。而StringBuilder 与 StringBufer 也是使用字符数组保存字符 char[]value 但是没有用 final 关键字修饰&#xff0c;所以这两种对象都是可变…

2023性价比高的台灯测评哪些好一点?性价比高的台灯推荐

我们知道现代社会近视的人非常多&#xff0c;而且呈低龄化发展&#xff0c;如果不能在近视之后保证科学的用眼&#xff0c;那视力也会变得越来越差。选择好台灯也是保护视力的一个方面&#xff0c;有很多台灯实际上含有蓝光&#xff0c;它对视网膜有一定伤害性&#xff0c;护眼…

gRPC---TLS实现

文章目录 1.首先通过openssl生成证书和私钥2.配置环境变量3.命令行测试 openssl4. 生成证书5. 更改openssl.cfg6.7.服务端代码8.客户端代码 1.首先通过openssl生成证书和私钥 https://slproweb.com/products/Win32OpenSSL.html 2.配置环境变量 3.命令行测试 openssl 4. 生成…

UEStudio v2023 Crack应用程序脚本更新

UEStudio v2023 Crack应用程序脚本更新 添加了现代JavaScript支持和完整的浏览器功能。 默认情况下添加了传统的JavaScript支持&#xff0c;以实现完全的向后兼容性。 可对接的Microsoft PowerShell终端 添加了可停靠窗口&#xff0c;可以作为浮动窗口放置在任何位置&#…

java学习之枚举

目录 一、枚举引出 二、分析问题 三、 解决方案-枚举 四、枚举的二种实现方式 五、应用案例 六、小结 一、枚举引出 package enum_;public class Enumeration01 {public static void main(String[] args) {Season spring new Season("春天", "温暖")…

工具链和其他-Web服务器和实例caddy

目录 web服务器介绍 web服务器需要哪些能力&#xff1f;以caddy为例 web server&#xff08;用户发请求它返回网页&#xff09; 代理&#xff08;proxy&#xff09; 缓存&#xff08;cache&#xff09; 日志&#xff08;logging&#xff09; API网关&#xff08;api gatewa…

机器视觉实用工具集NO.18——使用YOLO8实时检测物体,性能爆棚

目录 前言安装YOLO8安装YOLO8的模型程序源代码总结 前言 安装了pytorch框架以后&#xff0c;就可以玩一些开源的深度学习框架了&#xff0c;比如YOLO8&#xff0c;是基于pytorch框架的&#xff0c;关于如何安装pytorch框架&#xff0c;可以参考上篇文章链接《pytorch深度学习框…

我看看哪个靓仔还没把Github Copilot用起来?

本人经常分享有价值的生产力工具、技术、好物与书籍&#xff0c;可关注同名公众&#x1f42d;并设为&#x1f31f;星标&#xff0c;第一时间获得更新 Github Copilot 是一个AI编程助手&#xff0c;其使用 OpenAI CodeX 在你的编辑器中实时建议代码或给你实现整个功能。 视频版介…

C++基础 类的自动转换和强制类型转换

参考 C Primer Plus (第6版) 类自动转换 接受一个参数的构造函数允许使用赋值语法将对象初始化一个值 Classname object value; 等价于 ClassName object(value); 等价于 ClassName object ClassName(value); 只有接受一个参数的构造函数才能作为转换构造函数(某类型->…