开发思路: 使用node搭建一个简易http服务,由gitee的webhooks触发并执行shell脚本进行打包,打包http服务及后端nestjs项目使用forever管理进程,前端vue项目使用nginx部署。
一、全局安装node
1、下载node安装包并解压
此处以v16.5.0为例,需要其他版本请前往node官网
sudo wget https://nodejs.org/dist/v16.5.0/node-v16.5.0-linux-x64.tar.gz
sudo tar -xzf node-v16.5.0-linux-x64.tar.gz
2、设置软链
ln -s ~/node-v16.5.0-linux-x64/bin/node /usr/bin/node
ln -s ~/node-v16.5.0-linux-x64/bin/npm /usr/bin/npm
3、测试安装
node -v
npm -v
二、配置Gitee环境
1、全局安装git
yum -y install git
git --version
2、设置全局账号邮箱
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
git config --global --list #查看上面的配置信息
3、生成并复制SSH公钥
ssh-keygen -t rsa -C "你的邮箱"
cat /root/.ssh/id_rsa.pub
4、配置gitee全局SSH密钥
拉取代码时使用SSH链接
git clone SSH
三、安装forever管理node进程
1、npm安装
npm install forever -g
2、设置软链
sudo ln -s ~/node-v16.5.0-linux-x64/bin/forever /usr/bin/forever
3、检查安装及常用命令
forever --version
#启动
forever start index.js
#停止
forever stop index.js
#查看日志
forever logs index.js | index
#重启
forever restart index.js
#查看正在运行的进程
forever list
四、安装nginx
1、安装并设置开机启动
# 安装epel源
yum install epel-release
# 安装nginx
yum install -y nginx
#启动服务
systemctl start nginx.service
#关闭服务
systemctl stop nginx.service
#开机自启
systemctl enable nginx.service
2、配置
# 进入ngixn配置文件
vim /etc/nginx/nginx.conf
# 在http{}修改如下
server {
listen 9001;
server_name localhost:9000; #服务器ip或者域名
# 注意设定 root路径是有dist的
location / {
root /home/web/dist;
index /index.html;
}
#跨域 ip和port自行替换
location /api {
proxy_pass http://localhost:9000/api;
}
}
# 重启nginx
systemctl restart nginx
3、创建打包文件目录
mkdir /home/web
五、编写打包服务
此处我选择将项目上传的gitee,配置开启自启动并更新
1、项目结构
- script // 存放脚本目录
- server_build.sh // 打包服务脚本
- be_build.sh // 后端服务打包脚本
- fe_build.sh // 前端服务打包脚本
- build-server.sh // 开机启动脚本
- webhooks.js // 打包服务
webhooks.js
const PROT = 9999
const WHITE_LIST = ['/webhooks/server', '/webhooks/fe', '/webhooks/be']
const http = require('http')
const { exec } = require('child_process')
const secret = 'e326d252ae9c6e850b0de6f7c9980ed7' // 随机密钥,要和gitee上的对应
const server = http.createServer((req, res) => {
if (req.method === 'POST' && WHITE_LIST.includes(req.url)) {
req.on('data', (body) => {})
req.on('end', () => {
const signature = req.headers['x-gitee-token']
if (signature === secret) {
const shellStr = `sh script/${req.url.split('/')[2]}_build.sh`
exec(shellStr, (err, stdout, stderr) => {
if (err) {
console.error(`exec error: ${err}`)
return
}
console.log(`stdout: ${stdout}`)
if (stderr) {
console.error(`stderr: ${stderr}`)
}
})
res.writeHead(200, { 'Content-Type': 'text/plain' })
res.end('自动打包触发成功~')
} else {
res.writeHead(401, { 'Content-Type': 'text/plain' })
res.end('密钥不正确~')
}
})
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' })
res.end('Not Found')
}
})
server.listen(PROT, () => {
console.log(`打包服务已运行,端口${PROT}`)
})
build-server.sh
#!/bin/bash
# chkconfig: 2345 90 90
# description: build-server ....
# 项目配置
BE_DIR=nest-demo
# 清理日志
forever cleanlogs
# 启动服务
cd ~
cd build-server
git pull
forever start --uid "webhooks" -l webhooks.log -a webhooks.js
# 启动后端项目
cd ~
if [ -d ${BE_DIR} ]; then
cd ${BE_DIR}
forever start --uid "${BE_DIR}" -l ${BE_DIR}.log -a dist/main.js
fi
script/server_build.sh
#!/bin/bash
# 更新
cd ~
cd build-server
git pull
# 重启服务
forever restart --uid "webhooks" -l webhooks.log -a webhooks.js
script/be_build.sh
#!/bin/bash
echo 'Be server start building...'
BE_DIR=nest-demo
# 进入项目目录
cd ~
cd ${BE_DIR} || { echo "进入项目目录失败~"; exit; }
# 停止项目运行
forever stop ${BE_DIR} | true
# 拉取代码
git pull || { echo "git pull 失败~"; exit; }
# 安装依赖
rm -rf package-lock.json
rm -rf /node_modules
npm install || { echo "npm install失败~"; exit; }
# 打包
rm -rf /dist
npm run build || { echo "npm build失败"; exit; }
# 使用forever运行
forever start --uid "${BE_DIR}" -l ${BE_DIR}.log -a dist/main.js || { echo "forever启动失败"; exit; }
echo 'Be server start success~'
script/fe_build.sh
#!/bin/bash
echo 'Fe server start building...'
PROJECT_DIR=vue-demo
NGINX_DIR=/home/web
cd ~
cd ${PROJECT_DIR}
git pull
# 安装依赖
rm -rf node_modules
rm -rf package-lock.json
npm install
# 删除旧包
rm -rf dist
rm -rf dist.tar
rm -rf ${NGINX_DIR}/dist
rm -rf ${NGINX_DIR}/dist.tar
# 打包
npm run build
# 压缩包并复制到nginx目录
tar -cf dist.tar dist
cp dist.tar ${NGINX_DIR}
# 进入nginx目录并解压
cd ~
cd ${NGINX_DIR}
tar -xf dist.tar
2、服务器拉取代码到根目录
git clone ssh...
3、配置gitee WebHooks
配置好url后,将webhooks.js内的密钥粘贴上去,然后保存
本次只使用的简单验证,需要做完全验证的移步 《Gitee WebHooks文档》
4、启动服务测试
cd ~/build-server
forever start --uid "webhooks" -l webhooks.log -a webhooks.js
forever list
5、配置开机自启动
# 拷贝开机脚本到根目录,避免权限修改导致git pull失败,有更新再覆盖即可
cp ~/build-server/build-server.sh ~/
# 进入系统开机文件
vim /etc/rc.d/rc.local
# 在文件内编辑增加
/root/build-server.sh >/tmp/build-server.log
# 设置系统权限
chmod +x /etc/rc.d/rc.local
chmod +x /root/build-server.sh
六、测试环节
1、重启服务器测试开机自启动
启动失败可进入log文件查看
vi /tmp/build-server.log
2、测试后端打包
使用forever logs命令查看日志
3、测试前端打包
前端第一次打包如果失败,全局安装一下 vue @vue/cli
sudo npm i vue @vue/cli -g