跳到主要内容

GitHook

通过GitHubWebHooks功能实现自动化部署

  • 本地打包、推送代码
  • 服务端自动拉取最新代码

服务端

exports.allowReferer=['bolawen.cn','bolawen.com','localhost'];
exports.repositoryList={
Blog:"../Blog",
Assets:"../Assets",
"bolawen.github.io":'../bolawen.github.io',
}
const fs = require("fs");
const Koa = require("koa");
const koaBody = require("koa-body");

const app = new Koa();

app.use(koaBody({ multipart: true }));

const routerList = fs
.readdirSync("./router/")
.map((item) => require("./router/" + item));
routerList.forEach(item=>{
app.use(item.routes());
});

app.listen(4000, function () {
console.log("服务启动成功!");
});
const ora = require("ora");
const path = require("path");
const chalk = require("chalk");
const Router=require('koa-router');
const log=require('../middleware/log');
const process = require("child_process");

const router=new Router({prefix:"/git"});
const { repositoryList } = require("../config");

function Command(msg, cmd, operation, repository) {
const spinner = ora(msg);
spinner.start();
const cwd = { cwd: path.resolve(__dirname,"../"+repository)};
return new Promise((resolve) => {
const compile = process.spawn(cmd, operation, cwd);
compile.stderr.on('data',res=>{
console.log('\t'+res);
});
compile.stdout.on('data',res=>{
console.log('\t'+res);
});
compile.on('exit',(res)=>{
spinner.succeed();
console.log(`${chalk.yellow(msg+"成功!")}`);
msg=='Pull 代码'&&console.log('\n');
msg=='Pull 代码'&&console.log('\n');
resolve(res);
});
compile.on("close", (res) => {
resolve(res);
});
compile.on('error',(res)=>{
resolve(res);
})
});
}

async function CommandGitFetch(repository) {
return await Command(
"Fetch 代码",
"git",
["fetch", "--all"],
repositoryList[repository]
);
}

async function CommandGitReset(repository) {
return await Command(
"Reset 代码",
"git",
["reset", "--hard","origin/master"],
repositoryList[repository]
);
}
async function CommandGitPull(repository) {
return await Command(
"Pull 代码",
"git",
["pull", "origin", "master"],
repositoryList[repository]
);
}

router.get('/gitHook',log,async (ctx)=>{
ctx.body={
code:200,
msg:'更新成功!'
}
});


router.post('/gitHook',log,async (ctx)=>{
const {repository:{name}}=ctx.request.body;
await CommandGitFetch(name)
await CommandGitReset(name);
await CommandGitPull(name);
ctx.body={
code:200,
msg:'更新成功!'
}
});


module.exports=router

配置GitHub

配置Nginx

#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bolawen.com bolawen.cn;
if ($host = 'bolawen.cn'){
rewrite ^/(.*) https://bolawen.cn/$1 permanent;
}
if ($host = 'bolawen.com'){
rewrite ^/(.*) https://bolawen.com/$1 permanent;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}
server {
listen 443 ssl;
server_name bolawen.cn;
ssl_certificate cert/1_bolawen.cn_bundle.crt;
ssl_certificate_key cert/2_bolawen.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
# 静态资源服务
# 访问路径 C:/bolawen/Assets
location ^~ /Assets{
root C:/bolawen/;
valid_referers bolawen.cn localhost;
if ($invalid_referer) {
return 404;
}
}
# 博客访问代理
# 访问路径 C:/bolawen/Blog/docs/
location /Blog {
alias C:/bolawen/Blog/docs/;
index index.html;
}
# server 服务代理
# 代理地址 http://localhost:4000
location /server {
rewrite ^/server/(.*) /$1 break; # 将前端请求地址中的 admin 去除,实际后端没有 admin
proxy_pass http://localhost:4000;

}
}
server {
listen 443 ssl;
server_name bolawen.com;
ssl_certificate cert/1_bolawen.com_bundle.crt;
ssl_certificate_key cert/2_bolawen.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
# 静态资源服务
# 访问路径 C:/bolawen/Assets
location ^~ /Assets{
root C:/bolawen/;
valid_referers bolawen.com localhost;
if ($invalid_referer) {
return 404;
}
}
# 博客访问代理
# 访问路径 C:/bolawen/Blog/docs/
location /Blog {
alias C:/bolawen/Blog/docs/;
index index.html;
}
# server 服务代理
# 代理地址 http://localhost:4000
location /server {
rewrite ^/server/(.*) /$1 break; # 将前端请求地址中的 admin 去除,实际后端没有 admin
proxy_pass http://localhost:4000;

}
}

}