[学成在线]22-自动部署项目

自动部署

实战流程

下边使用jenkins实现CI/CD的流程。

1、将代码使用Git托管

2、在jenkins创建任务,从Git拉取代码。

3、拉取代码后进行自动构建:测试、打包、部署。

首先将代码打成镜像包上传到docker私服。

自动创建容器、启动容器。

4、当有代码push到git实现自动构建。

代码提交至Git

修改pom.xml文件

在pom.xml添加docker-maven-plugin插件实现将springboot工程创建镜像,此pom.xml添加docker-maven-plugin插件用于生成镜像。

分别修改system-api、content-api、media-api、gateway、auth、checkcode服务的pom.xml文件。

插件的坐标如下:

<dependency><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version>
</dependency>

修改pom.xml文件,以xuecheng-plus-checkcode为例,如下:

<build><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>

其中system-api服务的bootstrap.yml修改如下:

server:servlet:context-path: /systemport: 63110
#微服务配置
spring:application:name: system-apidatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.101.65:3306/xcplus_system?serverTimezone=UTC&userUnicode=true&useSSL=false&username: rootpassword: mysqlcloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: dev166group: xuecheng-plus-project
# 日志文件配置路径
logging:config: classpath:log4j2-dev.xml# swagger 文档配置
swagger:title: "学成在线系统管理"description: "系统管理接口"base-package: com.xuecheng.systemenabled: trueversion: 1.0.0

在system-api工程添加nacos的依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

删除system-service工程下的配置文件。

以上内容修改完毕再次提交Git.

自动构建测试

找到jenkins_02任务,配置源码管理

配置完毕,开始构建

通过控制台输出日志观察构建情况

如果控制台有报错,根据错误信息进行调试。

部署成功后,进入服务器查看docker容器是否启动成功

部署前端门户

在虚拟机的docker中已经部署了nginx,修改nginx.conf的配置文件

#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {server_names_hash_bucket_size 64;client_max_body_size 100M; # 设置客户端请求体最大值client_body_buffer_size 128k; # 设置请求体缓存区大小include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#文件服务upstream fileserver{server 192.168.101.65:9000 weight=10;} #后台网关upstream gatewayserver{server 192.168.101.65:63010 weight=10;} #gzip  on;server {listen       80;server_name  www.51xuecheng.cn localhost;#rewrite ^(.*) https://$server_name$1 permanent;#charset koi8-r;ssi on;ssi_silent_errors on;#access_log  logs/host.access.log  main;location / {alias   /etc/nginx/html/;index  index.html index.htm;}#apilocation /api/ {proxy_pass http://gatewayserver/;} #静态资源location /static/img/ {  alias  /etc/nginx/html/img/;} location /static/css/ {  alias   /etc/nginx/html/css/;} location /static/js/ {  alias   /etc/nginx/html/js/;} location /static/plugins/ {  alias   /etc/nginx/html/plugins/;add_header Access-Control-Allow-Origin http://ucenter.51xuecheng.cn;  add_header Access-Control-Allow-Credentials true;  add_header Access-Control-Allow-Methods GET;} location /plugins/ {  alias   /etc/nginx/html/plugins/;} location /course/preview/learning.html {alias /etc/nginx/html/course/learning.html;} location /course/search.html {  root   /etc/nginx/html;} location /course/learning.html {  root   /etc/nginx/html;} location /course/ {  proxy_pass http://fileserver/mediafiles/course/;} #openapilocation /open/content/ {proxy_pass http://gatewayserver/content/open/;} location /open/media/ {proxy_pass http://gatewayserver/media/open/;} #error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}server {listen       80;server_name  file.51xuecheng.cn;#charset koi8-r;ssi on;ssi_silent_errors on;#access_log  logs/host.access.log  main;location /video {proxy_pass   http://fileserver;}location /mediafiles {proxy_pass   http://fileserver;}}server {listen       80;server_name  teacher.51xuecheng.cn;#charset koi8-r;ssi on;ssi_silent_errors on;#access_log  logs/host.access.log  main;location / {alias   /etc/nginx/html/dist/;index  index.html index.htm;}#location / {#    proxy_pass   http://uidevserver;#}location /api/ {proxy_pass http://gatewayserver/;} }server {listen       80;server_name  ucenter.51xuecheng.cn;#charset koi8-r;ssi on;ssi_silent_errors on;#access_log  logs/host.access.log  main;location / {alias   /etc/nginx/html/ucenter/;index  index.html index.htm;}location /include {proxy_pass   http://192.168.101.65;}location /img/ {proxy_pass   http://192.168.101.65/static/img/;}location /api/ {proxy_pass http://gatewayserver/;} }# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_cache    shared:SSL:1m;#    ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

将前端门户的静态页面拷贝到 /data/soft/nginx/xuecheng_portal_static

启动nginx容器:

