webhook-持续集成-自动化部署

661 阅读5分钟

前言

持续集成

持续集成的目的说白了就是已经有了很多正在线上跑了的程序不能每次更新的时候都把服务给关了 然后更新过来,然后再重新起东西来,反正很麻烦。

问题: 

  1. 服务本身质量没法保证
  2. 也很麻烦
  3. 不应该所有人都可以有权限去连服务器传文件改东西等等的

所以webhook主要关注的一个点就是自动化 ** 假设现在git上有两个分支,一个开发分支(develop),一个发步分支(release),平时开发的时候往develop分支随便放,不管,一旦发现release多了一个版本的话,就需要自动的拿过来,并且进行发布。

所以持续集成往简单了说(其实是很大的话题、包括一些自动化测试等等等等一大堆的东西,不过本文主要写的是持续集成简单版的思路和实现)就是一个能够自动化的在你这边项目版本有变化的时候自动部署。

思路:

  1. 监测到新版本(本文章对git做一个例子,因为任何版本控制工具都差不多)

          两种方法

1. 开定时器刷新(每分钟跑一次、手里存一个版本、那边有一个版本)
2. 但是现在主流的服务一般有了另一种方法,比方说github: webhook (说白一点,就是每当发生一些事情的时候,可以触发你的一些钩子,可以主动找咱们写的服务)

3. 拿到最新版本项目 4. git pull 5. 启动起来 6. 完事

像github webhook 或者是一些共网上的服务,必须得调公网服务器,所谓本文例子在公网上实现

一、github创建新项目

这里直接随便建一个空项目就可以了,没什么特别的。

image.png

然后就是直接 git init 项目文件名

image.png

然后就是在这个文件夹下建一个空的index.html 随便写点文字,以便一会看更新效果

image.png

接下来就是很简单了,把文件提到git上,这里不多赘述

image.png

image.png

二、webhook通知项目新版本提交

1.在github上点setting

image.png

2.然后点击这里面的webhook

image.png

3.然后就填写服务器api服务就行了,如果觉得url参数不够可以改成json 这个Secret指不指定都行,这个是可以指定你这个东西必须得是谁调用的,毕竟这是个对外的

image.png

如果指定的服务器接口不存在的话github会给你报一个错,看到之后打开端口重试一下就行了

image.png

三、服务器启动服务

准备: 需要有node环境、并且需要forever包

1  创建hooks目录

mkdir hooks;
cd hooks;

2 因为webhook数据走过来是post,所以为了方便例子就直接用koa了,初始化项目,安装依赖

npm init -y;
npm i koa koa-router koa-better-body -D

就像这样image.png

然后咱们需要一个server 就直接

vim server.js

server.js

const Koa = require('koa');
const Router = require('koa-router');
const body = require('koa-better-body');

let app = new Koa();

app.use(body());

app.use(async ctx=>{
	console.log(url); // 请求url
	console.log(ctx.request.fields); // 携带过来的数据
  
  ctx.body = 'ok';
})

app.listen(8081);

然后 node server.js 的时候会看到一个警告、这个不用管他,如果想解决的话引一个convert进来就行了,主要是koa-better-body报的错

image.png

然后修改之前的index.html 之后 git push后就会看到这样一坨 image.png

这一堆东西里咱们目前只需要版本号也就是before和after 其他信息还有很多,比如这是哪个仓库,所有者是谁,头像是什么等等 吧,有兴趣可以去github上看看具体描述

四、保留版本并且拉取最新项目自动部署

其实现在有了通知之后clone下来项目有两种方法,一种直接用npm包里的git ,这个是可以直接下载的,还有一种就是直接调系统里的git, 服务器提前 yum install git 就可以 我为了方便,直接用第二种了

首先,先在服务器端把项目git clone到本目录下

然后回到 server.js

const Koa = require('koa');
const Router = require('koa-router');
const body = require('koa-better-body');

const ch = require('child_process');

let app = new Koa();

app.use(body());

app.use(async ctx=>{
	//console.log(url); // 请求url
	//console.log(ctx.request.fields); // 携带过来的数据
  
  let worker = ch.spawn('git', [ 'pull' ], {
  	cwd: '/root/hooks/你git下来的项目目录',
    stdio: 'inherit'
  });
  
  worker.on('close', (code)=>{
  	if(code == 0){
    	console.log('pull success!');
    }else {
    	console.log('pull error!');
    }
  })
  
  ctx.body = 'ok';
})

app.listen(8081);

这个时候退出保存,node运行后,修改html提交git就能自动同步了

image.png

接下来,咱们肯定自动部署需要在页面上需要看到功能,如果你的服务器里装了nginx的话,那么可以直接同步到nginx静态文件夹下

whereis nginx 查看nginx位置

whereis nginx;

查看到位置然后查看文件配置

image.png

找到nginx静态文件夹

image.png

然后切换到 html上一层目录 也就是 /usr/share/nginx/ 当然了,真是项目不可能直接把文件堆nginx里,咱们这就是个例子,放哪都一样,单独配个路径就好了 image.png 把git克隆下来并且放到那个html文件夹里

然后把server.js里的路径改到这里就好了~ image.png 像这样。

试验一下

image.png

访问路径,ok没问题

image.png

修改文件日志提交成功

image.png 刷新浏览器,有变化~ ok