Github託管項目實現自動化部署

當咱們利用github來託管項目時,每次部署項目都要走一樣的流程,敲擊一樣的命令行,尤爲的咱們的node項目更是沒法忍受這種重複工做。html

那到底有沒有一種能夠解放咱們雙手,當咱們提交代碼後,服務器自動執行咱們已經制定好的命令行,答案是咱們能夠利用Github自有的Webhooksnode

Webhooks

Webhooks是來監測你在github上的各類事件,咱們能夠經過定製它來監測一個push事件,每當咱們提交代碼時Webhooks會被觸發,這是咱們能夠經過配置一個HOST POST請求到你所須要的地址。nginx

如何配置

找到你在Github上的項目地址上的SettingWebhooks,以下圖配置:git

圖片描述

項目配置

  • 編寫執行shell命令

在項目根目錄下新建deployed.sh文件,輸入你想在服務器上執行的命令行,如:github

cd /front/docs/

git pull origin master
  • 編寫執行腳本

在項目根目錄下新建deployed.js文件web

var http = require('http')
var spawn = require('child_process').spawn
var createHandler = require('github-webhook-handler')
var handler = createHandler({
  path: '/pushCode',
  secret: '12345678'
})
http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404;
    res.end('no such location')
  })
}).listen(3000)

handler.on('error', function (err) {
  console.error('Error:', err.message)
})

handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref)
  rumCommand('sh', ['./deployed.sh'], function (txt) {
    console.log(txt)
  })
})

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

nginx配置

執行腳本跑在了3000端口,咱們服務器對應啓用到 3000 端口shell

upstream test {
    server 127.0.0.1:3000;
}

server {

  location /pushCode {
    proxy_pass http://test;
    proxy_redirect off;
  }

}

部署項目

首次部署到服務器時,仍然是須要咱們手動執行命令git pull項目,當咱們在服務器上clone下咱們的項目後,在本地嘗試修改下代碼,而後再次提交,可看到後臺的日誌json

圖片描述

再次查看Webhooks服務器

圖片描述

表示已經自動觸發了接口,項目自動化部署成功。ui

管理應用

在服務器上執行node命令後,當咱們離開服務器後,實際上程序進程關閉了,因此咱們利用pm2來管理咱們的node進程。

在項目根目錄下新建pm2.json

[{
  "name": "test",
  "script": "deployed.js",
  "env_dev": {
    "NODE_ENV": "development"
  },
  "env_production": {
    "NODE_ENV": "production"
  }
}]

把全部的代碼推送上服務器,進入服務器項目目錄,執行

// 啓動命令
pm2 start pm2.json

// 查看是否啓動
pm2 list

// 查看日誌
pm2 logs

本文感謝SkyCai提供的思路。原文地址

相關文章
相關標籤/搜索