使用travis-ci如何持續(xù)部署node.js應(yīng)用詳解
前言
在開(kāi)始之前,我們先來(lái)簡(jiǎn)單介紹下Travis-ci,Travis-ci是一款持續(xù)集成(Continuous Integration)服務(wù),它能夠很好地與Github結(jié)合,每當(dāng)代碼更新時(shí)自動(dòng)地觸發(fā)集成過(guò)程。
Travis-ci配置簡(jiǎn)單,很多nodejs項(xiàng)目都用它做自動(dòng)測(cè)試。然而,對(duì)于持續(xù)集成,僅做到自動(dòng)測(cè)試是不夠的,還要有后續(xù)的自動(dòng)部署,才能完成“提交代碼 => 自動(dòng)測(cè)試 => 自動(dòng)部署”的集成鏈條。
本文以nodejs應(yīng)用為例,來(lái)談?wù)勅绾卫胻ravis-ci完成自動(dòng)部署。話不多說(shuō),來(lái)一起看看詳細(xì)的介紹:
基本原理
從自動(dòng)測(cè)試到自動(dòng)部署的核心問(wèn)題是測(cè)試機(jī)與生產(chǎn)服務(wù)器的信任問(wèn)題,即如何安全地把程序包傳輸?shù)缴a(chǎn)服務(wù)器。市面上的部署工具如scp、ansible、chef,都繞不開(kāi)這個(gè)核心問(wèn)題。
以scp為例,測(cè)試機(jī)登錄生產(chǎn)服務(wù)器的方式有兩種:密碼和秘鑰。密碼登錄方式需要交互式地輸入密碼,總不能每次測(cè)試的時(shí)候,人為地輸入密碼吧,所以密碼方式行不通。
秘鑰的方式可以實(shí)現(xiàn)自動(dòng)登錄,但首次將測(cè)試機(jī)的公鑰傳輸給生產(chǎn)服務(wù)器仍然需要密碼。似乎走入了死胡同,但辦法總是有的。我們知道開(kāi)發(fā)機(jī)是可以登錄到生產(chǎn)服務(wù)器的,那么我們就可以將開(kāi)發(fā)機(jī)的公鑰復(fù)制到生產(chǎn)服務(wù)器,將開(kāi)發(fā)機(jī)的私鑰復(fù)制到測(cè)試機(jī),測(cè)試機(jī)通過(guò)私鑰來(lái)偽裝成開(kāi)發(fā)機(jī),自動(dòng)地登錄到生產(chǎn)服務(wù)器。
解決了自動(dòng)登錄的問(wèn)題,另一個(gè)問(wèn)題是怎么將開(kāi)發(fā)機(jī)的私鑰復(fù)制到測(cè)試機(jī)上。由于測(cè)試機(jī)每次都是新開(kāi)的一個(gè)虛擬機(jī),這個(gè)新開(kāi)的虛擬機(jī)IP不固定,所以沒(méi)辦法直接登錄上去。解決辦法是將私鑰文件作為代碼庫(kù)的一部分提交,這樣測(cè)試機(jī)每次從代碼庫(kù)上拉取代碼的同時(shí)也獲取到了秘鑰文件,通過(guò)這種方式就實(shí)現(xiàn)了私鑰從開(kāi)發(fā)機(jī)復(fù)制到測(cè)試機(jī)。
將私鑰文件提交到代碼庫(kù)有一個(gè)很?chē)?yán)重的安全性問(wèn)題,即任何人只要得到了這個(gè)私鑰文件,他就可以隨心所欲的操縱生產(chǎn)服務(wù)器。幸好,travis-ci提供了加密方案,它能夠?qū)⑺借€文件加密,加密后的文件只在當(dāng)前代碼庫(kù)有效。
總的來(lái)說(shuō),通過(guò)復(fù)制私鑰完成自動(dòng)登錄以及對(duì)私鑰加密來(lái)保障安全性,我們就可以建立起測(cè)試機(jī)與生產(chǎn)服務(wù)器的信任通道,測(cè)試機(jī)就可以安全地操作生產(chǎn)服務(wù)器完成自動(dòng)部署。
配置
現(xiàn)在我以scp方式部署nodejs應(yīng)用為例,來(lái)說(shuō)明travis-ci做自動(dòng)部署的配置。
首先,建立起開(kāi)發(fā)機(jī)與生產(chǎn)服務(wù)器的信任關(guān)系:
ssh-copy-id username@host
然后,加密你的私鑰,私鑰文件通常在~/.ssh/id_rsa
。加密私鑰文件需要使用travis這個(gè)命令行工具,它是一個(gè)ruby包,使用gem安裝:
gem install travis travis login
輸入賬號(hào)密碼登錄成功后,使用travis encrypt-file
加密:
travis encrypt-file ~/.ssh/id_rsa --add
上面命令執(zhí)行完后,會(huì)生成一段解密命令并添加到.travis.yml
中:
before_install: - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv -in ~/.ssh/id_rsa.enc -out ~/.ssh/id_rsa -d
接下來(lái),把加密后的私鑰文件(id_rsa.enc)復(fù)制到代碼庫(kù)中,千萬(wàn)要注意不要錯(cuò)把未加密的私鑰文件(id_rsa)復(fù)制到你的代碼庫(kù)中。然后把上面的解密命令的-in ~/.ssh/id_rsa.enc
改為-in id_rsa.enc
。
通過(guò)上面的過(guò)程就基本建立測(cè)試機(jī)與生產(chǎn)服務(wù)器的信任關(guān)系,但還有一些小細(xì)節(jié)要處理。例如,降低id_rsa文件的權(quán)限,否則ssh處于安全方面的原因會(huì)拒絕讀取秘鑰;將生產(chǎn)服務(wù)器地址加入到測(cè)試機(jī)的信任列表中,否則連接時(shí)會(huì)詢問(wèn)是否信任服務(wù)器。更改后的配置如下:
before_install: - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d - chmod 600 ~/.ssh/id_rsa - echo -e "Host 102.201.64.94\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
最后,測(cè)試機(jī)就可以愉快地操作生產(chǎn)服務(wù)器了,例如下面是一個(gè)nodejs應(yīng)用的.travis.yml
文件配置:
language: node_js node_js: - '4.4.4' before_install: - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d - chmod 600 ~/.ssh/id_rsa - echo -e "Host 102.201.64.94\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config script: - npm run test after_success: - npm prune --production # 刪除devDependencies - tar -jcf indoor-server.tar.bz2 * # 打包并壓縮代碼 - scp indoor-server.tar.bz2 jingsam@102.201.64.94:~/ # 復(fù)制到生產(chǎn)服務(wù)器上 - ssh jingsam@102.201.64.94 'mkdir -p indoor-server && tar -jxf indoor-server.tar.bz2 -C indoor-server' # 解壓 - ssh jingsam@102.201.64.94 'cd indoor-server && pm2 startOrReload pm2.json' # 重啟pm2
總結(jié)
本篇文章講的自動(dòng)部署其實(shí)與nodejs關(guān)系不大,完全適用于各種語(yǔ)言的自動(dòng)部署,其原理都是相通的。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持
相關(guān)文章
Node+Express連接MySQL實(shí)現(xiàn)增刪改查功能
這篇文章主要為大家詳細(xì)介紹了Node如何結(jié)合Express連接MySQL實(shí)現(xiàn)增刪改查功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-05-05從零學(xué)習(xí)node.js之mysql數(shù)據(jù)庫(kù)的操作(五)
因?yàn)榻佑|Node.JS已經(jīng)有一段時(shí)間了,最近粗略的研究了一下node.js操作數(shù)據(jù)庫(kù)的包,覺(jué)得node.js連接數(shù)據(jù)庫(kù)不錯(cuò)。下面這篇文章主要給大家介紹了node.js之mysql數(shù)據(jù)庫(kù)操作的相關(guān)資料,需要的朋友可以參考下。2017-02-02node的process以及child_process模塊學(xué)習(xí)筆記
這篇文章主要介紹了node的process以及child_process模塊學(xué)習(xí)筆記,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Node.js中使用Log.io在瀏覽器中實(shí)時(shí)監(jiān)控日志(等同tail -f命令)
這篇文章主要介紹了Node.js中使用Log.io在瀏覽器中實(shí)時(shí)監(jiān)控日志,Log.io等同于tail -f命令,但更強(qiáng)大,需要的朋友可以參考下2014-09-09Nodejs 獲取時(shí)間加手機(jī)標(biāo)識(shí)的32位標(biāo)識(shí)實(shí)現(xiàn)代碼
本文給大家分享nodejs獲取時(shí)間加手機(jī)標(biāo)識(shí)的32位標(biāo)識(shí)實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-03-03修改Nodejs內(nèi)置的npm默認(rèn)配置路徑方法
今天小編就為大家分享一篇修改Nodejs內(nèi)置的npm默認(rèn)配置路徑方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05使用nodeAPI時(shí)遇到過(guò)異步問(wèn)題解決
這篇文章主要為大家介紹了使用nodeAPI時(shí)遇到過(guò)異步問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01