- 解析一个域名到服务器,如 hooks.abc.com
- 在hooks站点根目录创建 index.js 用于执行shell脚本,内容如下:
const http = require('http');
const { exec } = require('child_process');
const server = http.createServer((req, res) => {
// 接收get请求参数
const query = req.url.slice(2)
const params = { repo: '', task: '' }
if (query) {
const arr = query.split('&')
arr.forEach(e => {
const item = e.split('=')
params[item[0]] = item[1]
})
}
// 创建命令行
let command = ''
if (params.repo) {
// 进入站点所在目录 并 从仓库中拉取最新代码
command = `cd /data/wwwroot/${params.repo} && git pull`
} else {
res.statusCode = 404
res.end('Not found')
}
// 执行命令
if (command) {
command && exec(command, (error, stdout, stderr) => {
if (error) {
res.statusCode = 400
res.end(`Error: ${error}`)
} else {
res.statusCode = 200
res.end('')
}
})
} else {
res.statusCode = 404
res.end('Are you ok?')
}
})
server.listen(4444, '127.0.0.1')
3、在服务器端安装pm2, 安装完成后,使用pm2启动index.js
pm2 start index.js --name hooks.abc.com
4、设置nginx反向代理
server {
listen 80;
server_name hooks.abc.com;
access_log off;
index index.html index.htm index.php;
root /data/wwwroot/hooks.abc.com;
include /usr/local/nginx/conf/rewrite/none.conf;
#error_page 404 /404.html;
#error_page 502 /502.html;
# nginx反向代理
location / {
expires $expires;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1m;
proxy_connect_timeout 1m;
proxy_pass http://127.0.0.1:4444;
}
}
5、最后,只要在阿里云代码托管服务的webhooks中事件中设置为相应链接即可
如我这里只设置了推送最新代码后服务器自动拉取,所以我设置了发生推送事件后触发链接: http://hooks.abc.com?repo=www.abc.com
这里仅使用了自动拉取,它可以做的其实更多,唯一限制你的只有想象力。
网友评论