使用Travis-ci自動SSH部署vue代碼

本文摘自使用Travis-ci自動SSH部署代碼使用 travis 自動部署 vuejs 項目vue

1. 從手動部署到自動部署

在整個代碼部署的道路上,我經歷了手動部署到shell半自動部署再到如今的Travis自動部署。node

1.1 石器時代 - 手動部署

很早很早以前,我採用徹底手動的方式部署代碼:linux

這個過程當中我須要,先在本地編寫並調試代碼而後上傳到Git服務器上,再手動 SSH登陸機器經過 git pull下載最新的代碼,最後在服務器上進行編譯和重啓服務。

這種原始的模式每每最傻瓜有效,但意味着須要手動作一些列的工做,每次部署都會變得極其麻煩。git

1.2 青銅時代 - shell半自動部署

後來我想到了把登陸機器、編譯、部署的事情交給shell自動執行,因而我就寫了個shell腳本,主要的內容是:本地編譯完成以後shell腳本自動的把代碼打包,而後上傳到服務器上,部署並重啓服務。github

使用了 shell以後大大的解放了雙手,每次決定上線的時候只須要執行 sh deploy.sh而後坐等結果就行了。可是使用shell也有他的弊端:每次上線都得手動執行部署命令,而後等待代碼自動的打包上傳以及部署,若是遇到網絡抖動或者打包後的文件過大存在着失敗的可能性,就有可能還須要再來一次。說是自動化,其實仍是須要人工去觀察和干預的,因而Mofei就想了,能不能有一種更高效的方式進行部署呢?因而就有了如今的部署方式。

1.3 現代 - Travis自動部署

經過配合Travis的使用,咱們能夠實現以下的效果:shell

  • 測試部署:每次push代碼到dev分支,Travis會自動進行單元測試,而後自動的經過SSH將代碼部署到對應的開發機器上並重啓服務,以保持開發機上始終是最新的版本。
  • 正式部署:決定上線的時候能夠將代碼push代碼到deploy分支上,Travis會自動將代碼部署到正式的開發環境。
    固然了這個過程能夠根據本身的團隊進行適當的調整以決定什麼時候進行部署。

2.調教Travis

步入正題,要完成自動部署,首先Travis要能監聽Git的變化,而後Travis還須要有權限登陸到咱們的SSH服務器進行部署: npm

  1. 配置Travis,讓Travis能監聽Git的某個分支。
  2. Git某個分支提交以後,Travis能自動發現提交併進行編譯。
  3. Travis將編譯後的產物經過SSH部署到給咱們指定的機器。

2.1 初始化Travis

開始以前,若是你尚未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項目來講,大概有這兩種部署方式:

  1. 開發環境打包:在開發機上打包出靜態文件,再將dist 上傳到生產環境。
npm install
npm run build
rsync ./dist/* <USERNAME>@<HOST>:<TARGET-PATH>
複製代碼
  1. 生產環境打包:在生產環境中拉取倉庫,打包,再拷貝到目標路徑。
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 環境裏,咱們根本沒法輸入密碼。

2.2 Travis添加SSH密鑰

一般咱們是經過ssh命令加上用戶名和密碼訪問服務器的,雖然理論上咱們也能夠在travis的命令中寫上諸如ssh mofei@zhuwenlong.com -p abc的腳本,可是這樣的代碼若是提交到了公開的倉庫中會有很大的泄露服務器密碼的風險,因此咱們須要一個別人沒法竊取密碼或者密鑰的方式讓Travis登陸咱們的服務器。

一般的免密登陸是基於SSH信任關係的,那麼若是咱們能把密鑰以加密的形式保持在Travis的服務器中,Travis就能登陸咱們的服務器了。這裏咱們可使用Travis的文件加密功能,把咱們的密鑰進行加密保存。

在這個過程當中,咱們的密鑰首先會被被 Travis加密,解密的密鑰被存儲在 Travis中,就是說只有 Travis能夠進行解密。因此咱們能夠大膽的把這個加密後的文件上傳到 github中,不用擔憂其餘人盜用咱們的密鑰。

既然咱們想要使用Travis加密文件,第一件事情就是在本地安裝Travis

這裏有一點必定要注意就是若是你的目標服務器爲linux系統的話那麼你的如下步驟也必須在linux系統中執行!!!!

2.2.1 本地安裝Travis

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帳號和密碼很快就完成了。

2.2.2 生成並加密SSH密鑰

萬事俱備只欠東風,咱們如今只要生成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加密
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>這裏的userhost須要替換成本身服務器的用戶名和地址)添加公鑰,添加成功以後,全部用該公鑰對應的私鑰訪問服務器都會直接被認證經過。也就是說若是Travis保持了私鑰的話,就能夠免密的經過ssh登陸咱們的服務器了。

  • 刪除敏感文件並將修改添加到git中
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中。

2.3 Travis部署腳本

全部的一切都準備好以後,咱們就能夠修改.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逛哦!

個人博客:http://blog.luyu.fun

個人github:https://github.com/panyu97py/

個人博客源碼:https://github.com/panyu97py/blog-client

相關文章
相關標籤/搜索