node 如何利用github中webhook進行自動化部署

前言

抱歉!你以爲我要說的是github! 其實我要說的是碼雲!

不過關係不大,在下的梯子掉了,訪問github實在慢的要死,標題寫碼雲我怕大家不認識。一句話解釋,碼雲就是中國的github,速度比較快!

這個教程的編寫主要是目前關於webhook的node版本的視頻教程和文字教程都沒有,而學會這個技能還是能大大提高效率的。做法是我自己瞎搞的做法,可能不是很符合規範,但是自己的項目使用起來還是很爽的,值得收藏。


原理

原先我們編寫一個項目的時候,可能是在本地進行開發,然後上傳到github中。接着進入服務器中,使用git pull origin 拉取下來。最後重新啓動服務。

有的時候進行一次更新操作是很費時間的。你可能爲了要登錄服務器,進入目錄,拉取代碼,有時候還要處理衝突,最後重新啓動項目。快的話十幾分鍾,慢的話搞着搞着1個小時過去了。

實際操作中,登錄服務器然後在服務器上的操作是比較費時的,如果可以讓我們提交了代碼之後讓服務器自己拉取代碼並重新啓動的話,就可以省不少時間。

git系的遠程倉庫都有webhook功能,意思是可以讓你提交代碼之後順帶執行一條請求。利用這一點我們可以在服務器中額外開啓一個服務用於自動部署。

流程如下:

  1. 本地更新代碼並push到倉庫
  2. 倉庫接受到push請求並執行webhook請求,請求服務器中的自動化部署服務。
  3. 自動化部署服務接受到請求,在服務器端向倉庫發送pull請求並部署。

演示

首先創建一個正在編寫的程序,我們還是以egg的helloworld爲例。

npm init egg --type=simple

在碼雲中創建倉庫並上傳這個代碼上去

項目地址: https://gitee.com/Zeeephr/auto-coding

然後在服務器中拉取下來。

這個作爲你正在編寫的項目。

實現一個自動化部署服務項目

腳本

#autoBuild.sh
npm run stop
git reset --hard origin/master
git clean -f
git pull
npm run start

web服務

var http = require('http')
var spawn = require('child_process').spawn
// 腳本地址
const script = '/xxx/xxx.sh';
// 執行指令的地址
const currentPath = '/xxx/xxx';
const password = 'xxx';
http.createServer(function (req, res) {
  if(req.headers['x-gitee-token'] === password) {
    console.log('密碼正確 開始拉取代碼');
    rumCommand('sh', [script], function( txt ) {
      console.log(`在${currentPath}目錄下執行了腳本${script}`);
      console.log(txt);
    });
    res.statusCode = 200;
    res.end('success');
  } else {
    res.statusCode = 200;
    res.end('???');
  }
}).listen(8889);
console.log('listen to 127.0.0.1:8889')

function rumCommand( cmd, args, callback ) {
  var child = spawn( cmd, args, {
    cwd: currentPath,
  } )
  var response = ''
  child.stdout.on('data', function( buffer ){ response += buffer.toString(); })
  child.stdout.on('end', function(){ callback( response ) })
}

這裏我只做了最簡單的實現,這個服務監聽8889服務,假設密碼爲xxx。

  1. 需要注意的是代碼中的腳本位置設置爲上面腳本的位置
  2. currentPath 設置爲auto-coding的項目部署的位置,這樣纔會在改位置執行git pull。這點其他的教程沒怎麼提及。

代碼也上傳到碼雲了: https://gitee.com/Zeeephr/auto-helper

將腳本和部署服務同樣部署到服務器中,使用pm2 start app.js將服務常駐內存。

設置webhook

回到auto-coding項目,添加webhook操作。

設置指向的地址和密碼

測試連通性。

其中success就是上面服務中返回的

    res.statusCode = 200;
    res.end('success');

測試整體流程

在本地中修改auto-coding項目代碼

至此我們就實現了自動部署。

 

後記

這裏的auto-coding是一個公開項目,所以git pull的時候不需要密碼,如果是私有項目的時候是需要密碼的,沒有提供密碼的時候服務是無效的。可以在服務器中進行設置記錄一下密碼,具體搜索“linux 設置github 免密碼”。這裏不再贅述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章