背景
公司用github管理專案,而且這些專案(包括純靜態和node APP)大都是我們自己上伺服器部署的.
場景:
我正在埋頭寫程式碼,突然,
-
pm過來說:
xxx
專案改個東西,很簡單(例如換個圖片,按鈕,文案...) -
我: 哦,那就改唄,按要求先在本地,切到
test
分支改動後的上測試步驟:git add .
git commit -m fix(xxx): xxx
git fetch upstream test
git rebase upstream/test test
,合併conflict後git push upstream test
以上只是把
test
分支程式碼同步到github上,接下來,還要上伺服器pull
程式碼,重啟專案:ssh ubuntu@xxx
tmux a -t xxx
git checkout test
git log
git pull origin test
npm run build:test
現在成功上到測試了,看看效果,沒問題就要上到生產了,步驟和上面差不多,先切到生產(我的是:
next
分支)上生產步驟:git fetch upstream next
git rebase upstream/next next
git merge test
,合併conflict後git push upstream next
以上只是把
next
分支程式碼同步到github上,接下來,還要上伺服器pull程式碼,重啟專案:ssh ubuntu@xxx
tmux a -t xxx
git checkout next
git log
git pull origin next
npm run build:next
終於完成領導交給的任務了,就為了一個小小的改動,用了這麼多步驟,是不是很蛋疼,過了一會兒,pm又跑過來說還有一個地方要改....
以上經歷是否有過呢?
確實太繁瑣了,為了簡化開發,js已經在工程化方面做的不錯了,由前些年的grunt
,到glup
,又到現在的webpack
,以及rollup
,可以說是很成熟了,但是專案部署,可能很多前端小夥伴接觸的還不多,可能只是打包出檔案(dist
)甩給後端.
接下來我就講講如何簡單的優化這些繁瑣的步驟,不依靠ci
,僅僅藉助webhooks
來簡單的實現.
那麼什麼是webhooks?
- 簡單的來說是一種回撥,和非同步程式設計中的"訂閱-釋出模式"很類似,一端觸發事件,一端監聽執行,webhooks是非同步程式設計模型的一種實現,具體的可以看webhooks
流程
git push xxx
原生程式碼提交至遠端github倉庫- github倉庫收到push後進行回撥,發post(
Payload url
是來自webhooks的配置)請求 - 基於
Payload url
的服務根據傳回來的資訊進行提取,拉取最新程式碼並重新構建專案 - 可以看到,我們只需把程式碼提交到github倉庫即可,不用再上伺服器進行一些列的操作了
開始
-
搭建github-hook服務
-
目的是為webhooks提供payload url,並取得github 回撥發來的資訊,執行構建部署命令
-
選擇:
a. copy我的github-hook,基於koa
b. 用這個自己寫github-webhook-handler,基於node原生http服務的
c. 其他
-
介紹一下我的
github-hook
:目錄:
. ├── README.md ├── config │ ├── data.example.js │ ├── data.js (配置專案的 dir/分支/啟動命令) │ └── index.js (配置secret,與github的webhooks配置相同) ├── ecosystem.config.js (pm2啟動配置檔案) ├── package-lock.json ├── package.json └── src ├── controlers │ └── token.js (用於生成token,webhooks加密用) ├── index.js (啟動檔案) ├── jobs │ └── index.js (解析回撥發來的資訊,執行命令) └── routes └── index.js (路由,處理請求) 複製程式碼
-
-
在伺服器啟動
github-hook
服務- 登入伺服器,進入工作目錄(我的是
/var/nodejs
,可根據喜好自己改,別忘了改對應的config/data.js
檔案的DIR
) git clone xxxgithub-hook.git
cd github-hook
npm i
npm run start
,用的是pm2,請先全域性安裝pm2curl ip:9002
,若有success字樣,則成功- 注:本服務的埠是9002,若已佔用,請自行更改
/index.js
,別忘記安全組開放埠
- 注:本服務的埠是9002,若已佔用,請自行更改
- 登入伺服器,進入工作目錄(我的是
-
github配置webhooks
開啟github,找到要配置的專案,進入setting-->webhooks-->新增一個:
- Payload URL: 輸入上一步測試的api,即
http://ip:9002/payload/{reponame}
,我這裡的reponame即github-hook
- Content type: 選擇application/json
- Secret: 與上面
/config/index.js
中的appSecrcet
保持一致 - Which events would you like to trigger this webhook? 選擇第一項 Just the push event 即可
- 配置完成,提交即可,配置後如下圖:
- Payload URL: 輸入上一步測試的api,即
-
測試
在本機更改
github-hook
程式碼,提交,然後開啟剛剛的github頁面看看下面是否有Recent Deliveries:
結語:
- 不需要登入伺服器,
pull
程式碼,重啟服務,直接在本地提交程式碼就可以重新構建部署是不是提高了效率? - 當然這只是簡單的應用,想要更好地管理還是要靠
ci
系統,在版本回退,單元測試等方面更完善,也就是我下次要講的,將專案放到docker
容器中 "用jenkins
打包構建部署專案".
== ps: ==剛開始寫東西,以前沒有這個習慣,還請多多提意見,謝謝~