摘要:就是在提測前部署一個預(yù)覽環(huán)境,在提測前,每個人本地驗(yàn)證一遍,再放在預(yù)覽環(huán)境驗(yàn)證一遍。于是就準(zhǔn)備啪啪啪擼一個完成自動發(fā)布預(yù)覽環(huán)境的工具。用來直接把已經(jīng)好的文件發(fā)布到預(yù)覽環(huán)境。這樣以后組里的其他同事也都可以用一行命令自己部署預(yù)覽環(huán)境了。
場景
進(jìn)入公司一段時間了。流程還是不太讓人省心。就在上個提測版本的質(zhì)量還是沒法保證,總是或多或少出現(xiàn)一些問題。于是就想到了上家公司的一個做法。就是在提測前部署一個預(yù)覽環(huán)境,在提測前,每個人本地驗(yàn)證一遍,再放在預(yù)覽環(huán)境驗(yàn)證一遍。
實(shí)施有了想法,就得去付諸行動。先是用公司的一個測試服務(wù)器多帶帶起了一個服務(wù),用nginx來做反向代理。然后把前端代碼部署上去。
整個部署流程是:用 xshell 連上服務(wù)器,然后用 xftp 鏈接服務(wù)器,然后本地 build 項(xiàng)目,接著把 build 好的文件通過 xftp 上傳到服務(wù)器上。整個流程感覺稍有繁瑣。而且,對于不熟悉 shell 工具的同學(xué)不友好啊。重復(fù)的工作啊有沒有。
既然前端是萬能的,那么這種重復(fù)的操作在我們前端工作流中是不被允許的。剛好項(xiàng)目進(jìn)度不是那么忙。于是就準(zhǔn)備啪啪啪擼一個 build 完成自動發(fā)布預(yù)覽環(huán)境的工具。
要完成這個工具,我們來梳理一下需要實(shí)現(xiàn)的功能:
本地文件壓縮功能
鏈接遠(yuǎn)程服務(wù)器
壓縮包上傳遠(yuǎn)程服務(wù)器
遠(yuǎn)程服務(wù)器解壓縮
本地 build 完畢的一個回調(diào)
可能你會說,你傻啊,不會直接上傳,還要壓縮解壓縮。這里用壓縮包傳輸一方面是方便做備份。我考慮的是上傳在一個backup的文件夾里,然后用的時候再從這個文件夾取出來,然后解壓到置頂目錄。提測的時候也可以直接讓測試來這個目錄去壓縮包。
另一方面是不想寫遞歸啊。如果要上傳的目錄結(jié)構(gòu)不確定少不了遞歸啊,遞歸啊,遞歸啊。我怕我頭大。
于是創(chuàng)建一個 ftp.js 的文件,來實(shí)現(xiàn)上傳本地 build 完的 dist 目錄下的文件到服務(wù)器。
這里主要使用了 archiver 這個模塊來實(shí)現(xiàn)壓縮功能。
用 archiver 壓縮本地文件:
let output = fs.createWriteStream(__dirname + "/../dist/" + fileName); let archive = archiver("zip"); output.on("end", function () { console.log("Data has been drained"); }); output.on("error", function (err) { console.log("壓縮失敗"); throw err; }); output.on("close", function () { console.log("壓縮成功"); }); archive.pipe(output); archive.file(__dirname + "/../dist/index.html", {name: "index.html"}); archive.directory(__dirname + "/../dist/static/", "static"); archive.finalize();
fileName 是一個加戳的變量:
let fileName = "dist" + new Date().getTime() + ".zip";
說道這里,其實(shí)還可以把 git 的分支或者 tag 信息放在這個戳里邊。用相關(guān)的 nodejs 模塊來獲取一下 git 倉庫信息就好啦。有空我要來優(yōu)化一波。
鏈接遠(yuǎn)程服務(wù)器和上傳文件。主要使用了 ssh2 這個模塊來實(shí)現(xiàn)和遠(yuǎn)程服務(wù)器的交互。
鏈接遠(yuǎn)程服務(wù)器:
conn.on("ready", function () { console.log("連接上了!") }).on("end", function () { console.log("完成") }).connect({ host: "ip", port: 端口號, username: "用戶名", password: "密碼" });
上傳文件:
conn.sftp(function (err, sftp) { if (err) throw err; // 上傳文件測試 sftp.fastPut(__dirname + "/../dist/" + fileName, "/usr/share/nginx/htmlBackup/" + fileName, {}, (err, result) => { if (err) { console.log(err); } if (result) console.log(result); }); });刪除上個版本解壓縮部署新版本
本來,使用 ssh2 的 shell 命令來實(shí)現(xiàn)這兩個功能應(yīng)該是很簡單的??墒?,沒逼格啊。麻煩啊。于是我就想到 shell 腳本。說實(shí)話,在此之前,我也不知道 shell 腳本咋玩滴。但是我可以學(xué)嘛。于是,學(xué)習(xí)一波后就有了如下 html.sh 文件:
#!/bin/bash # arg1:dir name # arg2:zip name # delete old file deleteFile=$1 sudo chmod -R 777 /usr/share/nginx/$deleteFile sudo rm -rf /usr/share/nginx/$deleteFile/* # unzip file unzipFile=$2 sudo unzip -o /usr/share/nginx/htmlBackup/$unzipFile -d /usr/share/nginx/$deleteFile # exit
其實(shí) shell 腳本也不算復(fù)雜,大概一上午吧,寫了這么幾行。服務(wù)器權(quán)限設(shè)置有點(diǎn)嚴(yán)格,所以先用 chmod 給老文件設(shè)置權(quán)限,我懶于是就用 777 。然后,rm 刪除老文件,然后解壓縮 zip 包。其中 $1 和 $2 是調(diào)用這個 shell 傳入的參數(shù)。
好了,說了這么多,shell 怎么用。當(dāng)然還是要回到 ssh2 上。代碼如下:
// 調(diào)用遠(yuǎn)程構(gòu)建shell conn.exec("/usr/share/nginx/html.sh html " + fileName, function(err, stream) { if (err) throw err; stream.on("close", function(code, signal) { console.log("Stream :: close :: code: " + code + ", signal: " + signal); conn.end(); }).on("data", function(data) { let dataStr = ("" + data).trim(); // 列出已經(jīng)上傳過的 zip 包 if (dataStr.length > 5) { console.log("STDOUT: " + ("" + data).trim()); } }).stderr.on("data", function(data) { console.log("STDERR: " + ("" + data).trim()); }); stream.on("end", function() { console.log("預(yù)覽環(huán)境構(gòu)建完成"); }); });
新增功能基本上大功告成了。
build 回調(diào)首先找到 vue-cli build 完成后的位置,也就是 build/build.js 配置中大概40行的位置。然后把上邊我們寫的功能導(dǎo)出模塊,然后再 build.js 中引入 ftp.js。
let ftp = require("./ftp")
注意,這里我并不想破壞原有的命令的功能,于是就通過判斷執(zhí)行命令時的參數(shù)來控制功能的啟用與否。process.argv 這個變量存放的就是調(diào)用命令的參數(shù)。具體是什么用的,console.log 一下就都知道啦。
于是就有了下圖:
那么命令輸入長了,敲字手疼啊。于是就修改 package.json 的 scripts。
添加如下兩行:
"bap": "node build/build.js buildWithPublish", "p": "node build/ftp.js publish"
這樣,我們使用的時候就可以直接 npm run bap 來 build 和 發(fā)布預(yù)覽環(huán)境。用 npm run p 來直接把已經(jīng) build 好的文件發(fā)布到預(yù)覽環(huán)境。
好吧,作為一個能用即可的懶人,代碼寫的有點(diǎn)亂,整個功能的代碼就不貼啦。基本上核心功能的代碼就是上述說的那些。
避免重復(fù)就是節(jié)約時間啊。用了大概一天時間來實(shí)現(xiàn)這個功能我覺得很值。這樣以后組里的其他同事也都可以用一行命令自己部署預(yù)覽環(huán)境了。不用打開 xshell 打開 xftp。
基于上述功能,還做了一個提測小工具:https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90756.html
摘要:一前言提綱基于和框架寫的一個全棧購物商城,記錄項(xiàng)目過程中遇到的一些問題以及經(jīng)驗(yàn)和技巧。服務(wù)端技術(shù)棧登錄授權(quán)用認(rèn)證機(jī)制,來實(shí)現(xiàn)登錄登出。服務(wù)器配置和緩存策略,根據(jù)不同的來代理。申請證書全站升級到,配置的協(xié)議。一、前言提綱 基于Vue和Express框架寫的一個全棧購物商城,記錄項(xiàng)目過程中遇到的一些問題以及經(jīng)驗(yàn)和技巧。 二、歷史版本 基于Vue-CLI2.0:點(diǎn)我查看 這個分支版本是一兩年前...
摘要:一前言提綱基于和框架寫的一個全棧購物商城,記錄項(xiàng)目過程中遇到的一些問題以及經(jīng)驗(yàn)和技巧。服務(wù)端技術(shù)棧登錄授權(quán)用認(rèn)證機(jī)制,來實(shí)現(xiàn)登錄登出。服務(wù)器配置和緩存策略,根據(jù)不同的來代理。申請證書全站升級到,配置的協(xié)議。 一、前言提綱 基于Vue和Express框架寫的一個全棧購物商城,記錄項(xiàng)目過程中遇到的一些問題以及經(jīng)驗(yàn)和技巧。 二、歷史版本 基于Vue-CLI2.0:點(diǎn)我查看這個分支版本是一兩...
摘要:放置在目錄下或通過絕對路徑被引用。對于相關(guān)來說,我們推薦使用而不是直接鏈?zhǔn)街付?。在不更改配置文件的情況下,前端頁面迭代發(fā)布,不需要重啟服務(wù)。 作者:gauseen 0. 關(guān)于 Vuejs 簡介:Vue (讀音 /vju?/,類似于 view) 是一套用于構(gòu)建用戶界面的漸進(jìn)式框架,易用、靈活、高效。 生態(tài)系統(tǒng) 項(xiàng)目 介紹 awesome-vue Vue.js 相關(guān)很棒的...
摘要:場景目前公司的測試環(huán)境還是由開發(fā)來搭建和部署的。沒網(wǎng),我就做個離線版的工具唄。調(diào)研選型技術(shù)目前我了解到使用前端技術(shù)做桌面應(yīng)用有和以及著三種神器。好了,多說無用,來預(yù)覽一下我們的小工具吧默認(rèn),就是最新的要提測的包。更新于年月日已入手。 場景 目前公司的測試環(huán)境還是由開發(fā)來搭建和部署的。這種做法是極其不科學(xué)的。所以那種部署啊什么的重復(fù)性的操作還是做個工具讓測試自己去部署好了。先來預(yù)覽一下工...
摘要:本教程講解的是腳手架搭建的項(xiàng)目利用自動化部署到靜態(tài)文件服務(wù)器一安裝是一個基于增強(qiáng)實(shí)現(xiàn),純粹使用編寫。 前言 平時部署前端項(xiàng)目流程是:先部署到測試環(huán)境ok后再發(fā)布到生產(chǎn)環(huán)境上,部署到測試環(huán)境用 xshell 連上服務(wù)器,然后用 xftp 連接服務(wù)器,然后本地 build 項(xiàng)目,接著把 build 好的文件通過 xftp 上傳到服務(wù)器上,整個流程感覺稍有繁瑣,重復(fù)。 本教程講解的是 Vue...
閱讀 3863·2021-10-12 10:11
閱讀 3665·2021-09-13 10:27
閱讀 2575·2019-08-30 15:53
閱讀 2007·2019-08-29 18:33
閱讀 2219·2019-08-29 14:03
閱讀 1019·2019-08-29 13:27
閱讀 3346·2019-08-28 18:07
閱讀 814·2019-08-26 13:23