feat: 构建cicd | docke部署 | nginx 配置文件
This commit is contained in:
93
.gitea/workflows/deploy-web.yaml
Normal file
93
.gitea/workflows/deploy-web.yaml
Normal file
@@ -0,0 +1,93 @@
|
||||
name: Web UI CI/CD
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
# 仅当以下文件变动时触发构建,避免改个 README 也重新发版
|
||||
- 'apps/web-antd/**'
|
||||
- 'packages/**'
|
||||
- 'package.json'
|
||||
- 'pnpm-lock.yaml'
|
||||
- 'Dockerfile'
|
||||
- '.gitea/workflows/deploy-web.yaml'
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: xw-runner
|
||||
# 使用包含 Docker 客户端的镜像,这样我们可以在容器内构建镜像 (Docker-in-Docker 模式)
|
||||
container:
|
||||
image: catthehacker/ubuntu:act-latest
|
||||
# 这里的 options 很重要,有时候 Runner 需要特权才能操作宿主机的 Docker
|
||||
# 如果遇到 permission denied,尝试取消注释下一行:
|
||||
# options: --privileged --user root
|
||||
|
||||
steps:
|
||||
# 1. 检出代码
|
||||
- name: Checkout Code
|
||||
run: |
|
||||
# 清理当前目录,防止旧文件干扰
|
||||
ls -A1 | xargs rm -rf
|
||||
|
||||
# 拼接 Clone URL (支持 http 和 https)
|
||||
SERVER_DOMAIN=$(echo "${{ gitea.server_url }}" | sed -E 's|https?://||')
|
||||
PROTO="http"
|
||||
if [[ "${{ gitea.server_url }}" == https* ]]; then PROTO="https"; fi
|
||||
|
||||
# 使用 Gitea Token 进行认证
|
||||
GIT_URL="${PROTO}://${{ gitea.actor }}:${{ gitea.token }}@${SERVER_DOMAIN}/${{ gitea.repository }}.git"
|
||||
|
||||
echo "Cloning..."
|
||||
git clone --depth 1 "$GIT_URL" .
|
||||
git log -1 --format='%h - %s'
|
||||
|
||||
# 2. 准备 Docker 网络
|
||||
# 确保所有服务在同一个网络下,方便互相访问 (e.g. 前端反向代理到后端)
|
||||
- name: Create Docker Network
|
||||
run: |
|
||||
docker network create aiot-net || true
|
||||
|
||||
# 3. 构建并部署
|
||||
- name: Build & Deploy Web UI
|
||||
env:
|
||||
# 镜像名称
|
||||
IMAGE_NAME: 'aiot-web-antd'
|
||||
# 容器名称
|
||||
CONTAINER_NAME: aiot-web-antd
|
||||
# 宿主机端口 (根据 1Panel 规划,这里假设为 8080)
|
||||
HOST_PORT: 8080
|
||||
run: |
|
||||
# --- 构建阶段 ---
|
||||
SHORT_SHA=$(git log -1 --format='%h')
|
||||
FULL_IMAGE_NAME="${IMAGE_NAME}:${SHORT_SHA}"
|
||||
|
||||
echo "Building Docker Image: $FULL_IMAGE_NAME..."
|
||||
|
||||
# 使用根目录的 Dockerfile 进行构建
|
||||
# Dockerfile 内部使用了多阶段构建,不需要 Runner 安装 Node
|
||||
docker build -t "$FULL_IMAGE_NAME" -f Dockerfile .
|
||||
|
||||
# 打上 latest 标签
|
||||
docker tag "$FULL_IMAGE_NAME" "${IMAGE_NAME}:latest"
|
||||
|
||||
# --- 部署阶段 ---
|
||||
echo "Deploying Container: $CONTAINER_NAME..."
|
||||
|
||||
# 停止并删除旧容器
|
||||
docker stop $CONTAINER_NAME || true
|
||||
docker rm $CONTAINER_NAME || true
|
||||
|
||||
# 启动新容器
|
||||
# -d: 后台运行
|
||||
# --restart always: 开机自启
|
||||
# -p: 端口映射 宿主机:容器
|
||||
docker run -d \
|
||||
--name $CONTAINER_NAME \
|
||||
--network aiot-net \
|
||||
--restart always \
|
||||
-p ${HOST_PORT}:80 \
|
||||
"${IMAGE_NAME}:latest"
|
||||
|
||||
echo "✅ Deployment Successful! Access at port ${HOST_PORT}"
|
||||
|
||||
Reference in New Issue
Block a user