Jenkins 自動打包項目鏡像部署到服務器 ---(前端項目)

Jenkins 新增前端項目Job

指定運行的節點

選擇部署運行的節點標簽,dev標簽對應開發環境
在這里插入圖片描述
在這里插入圖片描述
節點的遠程命令執行配置
jenkins完整流程

配置源碼 拉取

在這里插入圖片描述

Credentials添加

觸發遠程構建

配置后可以支持遠程觸發jenkins構建(比如自建的CICD自動化發布平臺),不需要遠程構建的可以不配置
在這里插入圖片描述
token生成配置

Build Steps

采用shell腳本模式

# jenkins服務Job運行的工作空間項目存放地址
codeRootDir="/data/jenkins/workspace/Dev.xx.Web"
# 項目部署遠程服務器地址
remoteHost="10.30.222.11"
# 遠程部署服務器存放鏡像地址
remoteRootDir="/data/websites/images"
# 生成的項目鏡像名稱
dockerImageName="img.xx.web.dev"
# 運行的容器名稱
containerName="xx.web.dev"# 確保工作空間擁有該目錄
mkdir -p ${codeRootDir}
# 切換到工作目錄
cd ${codeRootDir}echo build start
#指定鏡像地址
npm config set registry https://registry.npmmirror.com/
#安裝Vue項目依賴
npm install @vue/cli-plugin-eslint@latest --legacy-peer-deps
# 打包(根據Vue項目中的配置來)
npm run build
echo build endecho "Building Docker image..."
# 開始構建鏡像(注意dockerfile 要在codeRootDir目錄下)
docker build -t "${dockerImageName}:latest" "${codeRootDir}"
echo "Docker image built successfully."#壓縮保存鏡像到codeRootDir目錄下
echo "Saving Docker image to file..."
docker save "${dockerImageName}:latest" | gzip > "${codeRootDir}/${dockerImageName}.tar.gz"
echo "Docker image saved successfully."# 遠程傳輸到目標服務器
echo "Uploading Docker image to server..."
# 確保遠程服務有此目錄
ssh root@"${remoteHost}" "mkdir -p ${remoteRootDir}"
# 傳輸鏡像到遠程目錄
scp -C "${codeRootDir}/${dockerImageName}.tar.gz" root@"${remoteHost}":"${remoteRootDir}/"
echo "Upload completed."# 遠程執行命令
echo "Deploying on remote server..."
ssh root@"${remoteHost}" "
cd ${remoteRootDir} &&
# 解壓鏡像,并加載鏡像到本地
gunzip -c ${dockerImageName}.tar.gz | docker load &&
# 查詢當前是否有該鏡像服務運行,有則刪除該鏡像后從新運行鏡像
docker ps -q --filter 'name=${containerName}' | grep -q . && docker rm -f ${containerName} || true &&
docker run -d --name ${containerName} --privileged=true --restart=always -p 8090:80 ${dockerImageName}:latest
"
echo "Deployment completed."

Vue項目代碼對應改造

在這里插入圖片描述
在項目package.json同級目錄下創建 Dockerfile、nginx.conf、nginx.default.config 文件

package.json

定義的install 、 bulid 、run命令

"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","build:report": "vue-cli-service build --report","globle": "npm install -g cnpm --registry=https://registry.npm.taobao.org&&cnpm i rimraf npm-check-updates nrm -g&&rimraf node_modules&&cnpm i","lint": "eslint --fix --ext .js,.vue src","lint:style": "stylelint-config-prettier-check","inspect": "vue-cli-service inspect","template": "plop","clear": "rimraf node_modules&&npm install --registry=https://registry.npm.taobao.org","use:npm": "nrm use npm","use:taobao": "nrm use taobao","update": "ncu -u --reject sass-loader,sass,screenfull,eslint&&cnpm i","update:globle": "ncu -g --concurrency 10 --timeout 80000","push": "start ./push.sh","deploy": "start ./deploy.sh"},

Dockerfile

FROM nginxMAINTAINER vue-admin-beautiful
LABEL description=本項目基于vue-admin-beautiful開源版構建
LABEL qq=783963206# 環境變量
ENV TZ=Asia/Shanghai \RUN_USER=nginx \RUN_GROUP=nginx \DATA_DIR=/data/web \LOG_DIR=/data/log/nginx# 工作目錄
WORKDIR ${DATA_DIR}# 日志輸出
RUN ["echo","vue-admin-beautiful - UI building..."]# 切換為上海時區
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \&& echo $TZ > /etc/timezone# 創建日志文件夾
RUN mkdir ${LOG_DIR} -p
RUN chown nginx.nginx -R ${LOG_DIR}# 拷貝dist包文件
COPY ./dist ./# 拷貝nginx配置文件
ADD nginx.conf /etc/nginx/nginx.conf
ADD nginx.default.conf /etc/nginx/conf.d/default.confEXPOSE 80
ENTRYPOINT nginx -g "daemon off;"

