摘要:正文準備首先確定需要完成的內容明確需求監(jiān)聽指定提交執(zhí)行指定多個腳本而且因為我這邊是需要分別對和目錄分別執(zhí)行部署命令。部署部署我們只需要對然后就可以在本地開發(fā)完之后推送,服務器就能自動拉取代碼并且部署。
前言
之前斷斷續(xù)續(xù)在重構一個項目,然后發(fā)現功能一開始設計太多了,可能需要花大量時間來增加,但是核心功能基本完成,于是想著能不能半上線狀態(tài),然后通過更新提交git,讓服務器部署自動更新。這之前接觸過git hook是可以實現的,因此這里記錄一篇文章邊搗鼓邊寫。
正文 準備首先確定需要完成的內容,明確需求:
1.監(jiān)聽指定 git 提交 2.執(zhí)行指定多個腳本
而且因為我這邊是需要分別對client 和server 目錄分別執(zhí)行部署命令。所以需要特別處理。
首先去域名管理那邊增加一條A記錄指向新的項目名稱.因為Webhooks是需要外網域名的,因此先提前加一條。new.xxx.com
然后就是需要對服務器上Nginx做轉發(fā)配置。
我的nginx是很久之前配置的
在etc/nginx/conf/vhost里增加一個文件,里面寫入如下內容:
server { listen 80; server_name new.xxx.com; index index.html index.htm index.php default.html default.htm default.php; location / { proxy_pass http://127.0.0.1:8801; } access_log off; }
將本地的8801轉發(fā)出去。
然后重啟一下Nginx nginx -s reload
然后git clone 倉庫
因為項目用了mongodb數據庫:
需要創(chuàng)建一個對應的數據庫并添加權限。
1. 切換數據庫到 abc 2. 指定了數據庫 abc ,擁有權限: userAdmin db.createUser( { user: "123", pwd: "123", roles: [ { role: "userAdmin", db: "abc" } ] } ) 3. 驗證下上面創(chuàng)建的賬號 123 db.auth("123","123") => 1配置webhook
這個其實是最簡單的,只要在你的github對應的項目倉庫右側選擇settings
然后選擇webhooks
選擇add webhook
然后按照如下配置即可:
這里需要記住你自己設置的secret 以及你定義的推送動作,我這里是pushCode 。
開始寫腳本寫之前先來看下最終的目錄結構:
├── README.md ├── clean.sh // 清理緩存,并且執(zhí)行git命令 ├── client │ ├── autoClient.sh // client端自動監(jiān)聽 │ ├── build │ ├── config │ ├── package.json │ ├── public │ ├── scripts │ ├── src │ ├── tsconfig.json │ ├── tsconfig.test.json │ ├── tslint.json │ ├── www │ ├── yarn.lock ├── deploy │ └── index.js // 監(jiān)聽webhook事件然后依次執(zhí)行 clean.sh autoClient.sh autoServer.sh ├── package.json ├── server │ ├── autoServer.sh // server端自動監(jiān)聽 │ ├── dist │ ├── package.json │ ├── src │ ├── tsconfig.json │ ├── tslint.json │ └── yarn.lock
因為項目原因,腳本還需要做一些定制。
首先是client端,因為前端是用了typescript + React全家桶 所以打包起來特別慢,當在服務器build的時候,因為阿里云內存給的不夠,所以會很卡。基于這個考慮,是打算本地bulid完之后,推送到git上,服務器去git pull。
而且前端還有個考慮是用什么跑前端代碼。因為服務器沒裝類似服務,因此打算用node框架koa起一個HTTP服務來跑。
代碼如下:
www目錄中
app.js const Koa = require("koa") const morgan = require("koa-morgan") const path = require("path"); const static = require("koa-static") const fs = require("fs") const app = new Koa(); // logger app.use(morgan(":remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms")); // static assets app.use(static(path.join(__dirname,"../build"))); //異步讀取文件的形式 // app.use(async (ctx,next) =>{ // ctx.type = "html"; // ctx.body = await fs.createReadStream(path.resolve(__dirname, "..", "./build", "index.html")); // }) module.exports = app;
index.js "use strict"; const app = require("./app"); const PORT = process.env.PORT || 8801; console.log("client start") app.listen(PORT, () => { console.log(`App listening on port ${PORT}!`); });
這樣通過命令node ./www/index.js能夠監(jiān)聽同級build目錄。
當然這比較粗暴,還需要慢慢改進。
我們需要在client目錄下建立autoClient.sh
#! /bin/bash cd ./ echo "client build" kill -9 $(lsof -i:8801 |awk "{print $2}" | tail -n 2) node ./www/index.js
用來自動執(zhí)行監(jiān)聽動作。
因為多次推送監(jiān)聽的前端端口一致,如果不處理會報錯。需要先根據端口號8801結束進程然后重新開啟服務。
然后是server端,因為整個后端是用koa完成的,項目比較小,在服務端即時編譯花費不了多少時間,因此直接執(zhí)行yarn start( "start": "yarn run build && yarn run watch",)用來編譯和監(jiān)聽。
在server目錄里建立autoServer.sh
#! /bin/bash cd ./ echo "server start" kill -9 $(lsof -i:8866 |awk "{print $2}" | tail -n 2) yarn run start
同樣我們需要在執(zhí)行監(jiān)聽之前結束上一個端口的進程。
然后我們來看clean.sh 這個shell腳本是用來清理client目錄下build文件夾。
#! /bin/bash rm rf ./client/build git reset --hard origin/master git clean -f git pull
可以看到 先清理了緩存然后再向服務器拉取代碼.
最后我們來看部署的腳本deploy/index.js
var spawn = require("child_process").spawn var http = require("http") var spawn = require("child_process").spawn var createHandler = require("github-webhook-handler") var handler = createHandler({ path: "/pushCode", secret: "xxx" }) // 根據git上webhook的配置填寫 http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404; res.end("no such location") }) }).listen(7777) handler.on("error", function (err) { console.error("Error:", err.message) }) // 監(jiān)聽 push 事件 handler.on("push", function (event) { console.log("Received a push event for %s to %s", event.payload.repository.name, event.payload.ref) init() // 每次拉取都重新監(jiān)聽 } ) function rumCommand( cmd, args, cwd, callback ) { var child = spawn( cmd, args, {cwd: cwd} ) var response = "" child.stdout.on("data", function( buffer ){ response += buffer.toString(); }) child.stdout.on("end", function(){ callback( response ) }) } function init() { rumCommand("sh", ["../clean.sh"], "./" ,function( result ) { // 清理緩存 console.log(result) }) rumCommand("sh", ["../server/autoServer.sh"], "../server" ,function( result ) { // cLient端更新 console.log(result) }) rumCommand("sh", ["../client/autoClient.sh"], "../client" ,function( result ) { // server端更新 console.log(result) }) } init() // 腳本運行第一次默認指向一次
這里需要聲明的是因為多目錄下執(zhí)行腳本需要對應的環(huán)境。因此才把腳本都分開放。
部署部署我們只需要對pm2 start deploy/index.js
然后就可以在本地開發(fā)完之后推送,服務器就能自動拉取代碼并且部署。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/107247.html
摘要:自動部署基礎實踐熟悉的基本操作實現本地后自動構建部署服務此實踐用于優(yōu)化自己在實際工作中的工作流在本地開發(fā)到服務器登錄云服務器或者簡化流程后本地開發(fā)云服務器自動構建部署本實踐將結合技術來實現云服務器對各種環(huán)境的切換與部署。 Docker + Jenkins + webhooks 自動部署基礎實踐 熟悉 jenkins 的基本操作 ?? 實現本地 git push 后 jenkins 自...
1.準備環(huán)境 一臺有網絡的Linux 服務器 Docker rpm安裝包,依賴包 libcgroup jdk1.7 OR 1.8環(huán)境下載 Jenkins WAR包下載 NodeJs 源碼包下載 依賴下載地址: https://pkgs.org/download/ https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/ 2.安裝D...
摘要:也許有人看過我之前的一篇博文解決禁止百度爬蟲的方法與可行性分析。為了解決文章中的這個問題,我最后建立了一個只服務于百度爬蟲的一個備份服務器。于是我要完成的事情便是完成一個能夠將我最新版本的博客,隨時同步到備份服務器的。 本文最初發(fā)布于我的個人博客:咀嚼之味 Webhook,也就是人們常說的鉤子,是一個很有用的工具。你可以通過定制 Webhook 來監(jiān)測你在 Github.com 上的各...
摘要:之前雖然了解各種概念,但是自己搗鼓后,才算是真正的理解。只能把文檔渲染成,但是不包括,所以需要配合。這里是啟動腳本,看最后一行,定義了默認啟動腳本。這個腳本負責監(jiān)聽,啟動部署。如何使用這個項目已經放到了和上。 API Blueprint 上次介紹的 API Blueprint 解決方案 雖然不錯,但是有一些問題: 部署麻煩,需要裝不少東西 文檔更新后不支持自動部署 沒有權限控制 以...
摘要:使用自己的服務器部署博客使用搭建個人博客簡單快捷方便,但是在國外啊,網絡極其不穩(wěn)定,訪問速度慢,讓人抓狂,這時可以將自己的博客部署在阿里云的上。 原文發(fā)布于https://www.fangzhipeng.com/life/2018/10/14/how-to-build-blog/ 我從2016年開始寫博客,陸陸續(xù)續(xù)寫了大概兩百篇博客。寫博客有很多好處,其一是它能夠迫使你總結你學習的知...
閱讀 2245·2021-11-17 09:33
閱讀 2786·2021-11-12 10:36
閱讀 3410·2021-09-27 13:47
閱讀 901·2021-09-22 15:10
閱讀 3499·2021-09-09 11:51
閱讀 1405·2021-08-25 09:38
閱讀 2765·2019-08-30 15:55
閱讀 2619·2019-08-30 15:53