webhook实现github代码自动部署

如果提交到github的代码能自动部署到服务器上多好?

准备

从github拉代码

1、生成ssh key

ssh-keygen -t rsa
cat .ssh/id_rsa.pub
复制代码

2、添加服务器ssh key:github.com/settings/ke… 3、clone代码仓库

部署

从github拉下代码后,需要做些事更新代码,不同类型的项目可能是完全不一样的。 比如一个webpack项目,可能需要:

  • npm install
  • 构建
  • build产出打包、迁移到server静态资源目录

又比如一个node service,可能需要:

  • npm install
  • 重启应用

自动部署

目的

“要把大象装冰箱,拢共分三步”

要把代码自动部署到服务器,也需要三步: 1、本地 -> github:push 2、github -> server:通知、pull 3、server:构建或重启

这里的关键在2,github到server的通知。

通知-github端:webhook

webhook是github提供的能力,即在仓库发生改变时,向某一server发起请求。 在仓库的setting里,有增加webhook的入口:

配置页面这样:

其中URL即接受通知的server;type选json不然后面会报错;secret可选。

配置好后,如果本地push了代码,github就会向接口发一次请求。此时请求是失败的:

通知-server端

接下来我们需要用node开发一个监听配置端口的app,代码很简单:

const http = require('http')
const spawn = require('child_process').spawn
const createHandler = require('github-webhook-handler')
const handler = createHandler({
  path: '/',
  secret: 'xxx'
})

http.createServer((req, res) => {
  handler(req, res, function(err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(1234)

handler.on('error', err => {
  console.error('Error:', err.message)
})

handler.on('push', e => {
  try {
  const s = spawn('sh', ['./build.sh'], {
    cwd: `../${e.payload.repository.name}`
  })
  s.stdout.on('data', (data) => {
    console.log(`${e.payload.repository.name}: ${data}`);
  })
  s.stderr.on('data', (data) => {
    console.log(`${e.payload.repository.name}: ${data}`);
  });
  console.log(e.payload.repository.name, 'has rebuild');
  } catch (e) {}
})
复制代码

这里几个点:

  • 'github-webhook-handler’ 库:建server很方便。
  • spawn:node端执行跨平台命令,spawn('sh', ['./run.sh'])可以执行run.sh
    • ./build.sh:执行的shell脚本
    • cwd:执行的目录
    • s.stdout:把shell输出打出来
  • payload:github webhook请求过来时带的数据对象,具体格式可以在webhook记录里看到

更新

shell的内容根据项目情况来,比如:

git reset --hard origin/master
git clean -f
git pull
npm install
npm run build

echo ‘build end'
复制代码

试下效果

github webhook记录

node输出

此时刷新页面,代码已经更新了

转载于:https://juejin.im/post/5c346ed251882524ff63e986

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值