我的项目是如何打包上线的
在开始的项目上线采用最原生的 ftp 的形式,前端将将项目压缩成 zip 包上传到服务器,然后解压到指定目录,然后使用 nginx 进行配置,最后将项目上线。
后来觉得这样的形式有点麻烦,不太智能,后期采用 ci/cd 进行项目上线,最常见的就是 jenkins 进行项目上线,jenkins 集成了各种插件,等待项目需要上线的时候,只需要在 jenkins 中触发构建,就可以自动进行项目构建、测试、发布、部署等等。
但是有个问题就是 jenkins
的 docker 容器在服务器上的 cpu 比较高,如何服务器负载过高,那么就会导致 jenkins 的 docker 容器变慢,解决这个问题就很简单,就是将 jenkins 的 docker 容器迁移到其他的服务器上,这样就可以避免服务器负载过高导致 jenkins 的 docker 容器变慢的问题, 在者就是扩容。
不过对我这小用户自己的项目玩玩来讲,没必要非要搞成企业那样的,这样我的钱包也不支持。
于是我将jenkins
容器卸载掉了,该用shell脚本 + 定时任务执行
,我的定时任务是每天凌晨执行一次。当然也可以在服务器上手动执行对应的shell脚本
。
我的项目分为俩种:
- 开源的项目
- 自己私有的项目
不过,每个项目都有Dockerfile
文件。
Dockerfile
# 定义一个通用的构建阶段模板
ARG NODE_VERSION=node:20-alpine
# docker.1ms.run 镜像仓库
FROM docker.1ms.run/library/${NODE_VERSION} AS builder
WORKDIR /opt/apps/app
# 安装基础依赖和构建工具
RUN npm config set registry https://registry.npmmirror.com && npm install -g pnpm
# 拷贝统一构建脚本
COPY ./build.sh ./build.sh
RUN chmod +x ./build.sh
# 构建 web-home, web-home 是我的项目名
FROM builder AS build-web-home
COPY web-home/package.json ./package.json
COPY web-home/pnpm-lock.yaml ./pnpm-lock.yaml
RUN pnpm install
COPY web-home .
RUN sh ./build.sh
# 最终镜像阶段, 我是将所有的前端项目全部放在一起, 例如 /usr/share/nginx/html/test, /usr/share/nginx/html/B 等, 每个目录代表一个项目
FROM docker.1ms.run/library/nginx:alpine
COPY --from=build-web-home /opt/apps/app/dist /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
docker-compose.yml
# version: "3"
services:
# web-apps, 前端项目
web-apps:
build: ./
image: web-apps
ports:
- "8899:80"
restart: unless-stopped
# service-api, 后端项目
service-api:
build: ./service-api
image: service-api
ports:
- "9999:9999"
restart: unless-stopped
服务器的脚本文件
#!/bin/bash
# github url
GITHUB_URL="github.com"
# github token
GITHUB_TOKEN=""
# user name
GITHUB_USER_NAME=""
# 部署容器
NODE_CONTAINER="node_project_container"
# 私人项目
PRIVATE_URL_DIR=""
PRIVATE_URL="https://${GITHUB_TOKEN}@${GITHUB_URL}/${GITHUB_USER_NAME}/${PRIVATE_URL_DIR}.git"
# sim-admin
SIM_ADMIN_DIR=""
SIM_ADMIN_URL="https://${GITHUB_TOKEN}@${GITHUB_URL}/${GITHUB_USER_NAME}/${SIM_ADMIN_DIR}.git"
if [ -d "$PRIVATE_URL_DIR" ]; then
cd "$PRIVATE_URL_DIR"
echo "正在准备更新 ${PRIVATE_URL_DIR} 代码"
if git pull; then
echo "✅ ${PRIVATE_URL_DIR} 代码更新完成"
if [ -d "$SIM_ADMIN_DIR" ]; then
cd "$SIM_ADMIN_DIR"
echo ""
echo "正在准备更新 ${SIM_ADMIN_DIR} 代码"
if git pull; then
echo "✅ ${SIM_ADMIN_DIR} 代码更新完成"
fi
fi
else
echo "❌ ${PRIVATE_URL_DIR} 代码更新失败"
fi
else
echo "开始拉取 ${PRIVATE_URL}"
if git clone "$PRIVATE_URL"; then
echo "✅ git clone ${PRIVATE_URL} 成功"
cd "$PRIVATE_URL_DIR"
if git clone "$SIM_ADMIN_URL"; then
echo "✅ git clone ${SIM_ADMIN_DIR} 成功"
else
echo "❌ git clone ${SIM_ADMIN_DIR} 失败"
exit 1
fi
else
echo "❌ git clone ${PRIVATE_URL} 失败"
exit 1
fi
fi
cd /opt/apps
cd "$PRIVATE_URL_DIR"
# 镜像打包
docker-compose up -d --build
手动执行
想要手动执行,你需要使用ssh username@ip
, 回车之后,你需要输入密码,然后输入cd /opt/apps
(我的脚本文件放在这个目录下),然后执行./xx.sh
,例如图片: