|
|
@@ -0,0 +1,66 @@ |
|
|
|
|
|
const { log } = require('console'); |
|
|
|
|
|
const express = require('express'); |
|
|
|
|
|
const axios = require('axios'); |
|
|
|
|
|
const shell = require('shelljs'); |
|
|
|
|
|
const app = express(); |
|
|
|
|
|
const config = require('./config'); |
|
|
|
|
|
app.use(express.json()); |
|
|
|
|
|
|
|
|
|
|
|
// 身份验证中间件 |
|
|
|
|
|
const authMiddleware = (req, res, next) => { |
|
|
|
|
|
// const token = req.headers['x-api-key']; |
|
|
|
|
|
// if (token !== process.env.API_KEY) { |
|
|
|
|
|
// return res.status(403).json({ error: '未授权访问' }); |
|
|
|
|
|
// } |
|
|
|
|
|
next(); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// 部署接口 |
|
|
|
|
|
app.get('/api/doDeploy', authMiddleware, (req, res) => { |
|
|
|
|
|
let project = req.query.project; |
|
|
|
|
|
let env = req.query.env; |
|
|
|
|
|
const dir = config[env].dir; |
|
|
|
|
|
let cmd = `cd ${dir}/${project} && sh restart.sh ${project}`; |
|
|
|
|
|
const child = shell.exec(cmd, { async: true, silent: false }); |
|
|
|
|
|
child.stdout.on('data', (data) => { |
|
|
|
|
|
// 实时推送日志(需配合 WebSocket 或 SSE) |
|
|
|
|
|
// console.log(`实时输出: ${data}`); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
child.on('close', (code) => { |
|
|
|
|
|
console.log(`执行结束: ${code}`); |
|
|
|
|
|
}); |
|
|
|
|
|
res.json({ code: 0, msg: "执行中" }); |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
// 部署接口 |
|
|
|
|
|
app.get('/api/deploy', authMiddleware, async (req, res) => { |
|
|
|
|
|
let query = req.query; |
|
|
|
|
|
console.log('query', query); |
|
|
|
|
|
//从query字符串中获取project参数 |
|
|
|
|
|
let project = query.project; |
|
|
|
|
|
let env = query.env; |
|
|
|
|
|
console.log("project", project, ",env", env); |
|
|
|
|
|
if (!project) { |
|
|
|
|
|
return res.status(200).json({ code: 1, msg: 'project项目参数错误' }); |
|
|
|
|
|
} |
|
|
|
|
|
if (!env) { |
|
|
|
|
|
return res.status(200).json({ code: 1, msg: 'env项目参数错误' }); |
|
|
|
|
|
} |
|
|
|
|
|
const dir = config[env].dir; |
|
|
|
|
|
const ipList = config[env].ipList; |
|
|
|
|
|
//发起http请求 |
|
|
|
|
|
try { |
|
|
|
|
|
let promiseAll = []; |
|
|
|
|
|
for (let ip of ipList) { |
|
|
|
|
|
promiseAll.push(axios.get(`http://${ip}:7015/api/doDeploy?project=${project}&env=${env}`)); |
|
|
|
|
|
} |
|
|
|
|
|
let result = await Promise.all(promiseAll); |
|
|
|
|
|
return res.json({ code: 0, msg: `${project}部署中` });; // 将第三方 API 数据返回客户端 |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
log(error); |
|
|
|
|
|
return res.status(500).json({ error: '请求失败' }); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
app.listen(7015, () => console.log('服务运行中: http://localhost:7015')); |