[學成在線]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.pswp.cn/pingmian/79446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79446.shtml
英文地址,請注明出處:http://en.pswp.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…