透過travis進行CI/CD的專案是這個,專案環境是node.js+Express+MySQL+Heroku
至於想了解怎麼寫測試,可以看這篇,在node.js寫測試-mocha+chai斷言庫+supertest模擬連線+sinon替身+nyc統計覆蓋率。
什麼是Travis
其實就是一個雲端服務,當我們把新的commit推到GitHub時,會觸發Travis去把新的commit抓過去在它的線上環境跑測試即CI,跑完測試沒問題就自動推上Heroku,所以等於是我們開發完就只要push到GitHub就好了,不用再自己手動推上Heroku,會節省很多時間。
申請Travis
要用這個服務要先有Travis帳號,但申請蠻簡單的,我就不多說了XD
至於裡面會問你說是不是要跟GitHub的repo同步,接著就會跑一段時間去抓你GitHub的那些repo,最後可以再選哪一些repo是確實要CI/CD的,這樣以後被選擇的repo就可以在你有推新的commit時被Travis知道,並開始CI/CD。
透過travis達成CI(自動化整合)
申請帳號完就要來為了travis做一連串的設定了。
1.專案根目錄下新增.travis.yms
GitHub參考
// .travis.yms
language: node_js
node_js:
- "10"services:
- mysql# 設定參數(Travis CI 會按照參數分別執行)
env:
- NODE_ENV=test# 在 install 前執行的指令
before_install:
- mysql -e 'CREATE DATABASE IF NOT EXISTS masungo default character set utf8mb4 collate utf8mb4_unicode_ci;'
- npm install sequelize-cli -g
- npm install mocha -g
- export JWT_SECRET=masungogogo# 在執行測試之前的指令
before_script:
- sequelize db:migratedeploy:
provider: heroku
edge: true
api_key:
secure: xxxxxxxxxxxxxxxxxxxxxx
app: masungo-backend
2. 更新config.json
相信在本地端開發的時候大家都有config.json這支檔案,裡面都是對應不同環境的DB的設定值,而因為在travis環境跑測試時用的是他們的DB,所以我們在前面travis.yms
就有設定env: — NODE_ENV=tset
,告訴travis我們接著要跑的環境都是test的狀態,也因此我們在config.json
這裡就要多設定一個”test”
讓程式吃進去,才能讓程式在跑的時候連線到travis的DB上。
// config.json
{
"development": {
"username": "root",
"password": "password",
"database": "masungo",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false
},
"test": {
"username": "travis",
"database": "masungo",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false
},
"production": {
"use_env_variable": "CLEARDB_DATABASE_URL"
}
}
透過travis在Heroku達成CD(自動化部署)
1. 更新.travis.yms
前面所說travis.yms的設定是為了CI所做,接著我們要把CD的部分補上來,也就是把deploy的設定寫進去,就照著我下面的code寫進去就好了。
但其中有幾點比較特別還是必須說明一下,app
就是輸入你在Heroku上所建立的那個專案名稱,secure
那邊要輸入的則是加密過的api_key
,注意喔,是加密過的喔!!!!!!!!!!!!!!!!!!
我之前一直送沒加密的進去,研究兩天才發現原來要加密!!!
GitHub參考
// .travis.yms
language: node_jsnode_js:
- "10"
services:
- mysql# 設定參數(Travis CI 會按照參數分別執行)
env:
- NODE_ENV=test# 在 install 前執行的指令
before_install:
- mysql -e 'CREATE DATABASE IF NOT EXISTS masungo default character set utf8mb4 collate utf8mb4_unicode_ci;'
- npm install sequelize-cli -g
- npm install mocha -g
- export JWT_SECRET=masungogogo# 在執行測試之前的指令
before_script:
- sequelize db:migratedeploy:
provider: heroku
edge: true
api_key:
secure: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
app: masungo-backend
接著開始詳細說明怎麼加密:
1-1. 安裝Ruby
我記得安裝的時候也會同時問你要不要安裝GEM,查了一下GEM其實有點類似node.js在用的NPM套件管理器。
1–2. 終端機把路徑切到你的專案目錄下
1–3. 透過Ruby的GEM安裝travis CI
gem install travis
1–4. 去Heroku後台查api_key
到了Heroku>點右上角大頭貼>Account Settings>往下滑就看得到了>點Reveal>會拿到類似像這樣的 286f2a10-da7f-448c-a6dd-0989903c3a13
亂碼
1–4. 終端機下指令加密
跑完後會發現它自動把加密好的API KEY放到.travis.yml
檔案裡的api_key KEY
囉!
travis encrypt 在HEROKU後台拿到的API KEY --add deploy.api_key
這邊要注意的是資安問題,目前我們用的travis.org它每次跑的設定跟結果都會是public,也就是說這些設定跟結果都會被網友看到,所以secure那一欄就會被知道,人家也就知道怎麼連到你的Heroku了…= =
(這個大漏洞我還在研究怎麼不要讓secure顯示在上面,所以目前暫時的解法是如果travis CI/CD有測試成功就代表你會做了,那就先暫時把heroku那邊的API KEY重新產生新的,以免別人有機可乘)
像我GitHub這個就是不好的示範,把API KEY直接弄上去了,大家千萬要小心啊~
推上GitHub
前面為了CI跟CD做得這一堆設定commit上去並推上GitHub,接著去Travis頁面就會看到build history裡有一個剛剛被觸發的紀錄,點進去看就會發現有個黑黑的畫面開始跑一堆指令,跑到如第二張圖就代表成功了,在build history那邊也會有個綠色打勾。