技术应用场景

自己有一个小的技术博客,部分代码用github托管, 含有隐私信息的代码采用了ftp上传绕过托管。当然更好的方式是自己搭建一个gitlab服务器。代码部署在自己的服务器上面,每次提交完代码都要去服务器上面更新代码是一件很低效的事。说以想通通过一个性价比很高的方式实现如上需求。

原理

  1. 配置GitHub当push master上代码的时候,访问自己服务器上的一个api(webhooks),假如叫https://xxx.com/api/webhook。
    https://xxx.com/
  2. api里写着这样的逻辑,拉取代码(git fetch), 合并代码(git merge)。 自己玩也就没有做打标签。
  3. 代码拉取,合并完毕,重启服务端的服务,我是用了pm2做进程管理,所以再执行pm2 restart name就好。

原理很简单,就是当向github里push master代码的时候,github调用服务器的api,服务器拉取,合并代码,然后重启网站服务。

github配置

  1. 进入对应的仓库
  2. 点击settings
  3. 点击Webhooks
  4. add webhooks
  5. Payload URL 里添加好我们自己服务器的完整api url。
  6. Which events would you like to trigger this webhook? 选Just the push event.就好。

服务端代码(node.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//这里使用了shelljs模块,实现js和linux的交互。
async function linux(command) {
return await new Promise((resolve, reject) => {
shell.exec(`${command}`, (err, stdout, srderr) => {
if(err) {
reject(srderr);
} else {
resolve(stdout);
}
});
});
}

//......
//怎么实现一个nodejs就不赘述了

// 此处异步改同步后的操作(本api的返回,发送新的请求)都不行。
let fetch = await utils.linux('git fetch origin');
let merge = await utils.linux('git merge origin/master');
let pm2 = await utils.linux('pm2 restart ryansuen.top');
  • 这里我做了当服务器完成代码拉取,合并后就钉钉推送的操作。
  • 但无论我用shelljs的回调还是通过async/await改异步为同步都不行代码都不能正常运行。(想拿到shelljs执行linux命令返回的信息,再钉钉通知,方便知晓是否成功)
  • 这里我做了个调整,api的第一步是做钉钉通知,后面在做拉取,合并操作。
  • 这样操作注意访问线上代码是否生效。

这里我只是满足,我自己的一台服务器的提效需求。而且还有一些安全问题目前还没有进一步完善。哪些问题呢?

  • 如果有多台服务器怎么操作? (发布机)
  • 其他人知道我的跟新api url怎么办?(代码执行用户,文件权限,访问的ip限制)

目前博客主要是满足自己提升需求,遭受攻击的风险还小,未做更多的安全操作。