fscan/.github/workflows/test-build.yml
2025-07-17 22:36:51 +08:00

390 lines
18 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: 测试构建
on:
push:
branches:
- dev
- develop
- feature/*
pull_request:
branches:
- main
- master
- dev
workflow_dispatch:
inputs:
branch:
description: '测试分支'
required: false
default: 'dev'
permissions:
contents: read
jobs:
test-build:
name: 测试构建
runs-on: ubuntu-latest
timeout-minutes: 30
# 设置作业级别的环境变量
env:
GITHUB_OWNER: ${{ github.repository_owner }}
GITHUB_REPO: ${{ github.event.repository.name }}
PROJECT_NAME: ${{ github.event.repository.name }}
steps:
- name: 📥 检出代码
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.inputs.branch || github.ref }}
- name: 🔍 获取项目信息
id: project
run: |
echo "owner=${GITHUB_REPOSITORY_OWNER}" >> $GITHUB_OUTPUT
echo "repo=${GITHUB_REPOSITORY#*/}" >> $GITHUB_OUTPUT
echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
echo "short_sha=${GITHUB_SHA:0:7}" >> $GITHUB_OUTPUT
echo "full_sha=${GITHUB_SHA}" >> $GITHUB_OUTPUT
echo "build_date=$(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> $GITHUB_OUTPUT
echo "timestamp=$(date +%s)" >> $GITHUB_OUTPUT
- name: 🐹 设置 Go 环境
uses: actions/setup-go@v5
with:
go-version: '1.21'
cache: true
- name: 📦 下载依赖
run: |
go mod download
go mod verify
- name: 🗜️ 安装 UPX 压缩工具
uses: crazy-max/ghaction-upx@v3
with:
install-only: true
- name: 显示构建环境信息
run: |
echo "Go 版本: $(go version)"
echo "UPX 版本: $(upx --version)"
echo "分支: ${{ steps.project.outputs.branch }}"
echo "提交: ${{ steps.project.outputs.short_sha }}"
echo "仓库: ${{ steps.project.outputs.owner }}/${{ steps.project.outputs.repo }}"
echo "构建时间: ${{ steps.project.outputs.build_date }}"
echo "环境变量:"
echo "- GITHUB_OWNER: $GITHUB_OWNER"
echo "- GITHUB_REPO: $GITHUB_REPO"
echo "- PROJECT_NAME: $PROJECT_NAME"
- name: 📊 记录构建开始时间
id: build_start
run: |
echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT
echo "start_readable=$(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> $GITHUB_OUTPUT
- name: 🚀 测试构建 (Snapshot 模式)
uses: goreleaser/goreleaser-action@v5
with:
distribution: goreleaser
version: latest
args: release --snapshot --clean -f .github/conf/.goreleaser.yml
workdir: .
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: 📊 记录构建结束时间
id: build_end
run: |
echo "end_time=$(date +%s)" >> $GITHUB_OUTPUT
echo "end_readable=$(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> $GITHUB_OUTPUT
start_time=${{ steps.build_start.outputs.start_time }}
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "duration=${duration}" >> $GITHUB_OUTPUT
echo "duration_readable=$(printf '%02d:%02d:%02d' $((duration/3600)) $((duration%3600/60)) $((duration%60)))" >> $GITHUB_OUTPUT
- name: 📋 上传测试产物
uses: actions/upload-artifact@v4
with:
name: 测试构建-${{ steps.project.outputs.branch }}-${{ steps.project.outputs.short_sha }}
path: |
dist/
retention-days: 7
- name: 🧪 测试生成的二进制文件
id: binary_test
run: |
echo "## 🧪 测试二进制文件" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
binary_count=0
tested_count=0
passed_count=0
failed_count=0
echo "| 文件名 | 架构 | 大小 | 压缩 | 运行测试 |" >> $GITHUB_STEP_SUMMARY
echo "|--------|------|------|------|----------|" >> $GITHUB_STEP_SUMMARY
for binary in dist/*/*; do
if [[ -f "$binary" && -x "$binary" ]]; then
binary_count=$((binary_count + 1))
filename=$(basename "$binary")
# 获取文件信息
file_info=$(file "$binary")
size=$(ls -lh "$binary" | awk '{print $5}')
# 检测架构
if [[ "$file_info" == *"x86-64"* ]]; then
arch="amd64"
elif [[ "$file_info" == *"ARM"* ]]; then
arch="arm64"
elif [[ "$file_info" == *"386"* ]]; then
arch="386"
else
arch="unknown"
fi
# 检测是否压缩
if [[ "$file_info" == *"UPX"* ]]; then
compressed="✅ UPX"
else
compressed="❌ 未压缩"
fi
# 运行测试仅对Linux AMD64版本
if [[ "$binary" == *"linux"* && "$arch" == "amd64" ]]; then
tested_count=$((tested_count + 1))
if timeout 10s "$binary" --help > /dev/null 2>&1; then
test_result="✅ 通过"
passed_count=$((passed_count + 1))
else
test_result="❌ 失败"
failed_count=$((failed_count + 1))
fi
else
test_result=" 跳过"
fi
echo "| $filename | $arch | $size | $compressed | $test_result |" >> $GITHUB_STEP_SUMMARY
fi
done
echo "" >> $GITHUB_STEP_SUMMARY
echo "**测试统计**: 总计 $binary_count 个文件,测试 $tested_count 个,通过 $passed_count 个,失败 $failed_count 个" >> $GITHUB_STEP_SUMMARY
# 输出统计信息供后续步骤使用
echo "binary_count=$binary_count" >> $GITHUB_OUTPUT
echo "tested_count=$tested_count" >> $GITHUB_OUTPUT
echo "passed_count=$passed_count" >> $GITHUB_OUTPUT
echo "failed_count=$failed_count" >> $GITHUB_OUTPUT
- name: 📊 生成详细测试报告
if: always()
run: |
echo "# 🎯 测试构建详细报告" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 基本信息表格
echo "## 📋 构建基本信息" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 项目 | 值 |" >> $GITHUB_STEP_SUMMARY
echo "|------|-----|" >> $GITHUB_STEP_SUMMARY
echo "| 🏷️ **项目名称** | ${{ steps.project.outputs.repo }} |" >> $GITHUB_STEP_SUMMARY
echo "| 👤 **拥有者** | ${{ steps.project.outputs.owner }} |" >> $GITHUB_STEP_SUMMARY
echo "| 🌿 **分支** | ${{ steps.project.outputs.branch }} |" >> $GITHUB_STEP_SUMMARY
echo "| 📝 **提交SHA** | \`${{ steps.project.outputs.short_sha }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| 📅 **构建时间** | ${{ steps.project.outputs.build_date }} |" >> $GITHUB_STEP_SUMMARY
echo "| ⏱️ **构建耗时** | ${{ steps.build_end.outputs.duration_readable }} |" >> $GITHUB_STEP_SUMMARY
echo "| 🚀 **触发方式** | ${{ github.event_name }} |" >> $GITHUB_STEP_SUMMARY
echo "| 🔧 **Go版本** | $(go version | cut -d' ' -f3) |" >> $GITHUB_STEP_SUMMARY
echo "| 🗜️ **UPX版本** | $(upx --version | head -1 | cut -d' ' -f2) |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 构建环境信息
echo "## 🖥️ 构建环境" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 环境变量 | 值 |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-----|" >> $GITHUB_STEP_SUMMARY
echo "| **GITHUB_OWNER** | $GITHUB_OWNER |" >> $GITHUB_STEP_SUMMARY
echo "| **GITHUB_REPO** | $GITHUB_REPO |" >> $GITHUB_STEP_SUMMARY
echo "| **PROJECT_NAME** | $PROJECT_NAME |" >> $GITHUB_STEP_SUMMARY
echo "| **RUNNER_OS** | $RUNNER_OS |" >> $GITHUB_STEP_SUMMARY
echo "| **RUNNER_ARCH** | $RUNNER_ARCH |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 构建时间统计
echo "## ⏰ 构建时间统计" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 阶段 | 时间 |" >> $GITHUB_STEP_SUMMARY
echo "|------|------|" >> $GITHUB_STEP_SUMMARY
echo "| 🚀 **开始时间** | ${{ steps.build_start.outputs.start_readable }} |" >> $GITHUB_STEP_SUMMARY
echo "| 🏁 **结束时间** | ${{ steps.build_end.outputs.end_readable }} |" >> $GITHUB_STEP_SUMMARY
echo "| ⏱️ **总耗时** | ${{ steps.build_end.outputs.duration_readable }} |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 构建产物统计
if [ -d "dist" ]; then
echo "## 📦 构建产物详情" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 简化的文件列表 - 使用代码块格式
echo "### 📄 文件列表" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "文件名 大小 修改时间 权限" >> $GITHUB_STEP_SUMMARY
echo "================================================================" >> $GITHUB_STEP_SUMMARY
cd dist
# 使用ls -la并格式化输出
ls -la | grep -v "^d" | grep -v "^total" | head -20 | while read -r line; do
# 解析ls -la的输出
permissions=$(echo "$line" | awk '{print $1}')
size=$(echo "$line" | awk '{print $5}')
month=$(echo "$line" | awk '{print $6}')
day=$(echo "$line" | awk '{print $7}')
time=$(echo "$line" | awk '{print $8}')
filename=$(echo "$line" | awk '{print $9}')
# 格式化大小
if [ "$size" -gt 1048576 ]; then
size_formatted=$(echo "scale=1; $size/1048576" | bc)M
elif [ "$size" -gt 1024 ]; then
size_formatted=$(echo "scale=1; $size/1024" | bc)K
else
size_formatted="${size}B"
fi
# 格式化输出
printf "%-32s %-8s %s %s %-8s %-12s\n" "$filename" "$size_formatted" "$month" "$day" "$time" "$permissions"
done >> $GITHUB_STEP_SUMMARY
cd ..
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 简化的文件大小统计
echo "### 📏 文件大小统计 (前10个最大文件)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "大小 文件名 类型" >> $GITHUB_STEP_SUMMARY
echo "=================================================" >> $GITHUB_STEP_SUMMARY
find dist -type f -exec du -h {} + | sort -h | tail -10 | while read -r size filepath; do
filename=$(basename "$filepath")
# 限制文件名长度
if [ ${#filename} -gt 32 ]; then
filename="${filename:0:29}..."
fi
# 获取文件类型
filetype=$(file "$filepath" 2>/dev/null | cut -d':' -f2 | sed 's/^[[:space:]]*//' | cut -d',' -f1)
if [ ${#filetype} -gt 25 ]; then
filetype="${filetype:0:22}..."
fi
printf "%-8s %-32s %s\n" "$size" "$filename" "$filetype"
done >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 目录结构
echo "### 🗂️ 目录结构" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
if command -v tree >/dev/null 2>&1; then
tree dist/ -L 3 2>/dev/null
else
find dist/ -type d | sort | sed 's|dist/||' | sed 's|^| |'
fi >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 平台支持统计
echo "### 🎯 平台支持统计" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
linux_count=$(find dist/ -name "*linux*" -type f | wc -l)
windows_count=$(find dist/ -name "*windows*" -type f | wc -l)
darwin_count=$(find dist/ -name "*darwin*" -type f | wc -l)
amd64_count=$(find dist/ -name "*amd64*" -type f | wc -l)
arm64_count=$(find dist/ -name "*arm64*" -type f | wc -l)
echo "| 平台/架构 | 数量 |" >> $GITHUB_STEP_SUMMARY
echo "|-----------|------|" >> $GITHUB_STEP_SUMMARY
echo "| 🐧 **Linux** | $linux_count |" >> $GITHUB_STEP_SUMMARY
echo "| 🪟 **Windows** | $windows_count |" >> $GITHUB_STEP_SUMMARY
echo "| 🍎 **macOS** | $darwin_count |" >> $GITHUB_STEP_SUMMARY
echo "| 💻 **AMD64** | $amd64_count |" >> $GITHUB_STEP_SUMMARY
echo "| 📱 **ARM64** | $arm64_count |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 文件类型统计
echo "### 📊 文件类型统计" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 文件类型 | 数量 | 总大小 |" >> $GITHUB_STEP_SUMMARY
echo "|----------|------|--------|" >> $GITHUB_STEP_SUMMARY
# 统计不同类型文件
binary_files=$(find dist/ -type f -executable | wc -l)
config_files=$(find dist/ -name "*.json" -o -name "*.yaml" -o -name "*.yml" -o -name "*.txt" | wc -l)
archive_files=$(find dist/ -name "*.tar.gz" -o -name "*.zip" | wc -l)
# 计算大小(使用更简单的方法)
if [ "$binary_files" -gt 0 ]; then
binary_size=$(find dist/ -type f -executable -exec ls -la {} + | awk '{sum += $5} END {print sum}')
binary_size_readable=$(echo "scale=1; $binary_size/1048576" | bc 2>/dev/null || echo "0")M
else
binary_size_readable="0B"
fi
if [ "$config_files" -gt 0 ]; then
config_size=$(find dist/ \( -name "*.json" -o -name "*.yaml" -o -name "*.yml" -o -name "*.txt" \) -exec ls -la {} + | awk '{sum += $5} END {print sum}')
config_size_readable=$(echo "scale=1; $config_size/1024" | bc 2>/dev/null || echo "0")K
else
config_size_readable="0B"
fi
if [ "$archive_files" -gt 0 ]; then
archive_size=$(find dist/ \( -name "*.tar.gz" -o -name "*.zip" \) -exec ls -la {} + | awk '{sum += $5} END {print sum}')
archive_size_readable=$(echo "scale=1; $archive_size/1048576" | bc 2>/dev/null || echo "0")M
else
archive_size_readable="0B"
fi
echo "| 🔧 **可执行文件** | $binary_files | $binary_size_readable |" >> $GITHUB_STEP_SUMMARY
echo "| 📄 **配置文件** | $config_files | $config_size_readable |" >> $GITHUB_STEP_SUMMARY
echo "| 📦 **压缩包** | $archive_files | $archive_size_readable |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
fi
# 总结
echo "## 📈 构建总结" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ job.status }}" == "success" ]; then
echo "🎉 **构建状态**: ✅ 成功" >> $GITHUB_STEP_SUMMARY
else
echo "🎉 **构建状态**: ❌ 失败" >> $GITHUB_STEP_SUMMARY
fi
echo "📊 **二进制文件**: ${{ steps.binary_test.outputs.binary_count }} 个" >> $GITHUB_STEP_SUMMARY
echo "🧪 **测试通过**: ${{ steps.binary_test.outputs.passed_count }}/${{ steps.binary_test.outputs.tested_count }}" >> $GITHUB_STEP_SUMMARY
echo "⏱️ **构建耗时**: ${{ steps.build_end.outputs.duration_readable }}" >> $GITHUB_STEP_SUMMARY
echo "📦 **产物大小**: $(du -sh dist/ 2>/dev/null | cut -f1 || echo "未知")" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 添加快速链接
echo "## 🔗 快速链接" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- 📋 [查看产物列表](https://github.com/${{ steps.project.outputs.owner }}/${{ steps.project.outputs.repo }}/actions/runs/${{ github.run_id }})" >> $GITHUB_STEP_SUMMARY
echo "- 📥 [下载产物](https://github.com/${{ steps.project.outputs.owner }}/${{ steps.project.outputs.repo }}/actions/runs/${{ github.run_id }})" >> $GITHUB_STEP_SUMMARY
echo "- 🔍 [查看提交](https://github.com/${{ steps.project.outputs.owner }}/${{ steps.project.outputs.repo }}/commit/${{ steps.project.outputs.full_sha }})" >> $GITHUB_STEP_SUMMARY
echo "- 🌿 [查看分支](https://github.com/${{ steps.project.outputs.owner }}/${{ steps.project.outputs.repo }}/tree/${{ steps.project.outputs.branch }})" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "*报告生成时间: $(date -u +"%Y-%m-%d %H:%M:%S UTC")*" >> $GITHUB_STEP_SUMMARY