本文摘自使用Travis-ci自動SSH部署代碼和使用 travis 自動部署 vuejs 項目vue
在整個代碼部署的道路上,我經歷了手動部署到shell
半自動部署再到如今的Travis
自動部署。node
很早很早以前,我採用徹底手動的方式部署代碼:linux
這個過程當中我須要,先在本地編寫並調試代碼而後上傳到Git服務器上,再手動SSH
登陸機器經過
git pull
下載最新的代碼,最後在服務器上進行編譯和重啓服務。
這種原始的模式每每最傻瓜有效,但意味着須要手動作一些列的工做,每次部署都會變得極其麻煩。git
後來我想到了把登陸機器、編譯、部署的事情交給shell自動執行,因而我就寫了個shell腳本,主要的內容是:本地編譯完成以後shell腳本自動的把代碼打包,而後上傳到服務器上,部署並重啓服務。github
使用了shell
以後大大的解放了雙手,每次決定上線的時候只須要執行
sh deploy.sh
而後坐等結果就行了。可是使用shell也有他的弊端:每次上線都得手動執行部署命令,而後等待代碼自動的打包上傳以及部署,若是遇到網絡抖動或者打包後的文件過大存在着失敗的可能性,就有可能還須要再來一次。說是自動化,其實仍是須要人工去觀察和干預的,因而Mofei就想了,能不能有一種更高效的方式進行部署呢?因而就有了如今的部署方式。
經過配合Travis
的使用,咱們能夠實現以下的效果:shell
push
代碼到dev
分支,Travis
會自動進行單元測試,而後自動的經過SSH將代碼部署到對應的開發機器上並重啓服務,以保持開發機上始終是最新的版本。push
代碼到deploy
分支上,Travis
會自動將代碼部署到正式的開發環境。
固然了這個過程能夠根據本身的團隊進行適當的調整以決定什麼時候進行部署。步入正題,要完成自動部署,首先Travis
要能監聽Git
的變化,而後Travis
還須要有權限登陸到咱們的SSH服務器
進行部署: npm
Travis
,讓Travis
能監聽Git
的某個分支。Git
某個分支提交以後,Travis能自動發現提交併進行編譯。Travis
將編譯後的產物經過SSH部署到給咱們指定的機器。開始以前,若是你尚未
Travis
帳號,請使用Github
登陸Traivs
,並關聯你的項目。ruby
Travis
是經過項目中的.travis.yml
文件來配置任務的,首先咱們須要在項目的根目錄創建.travis.yml
文件,咱們以該配置爲例。bash
新建.travis.yml
文件,寫上以下代碼:服務器
language: node_js
node_js:
- 8
複製代碼
其中language
指得是項目運行語言,由於這裏是node.js
項目,因此寫的是node_js
,若是你使用的是其餘的語言能夠參考官方的文檔。以後的-8
指的是使用v8版本
的node.js
.固然你也能夠指定多個版原本分別執行代碼,如:
node_js:
- stable
- '6'
- '4'
複製代碼
那麼咱們以vue
項目爲例: 若是不用 travis
,對於一個 vuejs
項目來講,大概有這兩種部署方式:
dist
上傳到生產環境。npm install
npm run build
rsync ./dist/* <USERNAME>@<HOST>:<TARGET-PATH>
複製代碼
npm install
npm run build
cp ./dist/* <TARGET-PATH>
複製代碼
因此vue
項目完整的.travis.yml
文件以下:
language: node_js
node_js: stable
branches:
only:
- master
addons:
ssh_known_hosts:
- <HOST>
install:
- npm install
script:
- npm run build
after_success:
- rsync -az --delete ./dist/* <USERNAME>@<HOST>:<TARGET-PATH>
複製代碼
添加好.travis.yml
文件以後,每次上傳到Git中的代碼都會自動進行Travis
的構建,若是經過了能夠在對應的commit
後面看到一個綠色的勾,若是失敗了會是一個紅色的叉。
travis build
的時候會卡住。由於
rsync
工具須要輸入
ssh
登陸密碼,而在
travis build
環境裏,咱們根本沒法輸入密碼。
一般咱們是經過ssh命令加上用戶名和密碼訪問服務器的,雖然理論上咱們也能夠在travis
的命令中寫上諸如ssh mofei@zhuwenlong.com -p abc
的腳本,可是這樣的代碼若是提交到了公開的倉庫中會有很大的泄露服務器密碼的風險,因此咱們須要一個別人沒法竊取密碼或者密鑰的方式讓Travis
登陸咱們的服務器。
一般的免密登陸是基於SSH
信任關係的,那麼若是咱們能把密鑰以加密的形式保持在Travis
的服務器中,Travis
就能登陸咱們的服務器了。這裏咱們可使用Travis
的文件加密功能,把咱們的密鑰進行加密保存。
Travis
加密,解密的密鑰被存儲在
Travis
中,就是說只有
Travis
能夠進行解密。因此咱們能夠大膽的把這個加密後的文件上傳到
github
中,不用擔憂其餘人盜用咱們的密鑰。
既然咱們想要使用Travis
加密文件,第一件事情就是在本地安裝Travis
。
這裏有一點必定要注意就是若是你的目標服務器爲
linux
系統的話那麼你的如下步驟也必須在linux
系統中執行!!!!
sudo gem install travis
複製代碼
因爲Travis
使用的是ruby
,若是遇到衆所周知的緣由無發現下載的話,能夠將ruby
更換成國內的源,具體能夠參考這裏。
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
複製代碼
而後再次運行安裝Travis
的命令 sudo gem install travis
安裝好Travis
以後,咱們須要在命令行中登陸Travis
travis login --pro
複製代碼
一路輸入你的github
帳號和密碼很快就完成了。
萬事俱備只欠東風,咱們如今只要生成SSH
密鑰,而後添加信任關係,並用Travis
加密保存便可。
在命令行中執行以下腳本:
# 在當前目錄生成密鑰
ssh-keygen -t rsa -b 4096 -C 'build@travis-ci.org' -f ./deploy_rsa
# 使用Travis加密
travis encrypt-file deploy_rsa --add
# 添加信任關係
ssh-copy-id -i deploy_rsa.pub <ssh-user>@<deploy-host>
# 刪除敏感文件
rm -f deploy_rsa deploy_rsa.pub
# 將修改添加到git中
git add deploy_rsa.enc .travis.yml
複製代碼
咱們詳細來看一下代碼(若是你理解全部的命令,能夠略過這一小段):
ssh-keygen -t rsa -b 4096 -C 'build@travis-ci.org' -f ./deploy_rsa
複製代碼
首先,咱們使用ssh的命令在當前目錄中生成了一個ssh
密鑰,這段代碼執行完成以後,會在目錄中生成2個文件,私鑰deploy_rsa
和公鑰deploy_rsa.pub
,前者是用來免密登陸服務器時候使用的,後者服務器用來鑑定私鑰的有效性的。
travis encrypt-file deploy_rsa --add
複製代碼
由於Travis
只須要使用到私鑰,因此咱們這裏講私鑰進行加密保存,這句話執行完成以後,你會看到在.travis.yml
文件中被自動加了下面的代碼(--add
),同時文件夾中也發現一個加密後的文件deploy_rsa.enc
。
before_install:
- openssl aes-256-cbc -K $encrypted_137f45644142_key -iv $encrypted_137f45644142_iv
-in deploy_rsa.enc -out deploy_rsa -d
複製代碼
這幾行被自動添加的代碼的意思是,在install
以前執行解開deploy_rsa.enc
文件的命令並放置到deploy_rsa
以供使用,其中這裏的$encrypted_137f45644142_key
和$encrypted_137f45644142_iv
是解開這個文件的兩個變量被存儲在了Travis
的服務器上。
ssh-copy-id -i deploy_rsa.pub <ssh-user>@<deploy-host>
複製代碼
這句話的意思是向目標服務器(<ssh-user>@<deploy-host>
這裏的user
和host
須要替換成本身服務器的用戶名和地址)添加公鑰,添加成功以後,全部用該公鑰對應的私鑰訪問服務器都會直接被認證經過。也就是說若是Travis
保持了私鑰的話,就能夠免密的經過ssh
登陸咱們的服務器了。
rm -f deploy_rsa deploy_rsa.pub和git add deploy_rsa.enc .travis.yml
複製代碼
私鑰deploy_rsa
和公鑰deploy_rsa.pub
已經完成了他們的使命,咱們能夠把它刪除以避免被其餘人惡意使用,並把生成的加密文件deploy_rsa.enc
和修改後的.travis.yml
添加到git
中。
全部的一切都準備好以後,咱們就能夠修改.travis.yml
文件讓travis
來進行部署了。
首先,咱們須要在部署以前解密私鑰,並使其生效,因此咱們添加以下代碼:
before_install:
- openssl aes-256-cbc -K $encrypted_137f45644142_key -iv $encrypted_137f45644142_iv
-in deploy_rsa.enc -out /tmp/deploy_rsa -d
- eval "$(ssh-agent -s)"
- chmod 600 /tmp/deploy_rsa
- ssh-add /tmp/deploy_rsa
複製代碼
before_install
字段標明瞭Travis在部署以前須要執行的命令,其中第一行是解密ssh
文件,後面的3行是使ssh
密鑰生效。 因而咱們最終的.travis.yml
文件內容以下:
language: node_js
node_js: stable
branches:
only:
- master
addons:
ssh_known_hosts:
- <HOST>
before_install:
- openssl aes-256-cbc -K $encrypted_137f45644142_key -iv $encrypted_137f45644142_iv
-in deploy_rsa.enc -out /tmp/deploy_rsa -d
- eval "$(ssh-agent -s)"
- chmod 600 /tmp/deploy_rsa
- ssh-add /tmp/deploy_rsa
install:
- npm install
script:
- npm run build
after_success:
- rsync -az --delete ./dist/* <USERNAME>@<HOST>:<TARGET-PATH>
複製代碼
而後就能夠在每次push
以後玩去了。Travis-ci
會自動幫咱們完成部署。
歡迎到個人博客、個人github逛哦!