docker start nginx

修改本机hosts文件:

192.168.101.65   www.51xuecheng.cn 51xuecheng.cn ucenter.51xuecheng.cn teacher.51xuecheng.cn file.51xuecheng.cn

将本机的nginx服务停掉,访问www.51xuecheng.cn。

部署机构端前端

将机构端的前端工程打包,运行yarn build

打包成功在工程目录生成dist目录

将此目录的内容拷贝到虚拟机的/data/soft/nginx/xuecheng_portal_static/dist

配置触发器

当向gogs提交代码时进行自动构建

在gogs配置钩子

推送地址设置jenkins的接口:

http://192.168.101.65:8888/gogs-webhook/?job=jenkins_02

配置好可以测试一下:

测试后观察jenkina是否重新构建任务。

提交代码测试:

修改代码提交到gogs,观察jenkins是否自动构建任务

功能测试

测试认证功能

部署成功后对功能进行测试。

1、首先测试认证功能

进入www.51xuecheng.cn,点击登录,输入账号和密码进行登录。

账号和密码:t1/111111

测试内容管理

1、测试课程列表

出现 Request failed with status code 503 错误

通过nacos排查,进入服务列表

缺少system-api

排查system-api工程的bootstrap.yml配置文件、依赖包等内容。

修改代码后重新提交git

再次进行jenkins构建。

2、测试上传课程图片

首先测试修改课程,上传一个新图片。

3、测试课程发布

首先观察xxl-job调度中心是否成功注册执行器

启动课程发布任务

发布一门课程,观察content-api容器的日志

错误日志:

java.io.FileNotFoundException: file:/root/xuecheng-plus-content-api-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/templates does not exist.

无法找到静态化的模板

屏蔽原来的方式,改如下方式

//            String classpath = this.getClass().getResource("/").getPath(); //打包jar无法获取模板
//            configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates/"));//更改为如下方式configuration.setTemplateLoader(new ClassTemplateLoader(this.getClass().getClassLoader(),"/templates"));

测试媒资管理

1、配置ffmpeg的目录

将linux版本的ffmpeg拷贝到 /data/soft/service 下,在nacos配置ffmpeg 的地址:

Ffmpeg linux版本下载地址:https://johnvansickle.com/ffmpeg/

videoprocess:ffmpegpath: /root/soft/ffmpeg

2、测试上传视频

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

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

相关文章

74HC123的电路应用场景

74HC123的电路应用场景 **1. 引脚功能示例****2. 核心功能****&#xff08;1&#xff09;单稳态触发器****&#xff08;2&#xff09;双独立通道****&#xff08;3&#xff09;灵活触发方式** **3. 工作原理****4. 典型应用场景****&#xff08;1&#xff09;定时与延时控制***…

【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析与防护实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的广泛应用,其安全性问题日益凸显。DeepSeek作为中国领先的开源AI模型,以低成本和高性能著称,但近期暴露的数据库…

《ESP32音频开发实战:I2S协议解析与WAV音频录制/播放全指南》

前言 在智能硬件和物联网应用中&#xff0c;音频处理能力正成为越来越重要的功能——无论是语音交互、环境音采集&#xff0c;还是音乐播放&#xff0c;都离不开高效的音频数据传输与处理。而I2S&#xff08;Inter-IC Sound&#xff09;作为专为音频设计的通信协议&#xff0c…

大数据实时数仓的数据质量监控解决方案

实时数仓不仅仅是传统数据仓库的升级版,它更强调数据的实时性、流动性和高可用性,通过对海量数据的即时处理和分析,为企业提供近乎实时的洞察力。这种能力在金融、零售、制造、互联网等行业中尤为关键,例如,电商平台可以通过实时数仓监控用户行为,动态调整推荐算法;金融…

56认知干货:智能化产业

如果在不久的未来,一座高楼大厦的建设,只需将图纸输入系统,无数台机器人就能精准协作完成任务; 电影节的主角不再是人类,动漫与影视作品将不再需要人类创作; 当播种和收获的工作无人参与,所有过程都能自动化进行; 这将预示着我们将迎来一个智能化社会,在这个社会中,…

使用synchronized关键字同步Java线程

问题 在Java多线程编程中&#xff0c;你需要保护某些数据&#xff0c;防止多个线程同时访问导致数据不一致或程序错误。 解决方案 在需要保护的方法或代码段上使用synchronized关键字。 讨论 synchronized关键字是Java提供的同步机制&#xff0c;用于确保在同一时刻只有一…

MATLAB基于格拉姆角场与2DCNN-BiGRU的轴承故障诊断模型

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 目录 0 引言 1 格拉姆角场原理 2 2DCNN-BiGRU网络结构 3 应用实例 3.1 数据准备 3.2 格拉姆角场数据提取 3.3 网络模型搭建-重中之重 3.4 …

