部署項(xiàng)目可以分為構(gòu)建舌厨、發(fā)布兩個(gè)步驟缀踪。構(gòu)建過(guò)程打包源代碼,生成最終運(yùn)行的文件腾务,發(fā)布過(guò)程使用打包后的文件更新線上程序毕骡。有時(shí)我們會(huì)在構(gòu)建過(guò)程中使用nodejs來(lái)處理一些工作,比如源代碼的打包岩瘦、上傳靜態(tài)資源至CDN等未巫。如果這些過(guò)程發(fā)生了錯(cuò)誤,應(yīng)該立即終止部署流程启昧,避免線上事故叙凡。
如何終止部署流程?
一般一個(gè)部署流程是一段 linux shell密末∥找可以在shell中通過(guò)&&
操作符依次執(zhí)行命令跛璧。如果其中某個(gè)進(jìn)程錯(cuò)誤退出,shell 將不會(huì)繼續(xù)執(zhí)行新啼。
比如:
echo msg1 && echo msg2 && aErrorCmd && echo msg3;
上述命令依次執(zhí)行 echo msg1
, echo msg2
, aErrorCmd
, echo msg3
4個(gè)命令追城。執(zhí)行到aErrorCmd
處,程序錯(cuò)誤退出燥撞。第四個(gè)命令echo msg3
將不會(huì)執(zhí)行座柱。
如何查看進(jìn)程是否錯(cuò)誤退出?
可以通過(guò)查看進(jìn)程的退出狀態(tài)碼來(lái)確定進(jìn)程是否錯(cuò)誤退出物舒。如果進(jìn)程的退出狀態(tài)碼為0色洞,表示進(jìn)程正常退出。否則表示進(jìn)程錯(cuò)誤退出冠胯。進(jìn)程結(jié)束后火诸,可以通過(guò)$?
查看進(jìn)程的退出狀態(tài)碼。
比如:
echo msg1;echo $?;
echo msg1
命令正常退出荠察,$?
的值為0惭蹂。
aErrorCmd;echo $?;
aErrorCmd
命令錯(cuò)誤退出,$?
的值不為0割粮。
如何錯(cuò)誤退出nodejs進(jìn)程?
在nodejs中可以通過(guò)拋出異常的方法使進(jìn)程錯(cuò)誤退出媚污。
// index.js
throw new Error('錯(cuò)誤')
# shell
node index;echo $?;
進(jìn)程的退出狀態(tài)碼為 1 舀瓢。
但是,在promise的回調(diào)中拋出異常耗美,程序仍正常退出京髓。
// index.js
Promise.resolve().then(() => {
throw new Error('錯(cuò)誤')
})
# shell
node index;echo $?;
進(jìn)程的退出狀態(tài)碼為 0 。
那么如何在promise回調(diào)中異常退出進(jìn)程呢商架?可以在nodejs中調(diào)用process.exit(1)
堰怨。
Promise.resolve().then(() => {
process.exit(1)
})
# shell
node index;echo $?;
進(jìn)程的退出狀態(tài)碼為 1 。
如何在webpack打包錯(cuò)誤后錯(cuò)誤退出蛇摸?
const webpack = require('webpack')
const webpackConfig = require('./webpack.prod.conf')
webpack(webpackConfig, function (err, stats) {
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n')
if (stats.hasErrors()) {
process.exit(1)
}
})
打包后备图,通過(guò)回調(diào)參數(shù)stats
的hasErrors
方法判斷webpack是否成功打包。如何含有打包錯(cuò)誤赶袄,程序異常退出揽涮。webpack文檔參考