commit cb556f7b6df741e4052c91e18b3b146f70b56655 Author: leiyun Date: Sun Apr 27 15:45:48 2025 +0800 发布脚本 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/app.js b/app.js new file mode 100644 index 0000000..7446477 --- /dev/null +++ b/app.js @@ -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')); \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..9d8fb09 --- /dev/null +++ b/config.js @@ -0,0 +1,20 @@ + +const kezhou = { + dir: "/data/front/git", + ipList: [ + "172.16.0.66", + "172.16.0.67", + "172.16.0.68", + "172.16.0.69", + ] +} +const live = { + dir: "/home/program/front/git", + ipList: [ + "127.0.0.1", + ] +} + + +exports.kezhou = kezhou; +exports.live = live; diff --git a/package.json b/package.json new file mode 100644 index 0000000..9485437 --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "axios": "^1.9.0", + "express": "^5.1.0", + "shelljs": "^0.9.2" + } +} diff --git a/pm2.json b/pm2.json new file mode 100644 index 0000000..5467575 --- /dev/null +++ b/pm2.json @@ -0,0 +1,20 @@ +{ + "apps": [ + { + "name": "publish-web", + "script": "app.js", + "cwd": "/home/program/front/git/publish_web", + "exec_mode": "cluster", + "instances": 1, + "max_memory_restart": "3G", + "autorestart": true, + "node_args": [], + "args": [], + "env": { + + }, + "error_file": "/data/pm2/logs/publish-web-err.log", + "out_file": "/data/pm2/logs/publish-web-out.log" + } + ] +}