电气设备器件选型参数---断路器

断路器 一、基本电气参数 额定电压&#xff08;Ue&#xff09; 必须≥系统最高工作电压&#xff08;如380V、660V等&#xff09;。 注意直流/交流系统的区别&#xff0c;直流断路器需专门设计。 额定电流&#xff08;In&#xff09; 根据负载的持续工作电流选择&#xff0c;…

Linux常用命令30——groupadd创建新的用户组

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;groupadd命令的功能是创建新的用户组。每个用户在创建时都有一个与其同名的基本组&#xff0c;后期可以使用groupadd命令创建出新的用户组信息&#xff0c;让多个用户加入指定的扩展…

微信小程序 自定义组件 标签管理

环境 小程序环境&#xff1a; 微信开发者工具&#xff1a;RC 1.06.2503281 win32-x64 基础运行库&#xff1a;3.8.1 概述 基础功能 标签增删改查&#xff1a;支持添加/删除单个标签、批量删除、重置默认标签 数据展示&#xff1a;通过对话框展示结构化数据并支持复制 动…

wpf CommandParameter 传递MouseWheelEventArgs参数 ,用 MvvmLight 实现

在 WPF 中使用 MVVM Light 框架传递 MouseWheelEventArgs 参数至 CommandParameter,可通过以下步骤实现: ‌1. XAML 中配置事件绑定‌ 在控件上通过 EventToCommand 绑定鼠标滚轮事件,并启用 PassEventArgsToCommand 属性以传递事件参数: <!-- 命名空间声明 --> x…

vmware diffy配置ollama 本机ip无法访问

防火墙直接关闭 本地测试&#xff0c;给它直接关了 ollama配置 vim /etc/systemd/system/ollama.service这是的配置 [Unit] DescriptionOllama Service Afternetwork-online.target[Service] Environment"OLLAMA_HOST0.0.0.0:11434" #Environment"OLLAMA_OR…

React--》掌握react构建拖拽交互的技巧

在这篇文章中将深入探讨如何使用react-dnd&#xff0c;从基础的拖拽操作到更复杂的自定义功能带你一步步走向实现流畅、可控且用户友好的拖拽体验,无论你是刚接触拖拽功能的初学者还是想要精细化拖拽交互的经验开发者&#xff0c;都能从中找到适合自己的灵感和解决方案。 目录 …

数据结构与算法:回溯

回溯 先给出一些leetcode算法题&#xff0c;以后遇见了相关题目再往上增加 主要参考代码随想录 2.1、组合问题 关于去重&#xff1a;两种写法的性能分析 需要注意的是&#xff1a;使用set去重的版本相对于used数组的版本效率都要低很多&#xff0c;大家在leetcode上提交&#x…

iview 分页改变每页条数时请求两次问题

问题 在iview page分页的时候&#xff0c;修改每页条数时&#xff0c;会发出两次请求。 iview 版本是4.0.0 原因 iview 的分页在调用on-page-size-change之前会调用on-Change。默认会先调用on-Change回到第一页&#xff0c;再调用on-page-size-change改变分页显示数量 此时就会…

一周学会Pandas2 Python数据处理与分析-Pandas2复杂数据查询操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们学了.loc[]等几个简单的数据筛选操作&#xff0c;但实际业务需求往 往需要按照一定的条件甚至复杂的组合条件…

【Vue bug】:deep()失效

vue 组件中使用了 element-plus 组件 <template><el-dialog:model-value"visible":title"title":width"width px":before-close"onClose"><div class"container" :style"{height:height px}"&g…

Trae 安装第三方插件支持本地部署的大语言模型

Trae 安装第三方插件支持本地部署的大语言模型 0. 引言1. 安装插件 0. 引言 字节发布的 Trae IDE 一直不支持本地部署的的大语言模型。 Qwen3 刚刚发布&#xff0c;想在 Trae 中使用本地部署的 Qwen3&#xff0c;我们可以在 Trae 中安装其他插件。 1. 安装插件 我们可以安装…

JavaScript 中的 Proxy 与 Reflect 教程

目录 get 和 set 捕获器详解 为什么要用 Reflect? 使用语法间接调用内部方法 使用 Reflect 直接调用内部方法 对比总结: Reflect API 及其与 Proxy 的配合 Proxy 的典型应用场景 Proxy 是 ES6 引入的一种元编程特性。它允许创建一个代理对象来包装目标对象,并拦截对目标…

基于STM32的心电图监测系统设计

摘要 本论文旨在设计一种基于 STM32 微控制器的心电图监测系统&#xff0c;通过对人体心电信号的采集、处理和分析&#xff0c;实现对心电图的实时监测与显示。系统采用高精度的心电信号采集模块&#xff0c;结合 STM32 强大的数据处理能力&#xff0c;能够有效去除噪声干扰&a…