资讯专栏INFORMATION COLUMN

Node + Git + Webhook 自动化部署

JayChen / 513人阅读

摘要:正文准备首先确定需要完成的内容明确需求监听指定提交执行指定多个脚本而且因为我这边是需要分别对和目录分别执行部署命令。部署部署我们只需要对然后就可以在本地开发完之后推送,服务器就能自动拉取代码并且部署。

前言

之前断断续续在重构一个项目,然后发现功能一开始设计太多了,可能需要花大量时间来增加,但是核心功能基本完成,于是想着能不能半上线状态,然后通过更新提交git,让服务器部署自动更新。这之前接触过git hook是可以实现的,因此这里记录一篇文章边捣鼓边写。

正文 准备

首先确定需要完成的内容,明确需求:

1.监听指定 git 提交
2.执行指定多个脚本

而且因为我这边是需要分别对clientserver 目录分别执行部署命令。所以需要特别处理。

首先去域名管理那边增加一条A记录指向新的项目名称.因为Webhooks是需要外网域名的,因此先提前加一条。new.xxx.com

然后就是需要对服务器上Nginx做转发配置。

我的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转发出去。

然后重启一下Nginx nginx -s reload

然后git clone 仓库

因为项目用了mongodb数据库:
需要创建一个对应的数据库并添加权限。

1. 切换数据库到 abc
2. 指定了数据库 abc ,拥有权限: userAdmin
 db.createUser(
   {
     user: "123",
     pwd: "123",
     roles: [ { role: "userAdmin", db: "abc" } ]
   }
 )
 3. 验证下上面创建的账号 123

 db.auth("123","123")
 => 1

配置webhook

这个其实是最简单的,只要在你的github对应的项目仓库右侧选择settings

然后选择webhooks

选择add webhook

然后按照如下配置即可:

这里需要记住你自己设置的secret 以及你定义的推送动作,我这里是pushCode

开始写脚本

写之前先来看下最终的目录结构:

├── README.md
├── clean.sh // 清理缓存,并且执行git命令
├── client
│   ├── autoClient.sh // client端自动监听
│   ├── build
│   ├── config
│   ├── package.json
│   ├── public
│   ├── scripts
│   ├── src
│   ├── tsconfig.json
│   ├── tsconfig.test.json
│   ├── tslint.json
│   ├── www
│   ├── yarn.lock
├── deploy
│   └── index.js // 监听webhook事件然后依次执行 clean.sh autoClient.sh autoServer.sh
├── package.json
├── server
│   ├── autoServer.sh // server端自动监听
│   ├── 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能够监听同级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

用来自动执行监听动作。

因为多次推送监听的前端端口一致,如果不处理会报错。需要先根据端口号8801结束进程然后重新开启服务。

然后是server端,因为整个后端是用koa完成的,项目比较小,在服务端即时编译花费不了多少时间,因此直接执行yarn start( "start": "yarn run build && yarn run watch",)用来编译和监听。

server目录里建立autoServer.sh

#! /bin/bash
cd ./
echo "server start"
kill -9 $(lsof -i:8866 |awk "{print $2}" | tail -n 2) 
yarn run start

同样我们需要在执行监听之前结束上一个端口的进程。

然后我们来看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)
})

// 监听 push 事件
handler.on("push", function (event) {
  console.log("Received a push event for %s to %s",
    event.payload.repository.name,
    event.payload.ref)
    init() // 每次拉取都重新监听
}
)
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() // 脚本运行第一次默认指向一次

这里需要声明的是因为多目录下执行脚本需要对应的环境。因此才把脚本都分开放。

部署

部署我们只需要对pm2 start deploy/index.js

然后就可以在本地开发完之后推送,服务器就能自动拉取代码并且部署。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107247.html

相关文章

  • Docker + Jenkins + webhooks 自动部署基础实践

    摘要:自动部署基础实践熟悉的基本操作实现本地后自动构建部署服务此实践用于优化自己在实际工作中的工作流在本地开发到服务器登录云服务器或者简化流程后本地开发云服务器自动构建部署本实践将结合技术来实现云服务器对各种环境的切换与部署。 Docker + Jenkins + webhooks 自动部署基础实践 熟悉 jenkins 的基本操作 ☑️ 实现本地 git push 后 jenkins 自...

    Charlie_Jade 评论0 收藏0
  • Docker+Jenkins+Nodejs+Git+Webhook自动部署

    1.准备环境 一台有网络的Linux 服务器 Docker rpm安装包,依赖包 libcgroup jdk1.7 OR 1.8环境下载 Jenkins WAR包下载 NodeJs 源码包下载 依赖下载地址: https://pkgs.org/download/ https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/ 2.安装D...

    tuomao 评论0 收藏0
  • Webhook 实践 —— 自动部署

    摘要:也许有人看过我之前的一篇博文解决禁止百度爬虫的方法与可行性分析。为了解决文章中的这个问题,我最后建立了一个只服务于百度爬虫的一个备份服务器。于是我要完成的事情便是完成一个能够将我最新版本的博客,随时同步到备份服务器的。 本文最初发布于我的个人博客:咀嚼之味 Webhook,也就是人们常说的钩子,是一个很有用的工具。你可以通过定制 Webhook 来监测你在 Github.com 上的各...

    Lionad-Morotar 评论0 收藏0
  • API Blueprint Docker

    摘要:之前虽然了解各种概念,但是自己捣鼓后,才算是真正的理解。只能把文档渲染成,但是不包括,所以需要配合。这里是启动脚本,看最后一行,定义了默认启动脚本。这个脚本负责监听,启动部署。如何使用这个项目已经放到了和上。 API Blueprint 上次介绍的 API Blueprint 解决方案 虽然不错,但是有一些问题: 部署麻烦,需要装不少东西 文档更新后不支持自动部署 没有权限控制 以...

    dreamGong 评论0 收藏0
  • 程序员如何搭建自己的个人博客

    摘要:使用自己的服务器部署博客使用搭建个人博客简单快捷方便,但是在国外啊,网络极其不稳定,访问速度慢,让人抓狂,这时可以将自己的博客部署在阿里云的上。 原文发布于https://www.fangzhipeng.com/life/2018/10/14/how-to-build-blog/ 我从2016年开始写博客,陆陆续续写了大概两百篇博客。写博客有很多好处,其一是它能够迫使你总结你学习的知...

    luzhuqun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<