GitHub 的网络钩子(webhook)功能,可以很方便的实现自动化部署。本文记录了使用 Node.js 的开发部署过程,当项目的 master 分支被推时,将在服务器进行自动部署,完整代码见 GitHub

添加网络钩子

  1. 在 GitHub 的相应项目首页,点击右上角菜单 Setting, 点击左侧菜单 Webhooks,点击右上角按钮 Add webhook

  2. 设置 Payload URL 为接收事件的地址,Content type 建议选择 applicaiton/jsonSecret 可选填任意字符串,Which events would you like to trigger this webhook? 设为 Just the push event.,勾选 Active,点击下方的 Add webhook 按钮

开发处理请求

接收请求

使用 Node.js 建立一个 http 服务器,接收 POST 请求并处理其提交数据

const { createServer } = require('http');
const port = process.env.GITHUB_WEBHOOK_PORT || '3000';const server = createServer((req, res) => {if('POST' === req.method){let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => {});}
})server.listen(port, () => {console.log(`Listening on ${port}`);
});

如果需要更改默认端口 3000,可以先运行以下命令添加环境变量(NUMBER 为任意端口)

export GITHUB_WEBHOOK_PORT=NUMBER

解析 Body

在 req 的 end 事件处理器中,把字符串 body 解析成对象

    req.on('end', () => {try{body = JSON.parse(decodeURIComponent(body).replace(/^payload=/, ''));}catch(e){console.log(e)}

如果 Content type 设置为 applicaiton/json,只需要 body = JSON.parse(body) 即可,以上代码兼容了 Content type 设置为 application/x-www-form-urlencoded 的情况

拉取更新

根据 body 的 push 负载,提取项目和分支信息,如果是 master 分支,则执行进入对应项目,拉取分支的命令

      if('object' === typeof body){if('refs/heads/master' === body.ref){const { exec } = require('child_process');const command = `cd ../${body.repository.name} && git pull origin master`;exec(command, (error, stdout, stderr) => {});

注意这里的项目所在的目录,与此应用所在的目录,是在同一个父目录下的,如果不是可以相应调整命令的进入路径

验证密钥

以上步骤已经实现了自动拉取更新,不过存在安全性的问题,因为不仅仅 GitHub 可以发送这样的请求,所以最好设置 Secret 以进行安全验证

const secret = process.env.GITHUB_WEBHOOK_SECRET || '';
...req.on('end', () => {if('' !== secret){const { createHmac } = require('crypto');let signature = createHmac('sha1', secret).update(body).digest('hex');if(req.headers['x-hub-signature'] !== `sha1=${signature}`){console.log('Signature Error');res.statusCode = 403;res.end();return;}}

运行应用前,先运行以下命令增加密钥变量(STRING 为任意字符串)

export GITHUB_WEBHOOK_SECRET=STRING

  • 设置了 Secret 后,GitHub 在发送请求时,会在请求头增加 x-hub-signature 为 sha1=SIGNATURE, 其中 SIGNATURE 为 body 的 密钥为 Secret,算法为 sha1 的 HMAC 16 进制值
  • 通过对 Secret 的检验,可以确保只有知道了 Secret,才能发送正确的带 x-hub-signature 头的请求,否则将拒绝请求
  • 以上代码兼容了不设置 Secret 的情况,即如果没有增加变量 GITHUB_WEBHOOK_SECRET,则按原有逻辑处理,不会进行检验

本地钩子构建

如果项目在拉取更新后需要构建,那么可以 command 变量后面加上构建命令,例如 && npm run build,但是不同项目的构建命令有可能是不一样的,而且有的项目的构建命令可能还比较复杂,这些情况下可以通过设置 git 的本地钩子进行处理

cd /PATH/TO/PROJECT/.git/hooks
nano post-merge

#!/bin/sh
SHELL_SCRIPT

chmod +x post-merge

  • 其中 /PATH/TO/PROJECT/ 为项目的目录位置,SHELL_SCRIPT 可以为任意 Shell 脚本
  • 因为 git pull 是 git fetch 和 git merge 的组合,所以拉取更新会触发 post-merge 钩子
  • 默认新增的文件是没有执行权限的,所以需要通过 chmod 增加 x

部署应用上线

应用部署上线需要实现持久化和自动化,即项目应该一直在运行,如果服务器重启,项目应该自动启动

变量自动创建

/etc/profile.d/ 里的变量创建脚本会在服务器重启时自动运行,所以添加一个设置脚本进去

nono /etc/profile.d/github-webhook.sh

export GITHUB_WEBHOOK_PORT=NUMBER
export GITHUB_WEBHOOK_SECRET=STRING

运行以下命令可以使变量创建马上生效

source /etc/profile

pm2 运行应用

pm2 可以确保 Node 应用的持续运行,并可通过配置实现监控和热更新等功能

npm install pm2 -g
pm2 start app.js --name github-webhook

重启自动运行

pm2 还内置支持配置自启动原有应用,通过以下命令实现

pm2 startup
pm2 save

pm2 startup 会创建并开启开机自动运行的服务, pm2 save 会保存当前的 pm2 运行应用,作为重启后的恢复内容

总结

在基于 GitHub webhook 的自动化部署中,主要使用了以下技术:

  • Node.js 的 http,child_process 和 crypto 模块
  • Git 的 post-merge Shell 钩子
  • profile 的自动变量设置和 pm2 工具

利用 Github 网络钩子实现自动化部署相关推荐

  1. Java利用jenkins做项目的自动化部署

    本地的jekins密码 2722e8ea873b4cf08884c22dff732bab 这篇文章主要介绍了Java利用jenkins做项目的自动化部署,小编觉得挺不错的,现在分享给大家,也给大家做个 ...

  2. 如何用Github钩子做自动部署

    最近机缘巧合的购置了域名和服务器,不用实在是浪费,再加上一直没有属于自己的个人网站,所以打算用hexo在服务器上玩一下,这样也就不用再纠结用Github pages还是Gitee pages了.当然, ...

  3. cd返回上一 git_如何使用Git实现自动化部署你的项目

    在开发过程中,我们不可避免的会用到版本控制.你可能对 Git 和 SVN 有所了解.一开始基本都是在用SVN,现在可能都进化到用Git了吧,因为SVN缺点比较多.这里就不过于多的介绍Git的优点了. ...

  4. cd返回上一 git_使用Git实现自动化部署项目

    在开发过程中,我们不可避免的会用到版本控制.你可能对 Git 和 SVN 有所了解.一开始基本都是在用SVN,现在可能都进化到用Git了吧,因为SVN缺点比较多.这里就不过于多的介绍Git的优点了. ...

  5. 大厂是如何用DevCloud流水线实现自动化部署Web应用的?

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

  6. 前端项目中的CI/CD实践(自动化部署)

    前言 前置知识 Linux Docker Nginx Github 可以干嘛 作为一套面向开发和运维团队的解决方案,CI/CD 主要解决集成新代码和向用户频繁交付应用的问题. 更直接地说,就是可以解放 ...

  7. 基于云计算的自动化部署与自动化运维:提高运维效率

    作者:禅与计算机程序设计艺术 1.简介 随着互联网技术的飞速发展,网站流量日益增长,用户对网站功能及其可用性的需求也越来越高,越来越多的人开始担忧网站的安全和稳定性.因此,如何快速.准确地处理网站故障 ...

  8. Hyperledger Fabric网络环境手动配置及其链码自动化部署

    目录 5.1 网络环境的搭建 5.1.1 生成组织结构与身份证书 5.1.2 生成创世区块和通道 5.1.3 启动Fabric网络 5.1.4  创建Fabric-SDK-GO对象并建立通道 5.1. ...

  9. 利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb Galera Cluster

    简介 Chef Chef提供了一套自动化安装和配置软件的工具.它允许开发者以模块化的方式(cookbook)来定义软件的安装和配置流程(recipe),以及流程中的可定制参数(attribute).当 ...

最新文章

  1. servlet程序HTTP Status 500 - Error instantiating servlet class 解决
  2. 敏捷和DevOps:是敌是友?
  3. 2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类
  4. Host is not allowed to connect to this MySQL server解决方法
  5. linux下apk包名查看,使用adb命令查看apk版本
  6. OpenCV解码格雷码模式
  7. 佳能g2810打印机扫描怎么用_佳能Canon PIXMA G2810 驱动
  8. 如何改变WINDOWS服务的启动顺序(Win2000)
  9. php页面能加音乐吗,网页背景音乐的设置方法,兼容所有浏览器
  10. php 通过AES加密/解密 bin2hex/hex2bin转换
  11. 如何将html改成mht格式,如何编辑mht格式的文件,什么是mht?
  12. 模拟爬虫下载QQ空间相册高清图片
  13. win10无法装载重装系统iso文件_Win10系统如何装载和弹出ISO镜像文件?
  14. 偶遇with ties
  15. 一幅长文细学华为MRS大数据开发(一)——大数据时代的挑战和机遇
  16. 《云云众声》第94期:HP网络策略遭质疑 IBM牵手ARM发力物联网
  17. 关于JavaScript中typeof的用法
  18. 浅谈软件可视化分析内存消耗综述中的识别方法
  19. 如何设计手机端banner图【电商小白】
  20. 计算机上的计算器在那里了,电脑上的计算器在哪里打开(电脑快捷调出计算器的方法)...

热门文章

  1. 怎么花140万美元“低价”,喜提300万美元豪宅?
  2. CocosCreator之KUOKUO带你做音乐可视化
  3. x265-1.8版本-common/cudata.h注释
  4. K-means聚类与EM算法
  5. php file取不到手机相册,php file_get_contents 读取不了图片
  6. ROS基础篇(二)-- 基础知识
  7. ssm基于Java web 的人人影视网站管理系统 毕业设计-附源码290915
  8. Flash 应用之我见
  9. 三大运营商体验好又省钱方案
  10. vnc server安装教程,完成vnc server的安装教程只需9步