nginx.conf

user  nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;events {use epoll;worker_connections 51200;multi_accept on;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server_names_hash_bucket_size 512;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 50m;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  /var/log/nginx/access.log  main;sendfile        on;tcp_nopush     on;tcp_nodelay on;keepalive_timeout  65;# gzip 壓縮gzip on;gzip_min_length  1k;gzip_buffers     4 16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;gzip_vary on;gzip_proxied   expired no-cache no-store private auth;gzip_disable   "MSIE [1-6]\.";limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn_zone $server_name zone=perserver:10m;include /etc/nginx/conf.d/*.conf;
}

nginx.default.conf

server {listen       80;server_name  localhost;access_log  /data/log/nginx/access.log  main;error_log   /data/log/nginx/error.log;# 靜態資源location / {root   /data/web;index  index.html index.htm;try_files $uri $uri/ /index.html;}# 前端代理(注意這里需要填寫 真實后端ip)location /api/ {//注意 http:ip:8090/ 和http:ip:8090的區別// http:ip:8090/會去掉/api這一層 // http:ip:8090 不會去掉/api這一層proxy_pass http://~~真實后端ip:8090~~ ;add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials: true;add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE;proxy_http_version 1.1;# 連接延時proxy_connect_timeout 3600s;proxy_read_timeout 3600s;proxy_send_timeout 3600s;# IP 穿透proxy_set_header        Host $proxy_host;proxy_set_header        X-Real-IP $remote_addr;proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;# WebSocket 穿透proxy_set_header Origin "";proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}

網絡請求路徑

部署前端項目地址
remoteHost=“10.30.222.11”
在這里插入圖片描述

// 服務的地址+8090 根據nginx配置對應轉發到真實的ip中

vue項目默認請求前綴
http://10.30.222.11:8090/api
在這里插入圖片描述

構建部署

在這里插入圖片描述

部署成功日志

在這里插入圖片描述

訪問路徑

10.30.222.11:8090
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72213.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7.2 - 定時器之計算脈沖寬度實驗

文章目錄 1 實驗任務2 系統框圖3 軟件設計 1 實驗任務 本實驗任務是通過CPU私有定時器來計算按鍵按下的時間長短。 2 系統框圖 參見7.1。 3 軟件設計 注意事項: 定時器是遞減計數的,需要考慮StartCount<EndCount的情況。 /***********…

雙機熱備旁掛組網實驗

1拓撲圖 2.要求 1 、 SW3 的流量 正常情況下: SW1_VRF-->FW1--->SW1_Public--->R5 故障情況下: SW2_VRF-->FW2--->SW2_Public--->R6 2 、 SW4 的流量 正常情況下: SW2_VRF-->FW2--->SW2_Public--->R6 故障情…

2025春新生培訓數據結構(樹,圖)

教學目標: 1,清楚什么是樹和圖,了解基本概念,并且理解其應用場景 2,掌握一種建圖(樹)方法 3,掌握圖的dfs和樹的前中后序遍歷 例題與習題 2025NENU新生培訓(樹&#…

HTML 日常開發常用標簽

文章目錄 HTML 日常開發常用標簽1、基本結構標簽2、內容標簽3、多媒體標簽4、表單標簽5、列表和定義標簽6、表格標簽7、鏈接和圖像8、元數據9、語義化標簽(HTML5新增)10、框架和內聯11、交互12、過時或不推薦使用的標簽 HTML 日常開發常用標簽 1、基本結…

7.1.1 計算機網絡的組成

文章目錄 物理組成功能組成工作方式完整導圖 物理組成 計算機網絡是將分布在不同地域的計算機組織成系統,便于相互之間資源共享、傳遞信息。 計算機網絡的物理組成包括硬件和軟件。硬件中包含主機、前端處理器、連接設備、通信線路。軟件中包含協議和應用軟件。 功…

【AI論文】MedVLM-R1:通過強化學習激勵視覺語言模型(VLMs)的醫療推理能力

摘要:推理是推進醫學影像分析的關鍵前沿領域,其中透明度和可信度對于贏得臨床醫生信任和獲得監管批準起著核心作用。盡管醫學視覺語言模型(VLMs)在放射學任務中展現出巨大潛力,但大多數現有VLM僅給出最終答案&#xff…

國產RISCV64 也能跑AI

Banana Pi BPI-F3 進控時空 K1開發板 AI人工智能AI 部署工具使用手冊_bianbu software-CSDN博客 文章置頂了 有興趣的可以一起留言探索,非常有意思: 我最近接觸到了進迭時空研發的 Spacengine?,這是一套能在進迭時空 RISC-V 系列芯片上部署…

APISIX Dashboard上的配置操作

文章目錄 登錄配置路由配置消費者創建后端服務項目配置上游再創建一個路由測試 登錄 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根據docker 容器里的指定端口: 配置路由 通過apisix 的API管理接口來創建(此路由,直接…

【WPF】綁定報錯:雙向綁定需要 Path 或 XPath

背景 最開始使用的是 TextBlock: <ItemsControl ItemsSource"{Binding CameraList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation"Horizontal"/></ItemsPanelTemplate></ItemsControl.Item…

Kotlin協變與逆變區別

在Kotlin中&#xff0c;協變和逆變是泛型編程中的兩個重要概念&#xff0c;它們允許我們在類型系統中更加靈活地處理類型關系。 1.協變&#xff1a;協變允許我們使用比原始類型更具體的類型。在kotlin中&#xff0c;通過在類型參數上加out關鍵字來表示協變,生產者&#xff0c;例…

如何調試Linux內核?

通過創建一個最小的根文件系統&#xff0c;并使用QEMU和GDB進行調試。 1.準備工作環境 確保系統上安裝了所有必要的工具和依賴項。 sudo apt-get update //更新一下軟件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…

Java 調試模式下 Redisson 看門狗失效

一、場景分析 前幾天在做分布式鎖測試&#xff1a; 在調試模式下&#xff0c;lock.lock() 之后打上斷點&#xff0c;想測試一下在當前線程放棄鎖之前&#xff0c;別的線程能否獲取得到鎖。 發現調試模式下&#xff0c;看門狗機制失效了&#xff0c;Redis 上 30 秒后&#xff0…

GPT-4.5震撼登場,AI世界再掀波瀾!(3)

GPT-4.5震撼登場&#xff0c;AI世界再掀波瀾! GPT-4.5震撼登場&#xff0c;AI世界再掀波瀾!(2) &#xff08;一&#xff09;倫理困境&#xff1a;如何抉擇 GPT-4.5 的強大功能在為我們帶來諸多便利的同時&#xff0c;也引發了一系列深刻的倫理問題&#xff0c;這些問題猶如高…

【數據挖掘】Pandas

Pandas 是 Python 進行 數據挖掘 和 數據分析 的核心庫之一&#xff0c;提供了強大的 數據清洗、預處理、轉換、分析 和 可視化 功能。它通常與 NumPy、Matplotlib、Seaborn、Scikit-Learn 等庫結合使用&#xff0c;幫助構建高效的數據挖掘流程。 &#x1f4cc; 1. 讀取數據 P…

七、JOIN 語法詳解與實戰示例

一、JOIN 的作用與分類 JOIN 操作用于合并兩個或多個表的行&#xff0c;基于表之間的關聯字段。以下是常見的 JOIN 類型&#xff1a; JOIN 類型描述INNER JOIN返回兩個表匹配的記錄LEFT JOIN返回左表所有記錄 右表匹配記錄&#xff08;右表無匹配則為NULL&#xff09;RIGHT …

2019年01月全國POI數據分享(同源歷史POI分享系列)

2019年01月全國范圍POI數據 2019年01月份全國范圍歷史POI數據&#xff0c;全國范圍所有類別共59336781個POI 2019年01月全國范圍POI數據按大類統計 大類代碼大類名稱2019年01月該類POI數量010000汽車服務1151164020000汽車銷售213647030000汽車維修517367040000摩托車服務1800…

Spring Boot + MyBatis 實現 RESTful API 的完整流程

后端開發&#xff1a;Spring Boot 快速開發實戰 引言 在現代后端開發中&#xff0c;Spring Boot 因其輕量級、快速開發的特性而備受開發者青睞。本文將帶你從零開始&#xff0c;使用 Spring Boot MyBatis 實現一個完整的 RESTful API&#xff0c;并深入探討如何優雅地處理異…

使用Python開發以太坊智能合約:輕松入門與深度探索

使用Python開發以太坊智能合約&#xff1a;輕松入門與深度探索 隨著區塊鏈技術的快速發展&#xff0c;以太坊作為最為成熟和廣泛使用的智能合約平臺&#xff0c;成為了開發去中心化應用&#xff08;DApp&#xff09;的核心工具。智能合約不僅是區塊鏈技術的基礎&#xff0c;更…

ES scroll=1m:表示快照的有效時間為1分鐘。怎么理解

在Elasticsearch中&#xff0c;scroll1m 表示你創建的 scroll 上下文 的有效時間為 1分鐘。這個參數控制了你可以在多長時間內繼續使用這個 scroll_id 來獲取更多的數據。 什么是 Scroll 上下文&#xff1f; 當你使用 scroll API 時&#xff0c;Elasticsearch 會為你的查詢創…

Linux與UDP應用1:翻譯軟件

UDP應用1&#xff1a;翻譯軟件 本篇介紹 本篇基于UDP編程接口基本使用中封裝的服務器和客戶端進行改寫&#xff0c;基本功能如下&#xff1a; 從配置文件dict.txt讀取到所有的單詞和意思客戶端向服務端發送英文服務端向客戶端發送英文對應的中文意思 配置文件內容 下面的內…