本系列文章共分為基礎篇,安全篇,擴充篇。
前言
曾幾何時,我相信部分Web Developer(包括我)使用的專案釋出方式比較傳統(使用xftp或者sublime text的外掛sftp等),釋出方式簡單又粗暴,想釋出哪個目錄就直接上傳覆蓋...
但是這種方式對於現在的前端專案有些弊端:
若專案包含webpack\gulp等構建工具,則每次釋出都需要等待構建完成後再手動上傳,效率低;
若專案為前端的服務端渲染專案,例如vue的服務端渲染,那麼專案上傳伺服器後還得登入伺服器重啟程式;
釋出時由於選錯檔案或者選錯釋出環境導致的上傳(>﹏<)悲劇,可沒有後悔藥吃。
我知道你想告訴我還可以使用git webhook等自動化工具,的確這是一種比較高階的用法,也非常可靠,但是搭建過程對於新手還是比較麻煩的,而且前端還是不太同於服務端,前端專案大多需要構建,那麼構建過程究竟放在服務端還是本地,這是一個問題。
我理想中的釋出器應該是易於搭建,通過配置檔案就能選擇釋出到不同的環境,敲完一行釋出命令就可以去泡杯茶,讓它自己完成整個釋出流程。
於是,fjpublish就誕生了。它是一個不同於git webhook的釋出思路,基於nodejs的能力自動化整個釋出流程,順便把git提交一下...
安裝
如果你已經安裝了nodejs (6.0+),那麼只需要一個命令就能完成fjpublish的安裝
npm install fjpublish -g複製程式碼
全域性安裝就可以在任意路徑下使用fjpublish這個命令了。
注意: fjpublish依賴一份配置檔案,預設是fjpublish.config.js,如果不想在版本庫中提交伺服器安全資訊,請千萬記得把它加入忽略檔案中,如.gitignore配置檔案結構
fjpublish命令列預設會讀取當前工作目錄下的fjpublish.config.js檔案,該檔案返回一個物件,舉例結構如下:
module.exports = {
//modules開始
modules: [{
name: '測試環境', //標識要釋出的環境描述
env: 'test', //釋出環境的唯一標識
ssh: {
host: '12.23.345.678', //遠端伺服器ip
username: 'root', //登入伺服器的使用者名稱
//rc版本的user選項和userName選項請在未來統一配置為username
password: '12345678', //登入伺服器的密碼
},
buildCommand: 'build', //要進行構建的命令build => npm run build
localPath: 'example', //專案中要釋出的目錄
remotePath: '/www/example', //專案中要釋出到遠端伺服器的目錄
tag: '123' //標註釋出的版本,可不設定
}, { ... }],
//modules結束
nobuild: true, //modules外的欄位可用於每一個module繼承,這裡僅用於舉例
tag: 'v1', //modules外的欄位可用於每一個module繼承,這裡僅用於舉例
}複製程式碼
以上展示了一個簡單的配置,關於使用fjpublish和閱讀本文件,還需明白以下幾個概念:
modules陣列中每一個物件(也稱module)代表一個釋出環境,在本文件中module指在配置檔案中任意一個環境配置module
在本文件中config指代module.exports輸出的所有欄位(包含modules在內)的物件。
config中modules欄位外的欄位在初始後將併入每一個module,優先順序為module > config,也可以理解為module繼承自config。
config中modules欄位外的欄位不僅僅為了繼承給module例項也可以是為了定義某些全域性的配置欄位。
例子
讓我們閒話少說,先上幾個例子來了解fjpublish能做什麼。
1. 簡單例子
釋出一個專案檔案到遠端環境,並備份舊檔案。
任務描述
- 以提示器的方式選擇釋出到測試環境
配置檔案
// 專案根目錄下fjpublish.config.js
module.exports = {
modules: [{
name: '測試環境',
env: 'test',
ssh: {
host: '192.168.0.xxx',
username: 'root',
//rc版本的user選項和userName選項請在未來統一配置為username
password: 'xxxxxx',
},
buildCommand: 'webpack',
localPath: 'example',
remotePath: '/www/manman/test',
},{
name: '預釋出環境',
env: 'pre_release',
//剩餘配置參考‘測試環境’
},{
name: '正式環境',
env: 'pre_release',
//剩餘配置參考‘測試環境’
}]
}複製程式碼
// 專案根目錄下package.json
// 用於使用構建命令npm run webpack來呼叫webpack
...
"scripts": {
"webpack": "webpack --config example/webpack/build/build.js"
},
...複製程式碼
釋出命令
fjpublish env -s複製程式碼
動態圖
更多內容
可以使用命令
fjpublish env <env> --diff
開啟差異化釋出,每次釋出只上傳有改動的檔案,極大的縮短上傳時間。對於不需要構建的專案,不需要準備package.json,並在配置檔案中設定
nobuild
選項;nobuild: true複製程式碼
對於某次釋出臨時不需要構建的,請在命令中使用
--nobuild
選項fjpublish env <env> --nobuild複製程式碼
2. 多目錄釋出
有些時候我們的專案需要釋出的資料夾不止一個,或者需要忽略某些檔案,那麼就需要調整發布方式。
任務描述
使用module的
localPathEntries
來發布多個目錄;使用module的
localPathIgnore
忽略所有txt結尾的檔案。
專案檔案結構
配置檔案
// 專案根目錄下fjpublish.config.js
module.exports = {
modules: [{
name: '測試環境',
env: 'test',
ssh: {
host: '192.168.0.xxx',
username: 'root',
//rc版本的user選項和userName選項請在未來統一配置為username
password: 'xxxxx',
},
buildCommand: 'webpack',
localPathEntries: ['example', 'lib'],
localPathIgnore: '**/*.txt',
remotePath: '/www/manman/multiple',
}],
}複製程式碼
釋出命令
fjpublish env test複製程式碼
動態圖
更多
如果把配置改一下,那麼釋出的專案結構將完全不同,那麼聰明的你猜猜修改上文配置的
localPath
和localPathEntries
會發生什麼吧;... localPath: 'example/webpack', //當localPathEntries存在時localPath可不填,不填意味著專案根目錄 localPathEntries: ['build', 'dist'], ...複製程式碼
若專案為多目錄釋出,則遠端目錄的備份規則也將變為以這些子目錄為備份源。
3. 遠端後置命令
對於需要重啟服務的專案,fjpublish也是支援的。
任務描述
使用module的配置項
postCommands
在專案釋出後重啟pm2程式;忽略當次構建過程並提交一次git;
使用module的配置項
ssh2shell
設定每個遠端命令超時時間為20秒。
配置檔案
// 專案根目錄下fjpublish.config.js
module.exports = {
modules: [{
name: '測試環境',
env: 'test',
ssh: {
host: '192.168.0.xxx',
username: 'root',
//rc版本的user選項和userName選項請在未來統一配置為username
password: 'xxxxxx',
},
ssh2shell: {
idleTimeOut: 20000
},
postCommands: ['pm2 reload xxx'],
buildCommand: 'build',
localPath: 'example',
remotePath: '/www/manman/test',
}]
}複製程式碼
釋出命令
fjpublish env test --nobuild --commit '遠端後置命令'複製程式碼
動態圖
4.快速還原
有備份專案的功能那當然得有還原的辦法啦。
任務描述
- 還原版本預釋出環境至
tag
標記為‘自定義tag的版本’的版本;
配置檔案
// 專案根目錄下fjpublish.config.js
module.exports = {
modules: [{
name: '預釋出環境',
env: 'pre_release',
ssh: {
//略
},
localPath: 'example',
remotePath: '/www/zhangchao/pre_release',
}],
}複製程式碼
還原命令
fjpublish recover pre_release複製程式碼
動態圖
更多
可以使用命令
fjpublish recover pre_release -p, --previous
快速還原至上個版本而不需要選擇;可以使用選項
recoverTemplate
自定義版本列表模板;快速還原一樣也會執行
postCommands
配置的後置命令。
結語
以上的例子描述了fjpublish中最基本的功能,fjpublish也有強大擴充能力,感興趣的童鞋可以直接移步官方文件瞭解更多,別忘了在github上給我點個star哦。
下一期我們將談論如何使用fjpublish進行安全釋出,拜拜∩__∩y。
下一期地址:使用fjpublish釋出前端專案(安全篇)
fjpublish官方交流群:608809145