从零开始通过webhooks实现前端自动化
1. 前置条件
- 有一台自己的服务器。比如阿里云,腾讯云之类
- 有远程仓库能够push代码,pull代码。比如github,或者码云
- 远程仓库有webhooks功能
2. 自动化部署流程图
3. 构建流程
3-1. 服务器部署git环境
1. 安装git
通过指令yum install git
安装git
安装按完成后可以看到
2. 设置ssh密钥
通过以下指令创建密钥,-C后面的内容,写你的邮箱名字就行
ssh-keygen -t rsa -C "youreamil@163.com"
不需要密码的话,一直回车就行了,然后可以得到两个文件:id_rsa和id_rsa.pub
3. 添加ssh密钥
在github添加密钥
在码云添加密钥
4. 测试密钥添加成功
github通过以下指令测试
ssh -T git@github.com
码云通过以下指令测试
ssh -T git@gitee.com
码云测试通过会显示 success,如下图所示
5. clone远程代码仓库到服务器
接着找到远程仓库代码的ssh地址
这个时候需要建立一个文件夹mkdir web
,然后进入web文件夹中,通过git clone
指令把远程仓库拷贝到服务器的web目录下
git clone git@gitee.com:XXXXXX.git
clone结束后,web文件夹下已经有了你的项目,这里yourprogram就是你的clone下来的项目文件夹,我们通过cd yourprogram
,我们可以看到服务器里面已经有了代码内容
3-2. 服务器部署node环境
1. 安装nvm
在服务器中输入以下两种指令都行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
2. 通过nvm安装node
nvm install v10.20.1
安装完成后,我们通过指令node -v
和 npm -v
确认使用这个版本的node
具体的安装过程可以看我的这篇文章linux服务器通过nvm安装node环境
3. 安装pm2
通过以下指令全局安装pm2
npm install -g pm2
通过pm2 list
查看当前node进程为0
3-3. 创建webhook用服务后端
我们使用 NodeJS 创建 webhook 服务后端,后端代码保存在 webhook文件也就是index.js中,调用 deploy.sh 来发布,因此需要与 deploy.sh 文件在同一级目录中,监听 http://127.0.0.1:6666/webhook:
git_webhook目录结构如下
deploy.sh
node_modules
package.json
index.js
目录结构就是这样
1.初始化node
首先我们通过指令mkdir git_webhook
新建一个文件夹git_webhook,然后通过一下指令初始化node
ps: git_webhook文件夹可以放在/opt目录下
npm init
2. 安装node包
Github webhooks需要跟我们的服务器进行通信,确保是可以推送到我们的服务器,所以会发送一个带有X-Hub-Signature的POST请求,为了方便我们直接用第三方的库github-webhook-handler来接收参数并且做监听事件的处理等工作
npm i -S github-webhook-handler
同上,这个是码云用的,原理一样
npm i —S gitee-webhook-middleware
3. 建立index.js
接下来就是构建起一个能够接收远程仓库post请求的服务,这同样也很简单,我们可以通过上面下载的包github-webhook-handler的帮助,快速建立起这样一个服务
ps: index.js中的secret就是webhooks设置中的key
通过以下指令创建并写入index
vim index.js
我们构建入口文件代码(git用)
var http = require('http');
var spawn = require('child_process').spawn;
// git用
// secret 保持和 GitHub 后台设置的一致
var handler = createHandler({ path: '/webhook', secret: 'webhook' });
var createHandler = require('github-webhook-handler');
// 码云用
// var createHandler = require('gitee-webhook-middleware');
// var handler = createHandler({ path: '/webhook', token: 'webhook' });
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404;
res.end('no such location');
})
}).listen(6666);
console.log('listen at prot 6666')
handler.on('error', function (err) {
console.error('Error:', err.message)
});
// 修改push监听事件,用来启动脚本文件
//git是push ,而码云是Push Hook
handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
runCommand('sh', ['./deploy.sh'], function( txt ){
console.log(txt);
});
});
// 启动脚本文件
function runCommand( cmd, args, callback ){
var child = spawn( cmd, args );
var resp = 'Deploy OK';
child.stdout.on('data', function( buffer ){ resp += buffer.toString(); });
child.stdout.on('end', function(){ callback( resp ) });
}
构建入口文件代码(码云用)
var http = require('http');
var spawn = require('child_process').spawn;
// 码云用
// token 保持和 码云 后台设置的一致
var createHandler = require('gitee-webhook-middleware');
var handler = createHandler({ path: '/webhook', token: 'webhook' });
// git用
// var handler = createHandler({ path: '/webhook', secret: 'webhook' });
// var createHandler = require('github-webhook-handler');
// 上面的 secret 保持和 GitHub 后台设置的一致
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404;
res.end('no such location');
})
}).listen(6666);
console.log('listen at prot 6666')
handler.on('error', function (err) {
console.error('Error:', err.message)
});
// 阅读上面代码,你会发现handler监听到push事件调用对应的函数,所以你要做的就是在函数中执行deploy.sh命令,你需要在index.js添加代码
// 修改push监听事件,用来启动脚本文件
// 码云是Push Hook, 而git是push
handler.on('Push Hook', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
runCommand('sh', ['./deploy.sh'], function( txt ){
console.log(txt);
});
});
// 启动脚本文件
function runCommand( cmd, args, callback ){
var child = spawn( cmd, args );
var resp = 'Deploy OK';
child.stdout.on('data', function( buffer ){ resp += buffer.toString(); });
child.stdout.on('end', function(){ callback( resp ) });
}
3-4. 构建自动化脚本文件
通过指令vim deploy.sh
构建并写入脚本文件,脚本执行命令的主要操作流程为
1.进入服务器git仓库-> 2.pull远程仓库上的代码-> 3.下载新的node包-> 4.编译新的dist包
ps:
1)develop_qa 是本人用来发布代码的分支,这个可以替换成你的分支
2)WEB_PATH是服务器代码仓库的路径,按照我们第一步设置的代码仓库应该在web文件夹下
3)web文件夹我是创建在根目录下的,也就是和/opt,/etc同级
4)yourprogram就是你上面clone的项目地址,这里改成你自己的项目就行
WEB_PATH='/web/yourprogram/'
WEB_USER='root'
WEB_USERGROUP='root'
echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/develop_qa
git clean -f
git pull
git checkout develop_qa
echo "changing permissions..."
npm install
npm run build
echo "build end"
chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
echo "Finished."
3-5. 在远程仓库构建webhooks
1.设置webhooks
在码云上设置
这个时候我们就需要匹配上面node环境配置的内容
在github上设置
同上,github上也需要在webhooks上配置
3-6. 运行node服务,实现自动化
1. 使用pm2开启node服务,并检查是否配置成功
进入git_webhook通过以下指令启动node服务
pm2 start index.js --watch
通过pm2 list
可以查看我们的node服务已经启动了
2. 测试webhooks,查看是否自动部署
这里以码云上为例,点击测试之后,可以看到请求结果是true
测试成功后,我们需要实际提交代码看下
我之前的分支是develop_qa,提交之后可以看到每次push之后,webhooks都会出发一次
3. pm2查看打印日志
我们在.sh脚本,在index.js中打印了很多日志,但是这些日志是看不到的,这个时候可以通过以下指令看到我们的程序执行情况
方法一:
pm2 monit appid
ps: appid就是下图的这个id
然后会出现这样一个界面
当我们提交代码之后,日志就全打印出来了
方法二:
pm2 logs appid
效果同上
4.待优化点
4-1. 查看npm run build的实时日志
如题,如何在linux服务器上实施查看编译日志,上面的方法只能是编译结束后,把日志打印出来,并不能实施看到编译情况,中间等待的时间就比较懵b了,哪位有什么方法可以实时查看
5. 参考资料:
使用 GitHub Webhook 实现静态网站自动化部署
都9012年了,你还在手动部署代码吗
Github Webhook自动发布代码
使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
webhook实现github代码自动部署
使用Github的webhooks进行网站自动化部署
从零开始通过webhooks实现前端自动化的更多相关文章
- gulp前端自动化入门
一.从零开始搭建gulp前端自动化 1.首先安装nodejs 2.npm init 初始化 生成package.json 2.1 可以选装cnpm cnpm是淘宝提供的服务 安装:命令提示符执行npm ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 前端自动化工具gulp自动添加版本号
之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时 ...
- 学习安装并配置前端自动化工具Gulp
Gulp和所有Gulp插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs,安装过程请移驾安装并配置前端自动化工具--grunt.安装完成后,通过运行cmd进入DOS命令窗口,如图: ...
- 前端自动化构建工具gulp的使用总结
前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...
- 前端自动化开发之grunt
上篇文章介绍了前端模块化开发工具seaJs,利用seaJs我们可以轻松实现前端的模块化编程,参见http://www.cnblogs.com/luozhihao/p/4818782.html 那么今天 ...
- 近期总结:generator-web,前端自动化构建的解决方案
本文结合最近的工作经验,总结出一个较简洁的前端自动化构建方案,主张css和js的模块化,并通过grunt的自动化构建,有效地解决css合并,js合并和图片优化等问题,对于提高前端性能和项目代码质量有一 ...
- Grunt安装配置教程:前端自动化工作流
Grunt这货是啥? Grunt 是一个基于任务的 JavaScript 项目命令行构建工具. 最近很火的前端自动化小工具,基于任务的命令行构建工具 http://gruntjs.com Grunt能 ...
- Node.js前端自动化工具:gulp
前端自动化工具 -- gulp 使用简介 gulp是基于流的前端自动化构建工具. 之前也谈到了 grunt的用法,grunt其实就是配置+配置的形式. 而gulp呢,是基于stream流的形式,也就是 ...
随机推荐
- Python设计模式(3)-工厂方法模式
# coding=utf-8 #定义一个用于创建对象的接口,让子类决定实例化哪一个类 class DbManager: def __init__(self): pass def operate_db( ...
- OO第三单元作业分析
一.JML的理论基础应用工具链 JML是用于对Java程序进行规格化设计的一种表示语言.基于Larch方法构建. (1)注释 JML以javadoc注释的方式来表示规格,每行都以@起头.有两种注释方式 ...
- 读写SQL脚本进行创建表、视图和存储过程
一.按照先创建表.视图.存储过程的顺序创建: 二.导出脚本的时候注意:保存为ANSI文本,选项中:if not exists为true,防止覆盖:包含说明性标头为false;use database为 ...
- 负载均衡服务之HAProxy基础入门
首先我们来了解下haproxy是干嘛的?haproxy是一个法国人名叫Willy Tarreau开发的一个开源软件:这款软件主要用于解决客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡 ...
- stand up meeting 1-6
今日更新: 1.修复初始最佳战绩显示bug: 初始为击败全国0% 用户 2.挑战结果界面显示“哎,今天的饭又白吃了,回去多吃两碗###”, 去除API返回string中的“###”. 3.分享模块初 ...
- JS-Array-新增方法
1. filter( ) var arr = [5,4,3,2,1]; newarr = arr.filter((item)=>{ return item<3 }) ; // => ...
- PHP 将字符串转换为字符集格式UTF8/GB2312/GBK 函数iconv()
iconv()介绍 iconv函数可以将一种已知的字符集文件转换成另一种已知的字符集文件 iconv('要转化的格式',‘转化后的格式’,‘转化的数据’); 但是转化是经常出错,一般需要在转成的编码 ...
- redis: Hash集合类型(六)
存值:hset myhash name applesnt 取值:hget myhash name 批量存值:hmset myhash name lisi address bj age 12 批量取值: ...
- Go语言 2019 调查报告发布
Go 官方博客昨日公布了[ 2019 年 Go 语言调查报告].本次调查收到的回复达到 10,975 份,约为去年的两倍. 这些受访者的反馈意见将被选取用于改进 Go 语言的发展. 以下是 2019 ...
- GraphicsLab Project 之 Curl Noise
作者:i_dovelemon 日期:2020-04-25 主题:Perlin Noise, Curl Noise, Finite Difference Method 引言 最近在研究流体效果相关的模拟 ...