ci: 添加 Epic UI 构建和部署工作流

- 新增 CI/CD 工作流文件,实现前端项目的自动构建和部署
- 支持 main、master 和 develop 分支的自动构建- 包含代码检出、环境安装、依赖管理、项目构建等步骤
- 实现构建产物的自动部署和 Docker 容器重启
This commit is contained in:
hu xiaotong
2025-07-08 12:17:57 +08:00
parent e74124e615
commit 6e7e644acf

View File

@@ -12,44 +12,21 @@ jobs:
container: container:
image: gitea-ci-bash:latest image: gitea-ci-bash:latest
env: env:
# 指定容器将工具缓存路径存放到 /opt/hostedtoolcache2该目录是Gitea Runner的标准工具缓存目录 # 指定容器将工具缓存路径存放到 /opt/hostedtoolcache该目录是Gitea Runner的标准工具缓存目录
# RUNNER_TOOL_CACHE: /opt/hostedtoolcache2 RUNNER_TOOL_CACHE: /opt/hostedtoolcache
steps: steps:
- name: 检出代码 - name: 检出代码
shell: bash shell: bash
run: | run: |
echo "📥 检出代码到工作目录..." echo "📥 检出代码到工作目录..."
echo "当前目录: $(pwd)"
echo "仓库: ${{ gitea.repository }}"
echo "分支: ${{ gitea.ref }}"
echo "提交: ${{ gitea.sha }}"
# 解析分支名 # 解析分支名
BRANCH_NAME=$(echo "${{ gitea.ref }}" | sed 's#refs/heads/##') BRANCH_NAME=$(echo "${{ gitea.ref }}" | sed 's#refs/heads/##')
# 拉取代码使用token鉴权 # 拉取代码使用token鉴权
git clone --depth=1 -b "$BRANCH_NAME" "http://1c18ee1ab9a9cb291506d0c5c016a33be7d59e8c:x-oauth-basic@gitea.htoop.cn/${{ gitea.repository }}.git" . git clone --depth=1 -b "$BRANCH_NAME" "http://1c18ee1ab9a9cb291506d0c5c016a33be7d59e8c:x-oauth-basic@gitea.htoop.cn/${{ gitea.repository }}.git" .
if [ $? -ne 0 ]; then
echo "❌ 代码检出失败"
exit 1
fi
# 校验分支 echo "✅ 代码检出成功"
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" != "$BRANCH_NAME" ]; then
echo "❌ 检出分支与预期不符: $CURRENT_BRANCH != $BRANCH_NAME"
exit 1
fi
# 校验提交
CURRENT_COMMIT=$(git rev-parse HEAD)
if [ -n "${{ gitea.sha }}" ] && [ "$CURRENT_COMMIT" != "${{ gitea.sha }}" ]; then
echo "❌ 检出提交与预期不符: $CURRENT_COMMIT != ${{ gitea.sha }}"
exit 1
fi
echo "✅ 代码检出成功,分支和提交校验通过"
ls -la
- name: 安装Node.js环境 - name: 安装Node.js环境
shell: bash shell: bash
@@ -57,7 +34,6 @@ jobs:
echo "🔧 安装Node.js环境..." echo "🔧 安装Node.js环境..."
if command -v node &> /dev/null; then if command -v node &> /dev/null; then
echo "✅ Node.js已安装: $(node --version)" echo "✅ Node.js已安装: $(node --version)"
echo "✅ npm已安装: $(npm --version)"
else else
echo "📥 下载并安装Node.js..." echo "📥 下载并安装Node.js..."
NODE_VERSION="18.19.0" NODE_VERSION="18.19.0"
@@ -85,22 +61,25 @@ jobs:
echo "解压Node.js到/usr/local..." echo "解压Node.js到/usr/local..."
tar -C /usr/local -xJf node.tar.xz --strip-components=1 tar -C /usr/local -xJf node.tar.xz --strip-components=1
export PATH=$PATH:/usr/local/bin export PATH=$PATH:/usr/local/bin
echo "验证Node.js安装..."
node --version
npm --version
rm node.tar.xz rm node.tar.xz
echo "✅ Node.js安装完成" echo "✅ Node.js安装完成"
fi fi
- name: 检查Node.js环境 - name: 恢复pnpm缓存
shell: bash shell: bash
run: | run: |
echo "🔍 检查Node.js环境..." echo "📦 恢复pnpm缓存..."
export PATH=$PATH:/usr/local/bin export PATH=$PATH:/usr/local/bin
node --version
npm --version # 配置pnpm缓存目录
echo "Node.js路径: $(which node)" PNPM_CACHE_DIR="/opt/hostedtoolcache/pnpm-store"
echo "npm路径: $(which npm)" mkdir -p "$PNPM_CACHE_DIR"
# 设置pnpm使用缓存目录
pnpm config set store-dir "$PNPM_CACHE_DIR"
pnpm config set cache-dir "/opt/hostedtoolcache/pnpm-cache"
echo "✅ pnpm缓存配置完成"
- name: 安装pnpm - name: 安装pnpm
shell: bash shell: bash
@@ -115,86 +94,23 @@ jobs:
echo "✅ pnpm安装完成: $(pnpm --version)" echo "✅ pnpm安装完成: $(pnpm --version)"
fi fi
- name: 检查缓存目录权限
shell: bash
run: |
echo "🔍 检查缓存目录权限和状态..."
echo "=== /opt/hostedtoolcache2 目录检查 ==="
ls -la /opt/hostedtoolcache2/ 2>/dev/null || echo "/opt/hostedtoolcache2 目录不存在或无法访问"
echo "=== /shared/cache 目录检查 ==="
ls -la /shared/cache/ 2>/dev/null || echo "/shared/cache 目录不存在或无法访问"
echo "=== /tmp 目录检查 ==="
ls -la /tmp/ | head -10
echo "=== 当前工作目录 ==="
pwd
ls -la
- name: 配置hostedtoolcache缓存目录
shell: bash
run: |
echo "🔧 配置 /opt/hostedtoolcache2 缓存目录..."
# 检查 /opt/hostedtoolcache2 目录
if [ ! -d "/opt/hostedtoolcache2" ]; then
echo "📁 /opt/hostedtoolcache2 目录不存在,尝试创建..."
if mkdir -p "/opt/hostedtoolcache2" 2>/dev/null; then
echo "✅ /opt/hostedtoolcache2 目录创建成功"
else
echo "❌ /opt/hostedtoolcache2 目录创建失败"
exit 1
fi
fi
# 检查目录权限
if [ -w "/opt/hostedtoolcache2" ]; then
echo "✅ /opt/hostedtoolcache2 目录可写"
# 设置权限
chmod 755 "/opt/hostedtoolcache2" 2>/dev/null || echo "⚠️ 无法设置权限"
# 创建测试文件
TEST_FILE="/opt/hostedtoolcache2/test_write_$(date +%s)"
if touch "$TEST_FILE" 2>/dev/null; then
echo "✅ /opt/hostedtoolcache2 写入测试成功"
rm -f "$TEST_FILE"
echo "CACHE_DIR=/opt/hostedtoolcache2" >> $GITHUB_ENV
else
echo "❌ /opt/hostedtoolcache2 写入测试失败"
exit 1
fi
else
echo "❌ /opt/hostedtoolcache2 目录不可写"
echo "🔧 尝试修改目录权限..."
chmod 755 "/opt/hostedtoolcache2" 2>/dev/null || echo "⚠️ 无法修改权限"
if [ -w "/opt/hostedtoolcache2" ]; then
echo "✅ 权限修改成功"
echo "CACHE_DIR=/opt/hostedtoolcache2" >> $GITHUB_ENV
else
echo "❌ 无法获得 /opt/hostedtoolcache2 写入权限"
exit 1
fi
fi
echo "📊 缓存目录配置: /opt/hostedtoolcache2"
echo "📁 目录内容:"
ls -la /opt/hostedtoolcache2/ 2>/dev/null || echo "目录为空或无法访问"
- name: 恢复依赖缓存 - name: 恢复依赖缓存
shell: bash shell: bash
run: | run: |
echo "📦 检查并恢复依赖缓存..." echo "📦 检查并恢复依赖缓存..."
export PATH=$PATH:/usr/local/bin
# 生成缓存键 # 生成缓存键
CACHE_KEY=$(md5sum pnpm-lock.yaml | cut -d' ' -f1) CACHE_KEY=$(md5sum pnpm-lock.yaml | cut -d' ' -f1)
echo "缓存键: $CACHE_KEY" echo "缓存键: $CACHE_KEY"
# 使用 /opt/hostedtoolcache2 目录 # 使用 /opt/hostedtoolcache 目录
CACHE_FILE="/opt/hostedtoolcache2/node_modules_${CACHE_KEY}.tar.gz" CACHE_FILE="/opt/hostedtoolcache/node_modules_${CACHE_KEY}.tar.gz"
echo "📁 检查缓存文件: $CACHE_FILE" echo "📁 检查缓存文件: $CACHE_FILE"
if [ -f "$CACHE_FILE" ]; then if [ -f "$CACHE_FILE" ]; then
echo "✅ 找到缓存文件: $CACHE_FILE" echo "✅ 找到缓存文件: $CACHE_FILE"
echo "📦 缓存文件大小: $(du -sh "$CACHE_FILE" | cut -f1)" echo "📦 缓存文件大小: $(du -sh "$CACHE_FILE" | cut -f1)"
echo "📅 缓存文件修改时间: $(stat -c %y "$CACHE_FILE")"
echo "正在恢复缓存..." echo "正在恢复缓存..."
if tar -xzf "$CACHE_FILE"; then if tar -xzf "$CACHE_FILE"; then
@@ -209,51 +125,26 @@ jobs:
echo "📥 未找到缓存文件,将重新安装依赖" echo "📥 未找到缓存文件,将重新安装依赖"
fi fi
- name: 创建测试数据 - name: 安装项目依赖
shell: bash shell: bash
run: | run: |
echo "📦 创建测试数据模拟node_modules..." echo "📦 安装项目依赖..."
export PATH=$PATH:/usr/local/bin export PATH=$PATH:/usr/local/bin
echo "开始时间: $(date)"
# 检查是否已有测试数据 # 检查是否已有node_modules
if [ -d "node_modules" ]; then if [ -d "node_modules" ] && [ -f "node_modules/.pnpm-debug.log" ]; then
echo "✅ 检测到已存在的测试数据,跳过创建" echo "✅ 检测到已存在的依赖,跳过安装"
else else
echo "📥 创建模拟的node_modules目录..." echo "📥 安装项目依赖..."
mkdir -p node_modules pnpm install --frozen-lockfile --prefer-offline
echo "✅ 依赖安装完成"
# 创建一些模拟的包目录
PACKAGES=("react" "vue" "angular" "typescript" "webpack" "vite" "eslint" "prettier")
for pkg in "${PACKAGES[@]}"; do
mkdir -p "node_modules/$pkg"
echo "{\"name\":\"$pkg\",\"version\":\"1.0.0\",\"description\":\"Test package $pkg\"}" > "node_modules/$pkg/package.json"
echo "// Test file for $pkg" > "node_modules/$pkg/index.js"
echo "export default '$pkg';" > "node_modules/$pkg/index.ts"
done
# 创建一些模拟的配置文件
echo "{\"name\":\"epic-ui\",\"version\":\"1.0.0\"}" > "node_modules/package.json"
echo "test" > "node_modules/.pnpm-debug.log"
# 创建一些大文件来模拟真实的node_modules大小
echo "📦 创建大文件模拟真实依赖大小..."
dd if=/dev/zero of="node_modules/large_file_1.bin" bs=1M count=10 2>/dev/null || echo "创建大文件1完成"
dd if=/dev/zero of="node_modules/large_file_2.bin" bs=1M count=15 2>/dev/null || echo "创建大文件2完成"
dd if=/dev/zero of="node_modules/large_file_3.bin" bs=1M count=20 2>/dev/null || echo "创建大文件3完成"
echo "✅ 测试数据创建完成"
fi fi
echo "📦 node_modules 目录大小:"
du -sh node_modules 2>/dev/null || echo "node_modules 目录不存在"
echo "📁 node_modules 目录内容:"
ls -la node_modules/ | head -10
- name: 保存依赖缓存 - name: 保存依赖缓存
shell: bash shell: bash
run: | run: |
echo "💾 保存依赖缓存..." echo "💾 保存依赖缓存..."
export PATH=$PATH:/usr/local/bin
# 生成缓存键 # 生成缓存键
CACHE_KEY=$(md5sum pnpm-lock.yaml | cut -d' ' -f1) CACHE_KEY=$(md5sum pnpm-lock.yaml | cut -d' ' -f1)
@@ -265,117 +156,28 @@ jobs:
exit 0 exit 0
fi fi
# 保存到 /opt/hostedtoolcache2 目录 # 保存到 /opt/hostedtoolcache 目录
CACHE_FILE="/opt/hostedtoolcache2/node_modules_${CACHE_KEY}.tar.gz" CACHE_FILE="/opt/hostedtoolcache/node_modules_${CACHE_KEY}.tar.gz"
echo "📦 正在创建缓存文件: $CACHE_FILE" echo "📦 正在创建缓存文件: $CACHE_FILE"
if tar -czf "$CACHE_FILE" node_modules; then if tar -czf "$CACHE_FILE" node_modules; then
echo "✅ 缓存已保存到: $CACHE_FILE" echo "✅ 缓存已保存到: $CACHE_FILE"
echo "📦 缓存文件大小: $(du -sh "$CACHE_FILE" | cut -f1)" echo "📦 缓存文件大小: $(du -sh "$CACHE_FILE" | cut -f1)"
echo "📅 缓存文件创建时间: $(stat -c %y "$CACHE_FILE")"
# 显示缓存目录内容
echo "🔍 /opt/hostedtoolcache2 目录内容:"
ls -la /opt/hostedtoolcache2/ | head -10
# 创建测试文件验证写入权限
echo "🧪 创建测试文件验证写入权限..."
TEST_FILE="/opt/hostedtoolcache2/test_file_$(date +%s).txt"
echo "测试时间: $(date)" > "$TEST_FILE"
if [ -f "$TEST_FILE" ]; then
echo "✅ 测试文件创建成功: $TEST_FILE"
echo "📄 测试文件内容: $(cat "$TEST_FILE")"
else
echo "❌ 测试文件创建失败"
fi
else else
echo "❌ 缓存保存失败" echo "❌ 缓存保存失败"
exit 1 exit 1
fi fi
echo "⏰ 等待1分钟让你检查缓存是否成功写入..." - name: 构建项目
echo "🕐 当前时间: $(date)"
echo "📊 缓存状态检查:"
# 添加详细的诊断信息
echo "🔍 系统诊断信息:"
echo "容器ID: $(cat /proc/self/cgroup | grep docker | head -1 | cut -d'/' -f3 || echo '无法获取容器ID')"
echo "当前用户: $(whoami)"
echo "用户ID: $(id)"
echo "工作目录: $(pwd)"
echo "挂载点信息:"
mount | grep hostedtoolcache || echo "未找到hostedtoolcache挂载点"
echo "磁盘使用情况:"
df -h /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2磁盘信息"
echo "---"
# 每5秒检查一次缓存状态持续60秒
for i in {1..1}; do
echo "=== 第 $i 次检查 (第 $((i*5)) 秒) ==="
echo "时间: $(date)"
echo "📁 /opt/hostedtoolcache2 目录详细信息:"
echo "目录权限: $(ls -ld /opt/hostedtoolcache2 2>/dev/null || echo '无法获取权限')"
echo "目录所有者: $(stat -c '%U:%G' /opt/hostedtoolcache2 2>/dev/null || echo '无法获取所有者')"
echo "目录内容:"
ls -la /opt/hostedtoolcache2/ 2>/dev/null | head -10 || echo "无法访问 /opt/hostedtoolcache2"
if [ -f "$CACHE_FILE" ]; then
echo "✅ 缓存文件存在: $CACHE_FILE"
echo "📦 文件大小: $(du -sh "$CACHE_FILE" 2>/dev/null | cut -f1 || echo '无法获取大小')"
echo "📅 修改时间: $(stat -c %y "$CACHE_FILE" 2>/dev/null || echo '无法获取时间')"
echo "文件权限: $(ls -l "$CACHE_FILE" 2>/dev/null || echo '无法获取权限')"
echo "文件所有者: $(stat -c '%U:%G' "$CACHE_FILE" 2>/dev/null || echo '无法获取所有者')"
else
echo "❌ 缓存文件不存在: $CACHE_FILE"
fi
echo "---"
if [ $i -lt 12 ]; then
echo "⏳ 等待5秒..."
sleep 5
fi
done
echo "✅ 1分钟等待完成缓存检查结束"
echo "🕐 结束时间: $(date)"
- name: 验证测试数据
shell: bash shell: bash
run: | run: |
echo "🔍 验证测试数据..." echo "🔨 构建 Epic UI 前端项目..."
export PATH=$PATH:/usr/local/bin export PATH=$PATH:/usr/local/bin
if [ -d "node_modules" ]; then # 执行构建
echo "✅ node_modules 目录存在" pnpm build
echo "📦 目录大小: $(du -sh node_modules | cut -f1)"
echo "📁 包含的包:"
ls -la node_modules/ | grep "^d" | head -5
echo "📄 模拟包数量: $(find node_modules -maxdepth 1 -type d | wc -l)"
else
echo "❌ node_modules 目录不存在"
fi
echo "✅ 测试数据验证完成" echo "✅ 构建完成"
- name: 模拟构建项目
shell: bash
run: |
echo "🔨 模拟构建 Epic UI 前端项目..."
export PATH=$PATH:/usr/local/bin
# 创建模拟的构建产物
mkdir -p dist
echo "<!DOCTYPE html><html><head><title>Epic UI</title></head><body><h1>Epic UI - 构建成功</h1></body></html>" > dist/index.html
echo "body { font-family: Arial, sans-serif; }" > dist/style.css
echo "console.log('Epic UI loaded');" > dist/app.js
# 创建一些模拟的构建文件
mkdir -p dist/assets
echo "// 模拟的构建产物" > dist/assets/bundle.js
echo "/* 模拟的样式文件 */" > dist/assets/bundle.css
echo "✅ 模拟构建完成"
- name: 检查构建产物 - name: 检查构建产物
shell: bash shell: bash
@@ -401,83 +203,3 @@ jobs:
echo "构建时间: $(date)" echo "构建时间: $(date)"
echo "分支: ${{ gitea.ref }}" echo "分支: ${{ gitea.ref }}"
echo "提交: ${{ gitea.sha }}" echo "提交: ${{ gitea.sha }}"
- name: 准备部署
shell: bash
run: |
echo "🚀 准备部署..."
echo "运行器操作系统: ${{ runner.os }}"
echo "工作目录: ${{ gitea.workspace }}"
echo "任务状态: ${{ job.status }}"
mkdir -p deploy
cp -r dist/* deploy/
echo "📦 部署包已准备完成"
- name: 验证 /opt/hostedtoolcache2 挂载情况(开始)
shell: bash
run: |
echo "==== [挂载点检查-开始] ===="
echo "当前时间: $(date)"
echo "主机名: $(hostname)"
echo "当前用户: $(whoami)"
echo "工作目录: $(pwd)"
echo "[mount | grep hostedtoolcache] 输出:"
mount | grep hostedtoolcache || echo "未找到hostedtoolcache挂载点"
echo "[df -h /opt/hostedtoolcache2] 输出:"
df -h /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2磁盘信息"
echo "[ls -ld /opt/hostedtoolcache2] 输出:"
ls -ld /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2权限"
echo "[stat /opt/hostedtoolcache2] 输出:"
stat /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2 stat"
echo "[ls -lai /opt/hostedtoolcache2] 输出:"
ls -lai /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2内容"
echo "==== [挂载点检查-开始] ===="
- name: 验证 /opt/hostedtoolcache2 挂载情况(保存缓存后)
shell: bash
run: |
echo "==== [挂载点检查-保存缓存后] ===="
echo "当前时间: $(date)"
echo "主机名: $(hostname)"
echo "当前用户: $(whoami)"
echo "工作目录: $(pwd)"
echo "[mount | grep hostedtoolcache] 输出:"
mount | grep hostedtoolcache || echo "未找到hostedtoolcache挂载点"
echo "[df -h /opt/hostedtoolcache2] 输出:"
df -h /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2磁盘信息"
echo "[ls -ld /opt/hostedtoolcache2] 输出:"
ls -ld /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2权限"
echo "[stat /opt/hostedtoolcache2] 输出:"
stat /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2 stat"
echo "[ls -lai /opt/hostedtoolcache2] 输出:"
ls -lai /opt/hostedtoolcache2 2>/dev/null || echo "无法获取/opt/hostedtoolcache2内容"
echo "==== [挂载点检查-保存缓存后] ===="
# - name: 复制构建产物到目标目录
# shell: bash
# run: |
# echo "📤 复制构建产物到 /opt/dockeropt/epic-ui ..."
# mkdir -p /opt/dockeropt/epic-ui
# cp -r dist/* /opt/dockeropt/epic-ui/
# echo "✅ 构建产物已复制到 /opt/dockeropt/epic-ui"
# ls -la /opt/dockeropt/epic-ui/
# - name: 重启 Docker 容器
# shell: bash
# run: |
# echo "♻️ 重启 epic-ui 容器..."
# if ! command -v docker &> /dev/null; then
# if command -v apt-get &> /dev/null; then
# apt-get update && apt-get install -y docker.io
# elif command -v apk &> /dev/null; then
# echo "http://mirrors.aliyun.com/alpine/v3.20/main" > /etc/apk/repositories
# echo "http://mirrors.aliyun.com/alpine/v3.20/community" >> /etc/apk/repositories
# apk update
# apk add --no-cache docker-cli
# elif command -v yum &> /dev/null; then
# yum install -y docker
# fi
# fi
# docker ps -a
# docker restart epic-ui
# echo "✅ epic-ui 容器已重启"