diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9cb7cee..86aacfa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,8 +16,37 @@ permissions: env: DOTNET_VERSION: '10.0.x' + NODE_VERSION: '18.x' jobs: + build-web: + name: Build Web + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install dependencies + working-directory: web + run: npm install + + - name: Build web + working-directory: web + run: npm run build + + - name: Upload web artifacts + uses: actions/upload-artifact@v4 + with: + name: web-dist + path: web/dist/ + retention-days: 1 + build-tunnelclient: name: Build TunnelClient runs-on: ${{ matrix.os }} @@ -55,6 +84,7 @@ jobs: build-fastgateway: name: Build FastGateway + needs: build-web runs-on: ${{ matrix.os }} strategy: matrix: @@ -70,6 +100,12 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Download web artifacts + uses: actions/download-artifact@v4 + with: + name: web-dist + path: src/FastGateway/wwwroot + - name: Setup .NET uses: actions/setup-dotnet@v4 with: diff --git a/build-arm-dotnet.sh b/build-arm-dotnet.sh deleted file mode 100644 index 6c6c43e..0000000 --- a/build-arm-dotnet.sh +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/bash - -# FastGateway ARM 构建脚本 -# 用于构建和发布 ARM 架构的 .NET 程序到 ./output 目录 - -set -e # 遇到错误时立即退出 - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 配置变量 -PROJECT_PATH="src/FastGateway.Service/FastGateway.Service.csproj" -OUTPUT_DIR="./output" -TARGET_FRAMEWORK="net8.0" -RUNTIME_IDENTIFIER="linux-arm64" -CONFIGURATION="Release" - -# 函数:打印带颜色的消息 -print_info() { - echo -e "${BLUE}[INFO]${NC} $1" -} - -print_success() { - echo -e "${GREEN}[SUCCESS]${NC} $1" -} - -print_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" -} - -print_error() { - echo -e "${RED}[ERROR]${NC} $1" -} - -# 函数:检查文件是否存在 -check_file() { - if [ ! -f "$1" ]; then - print_error "文件 $1 不存在" - exit 1 - fi -} - -# 函数:清理输出目录 -cleanup_output() { - print_info "清理输出目录..." - if [ -d "$OUTPUT_DIR" ]; then - rm -rf "$OUTPUT_DIR" - print_success "输出目录清理完成" - fi -} - -# 函数:还原 NuGet 包 -restore_packages() { - print_info "还原 NuGet 包..." - dotnet restore "$PROJECT_PATH" --runtime "$RUNTIME_IDENTIFIER" - print_success "NuGet 包还原完成" -} - -# 函数:构建项目 -build_project() { - print_info "构建项目..." - dotnet build "$PROJECT_PATH" \ - --configuration "$CONFIGURATION" \ - --runtime "$RUNTIME_IDENTIFIER" \ - --no-restore - print_success "项目构建完成" -} - -# 函数:发布项目 -publish_project() { - print_info "发布 ARM 架构程序到 $OUTPUT_DIR..." - - dotnet publish "$PROJECT_PATH" \ - --configuration "$CONFIGURATION" \ - --runtime "$RUNTIME_IDENTIFIER" \ - --output "$OUTPUT_DIR" \ - --self-contained true \ - --no-restore \ - --no-build \ - /p:PublishSingleFile=true \ - /p:PublishTrimmed=true \ - /p:IncludeNativeLibrariesForSelfExtract=true - - print_success "ARM 程序发布完成" -} - -# 函数:显示发布信息 -show_publish_info() { - print_info "发布信息:" - echo " - 目标框架: $TARGET_FRAMEWORK" - echo " - 运行时标识符: $RUNTIME_IDENTIFIER" - echo " - 配置: $CONFIGURATION" - echo " - 输出目录: $OUTPUT_DIR" - echo " - 单文件发布: 是" - echo " - 自包含: 是" - echo " - 代码裁剪: 是" - - if [ -d "$OUTPUT_DIR" ]; then - echo "" - print_info "输出文件:" - ls -la "$OUTPUT_DIR" - fi -} - -# 函数:验证发布结果 -verify_publish() { - print_info "验证发布结果..." - - if [ ! -d "$OUTPUT_DIR" ]; then - print_error "输出目录不存在" - exit 1 - fi - - # 检查主要的可执行文件 - if [ -f "$OUTPUT_DIR/FastGateway.Service" ]; then - print_success "可执行文件 FastGateway.Service 已生成" - - # 显示文件大小 - file_size=$(du -h "$OUTPUT_DIR/FastGateway.Service" | cut -f1) - echo " 文件大小: $file_size" - - # 检查文件权限 - if [ ! -x "$OUTPUT_DIR/FastGateway.Service" ]; then - print_info "设置可执行权限..." - chmod +x "$OUTPUT_DIR/FastGateway.Service" - fi - else - print_error "可执行文件未找到" - exit 1 - fi - - # 检查配置文件 - if [ -f "$OUTPUT_DIR/appsettings.json" ]; then - print_success "配置文件 appsettings.json 已复制" - fi - - print_success "发布验证完成" -} - -# 主函数 -main() { - print_info "开始构建 FastGateway ARM 版本..." - - # 检查项目文件 - check_file "$PROJECT_PATH" - - # 显示 .NET 版本信息 - print_info ".NET 版本信息:" - dotnet --version - - # 执行构建流程 - cleanup_output - restore_packages - build_project - publish_project - verify_publish - show_publish_info - - print_success "FastGateway ARM 版本构建完成!" - print_info "你可以将 $OUTPUT_DIR 目录复制到 ARM 设备上运行" - print_info "运行命令: ./FastGateway.Service" -} - -# 显示使用帮助 -show_help() { - echo "FastGateway ARM 构建脚本" - echo "" - echo "用法: $0 [选项]" - echo "" - echo "选项:" - echo " -h, --help 显示此帮助信息" - echo " --clean 仅清理输出目录" - echo " --restore 仅还原 NuGet 包" - echo " --build 仅构建项目" - echo " --publish 仅发布项目" - echo "" - echo "示例:" - echo " $0 # 完整构建流程" - echo " $0 --clean # 仅清理输出目录" - echo " $0 --publish # 仅发布项目" -} - -# 处理命令行参数 -case "${1:-}" in - -h|--help) - show_help - exit 0 - ;; - --clean) - cleanup_output - exit 0 - ;; - --restore) - check_file "$PROJECT_PATH" - restore_packages - exit 0 - ;; - --build) - check_file "$PROJECT_PATH" - restore_packages - build_project - exit 0 - ;; - --publish) - check_file "$PROJECT_PATH" - publish_project - verify_publish - show_publish_info - exit 0 - ;; - "") - main - ;; - *) - print_error "未知选项: $1" - show_help - exit 1 - ;; -esac diff --git a/build-arm.sh b/build-arm.sh deleted file mode 100644 index b33aa06..0000000 --- a/build-arm.sh +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash - -# FastGateway ARM 构建脚本 -# 用于构建和发布 ARM 架构的 FastGateway 服务 - -set -e # 遇到错误时立即退出 - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 配置变量 -IMAGE_NAME="aidotnet/fast-gateway" -ARM_TAG="arm64" -LATEST_TAG="latest-arm64" -DOCKERFILE_ARM="src/FastGateway.Service/Dockerfile.arm" -COMPOSE_FILE="docker-compose.arm.yml" - -# 函数:打印带颜色的消息 -print_info() { - echo -e "${BLUE}[INFO]${NC} $1" -} - -print_success() { - echo -e "${GREEN}[SUCCESS]${NC} $1" -} - -print_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" -} - -print_error() { - echo -e "${RED}[ERROR]${NC} $1" -} - -# 函数:检查命令是否存在 -check_command() { - if ! command -v $1 &> /dev/null; then - print_error "$1 未找到,请先安装 $1" - exit 1 - fi -} - -# 函数:检查文件是否存在 -check_file() { - if [ ! -f "$1" ]; then - print_error "文件 $1 不存在" - exit 1 - fi -} - -# 函数:清理旧的构建缓存 -cleanup() { - print_info "清理 Docker 构建缓存..." - docker builder prune -f --filter until=24h - print_success "缓存清理完成" -} - -# 函数:构建 ARM 镜像 -build_arm_image() { - print_info "开始构建 ARM 架构镜像..." - - # 检查 Dockerfile - check_file $DOCKERFILE_ARM - - # 构建镜像 - docker buildx build \ - --platform linux/arm64 \ - --file $DOCKERFILE_ARM \ - --tag $IMAGE_NAME:$ARM_TAG \ - --tag $IMAGE_NAME:$LATEST_TAG \ - --load \ - . - - print_success "ARM 镜像构建完成" -} - -# 函数:推送镜像到仓库 -push_image() { - print_info "推送镜像到 Docker Hub..." - - # 推送带版本标签的镜像 - docker push $IMAGE_NAME:$ARM_TAG - docker push $IMAGE_NAME:$LATEST_TAG - - print_success "镜像推送完成" -} - -# 函数:使用 docker-compose 构建 -build_with_compose() { - print_info "使用 docker-compose 构建 ARM 镜像..." - - check_file $COMPOSE_FILE - - docker-compose -f $COMPOSE_FILE build --no-cache - - print_success "docker-compose 构建完成" -} - -# 函数:运行 ARM 容器 -run_arm_container() { - print_info "启动 ARM 容器..." - - # 停止现有容器 - docker-compose -f $COMPOSE_FILE down - - # 启动新容器 - docker-compose -f $COMPOSE_FILE up -d - - print_success "ARM 容器已启动" - - # 显示容器状态 - print_info "容器状态:" - docker-compose -f $COMPOSE_FILE ps -} - -# 函数:显示帮助信息 -show_help() { - echo "FastGateway ARM 构建脚本" - echo "" - echo "用法: $0 [选项]" - echo "" - echo "选项:" - echo " build 构建 ARM 镜像" - echo " push 推送镜像到 Docker Hub" - echo " compose 使用 docker-compose 构建" - echo " run 运行 ARM 容器" - echo " cleanup 清理构建缓存" - echo " all 执行完整构建流程(构建+运行)" - echo " help 显示此帮助信息" - echo "" - echo "示例:" - echo " $0 build # 仅构建镜像" - echo " $0 all # 构建并运行" - echo " $0 push # 推送镜像" -} - -# 函数:显示系统信息 -show_system_info() { - print_info "系统信息:" - echo " 操作系统: $(uname -s)" - echo " 架构: $(uname -m)" - echo " Docker 版本: $(docker --version)" - echo " Docker Compose 版本: $(docker-compose --version)" - - # 检查是否支持 ARM64 - if docker buildx ls | grep -q "linux/arm64"; then - print_success "支持 ARM64 构建" - else - print_warning "可能不支持 ARM64 构建,请确保 Docker Buildx 配置正确" - fi -} - -# 主函数 -main() { - print_info "FastGateway ARM 构建脚本启动" - - # 检查必要的命令 - check_command "docker" - check_command "docker-compose" - - # 显示系统信息 - show_system_info - - # 根据参数执行相应操作 - case "${1:-help}" in - "build") - build_arm_image - ;; - "push") - push_image - ;; - "compose") - build_with_compose - ;; - "run") - run_arm_container - ;; - "cleanup") - cleanup - ;; - "all") - cleanup - build_arm_image - run_arm_container - ;; - "help"|*) - show_help - ;; - esac - - print_success "操作完成" -} - -# 脚本入口点 -main "$@" diff --git a/build-simple.sh b/build-simple.sh deleted file mode 100644 index da5b6af..0000000 --- a/build-simple.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# 简单的 ARM 构建脚本 -set -e - -# 清理输出目录 -rm -rf ./output - -# 发布 ARM 版本 -dotnet publish src/FastGateway.Service/FastGateway.Service.csproj \ - --configuration Release \ - --runtime linux-arm64 \ - --output ./output \ - --self-contained true \ - /p:PublishSingleFile=true - -echo "构建完成,输出目录: ./output" diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..a62cbfa --- /dev/null +++ b/build.bat @@ -0,0 +1,224 @@ +@echo off +REM ======================================== +REM FastGateway 构建脚本 +REM 功能: 构建前端, 构建后端, 构建TunnelClient, 将前端dist复制到后端wwwroot +REM ======================================== + +setlocal enabledelayedexpansion + +REM 设置颜色输出 +REM 绿色: 0A, 黄色: 0E, 红色: 0C +set "GREEN=[92m" +set "YELLOW=[93m" +set "RED=[91m" +set "RESET=[0m" + +REM 获取脚本所在目录 +set "SCRIPT_DIR=%~dp0" +set "WEB_DIR=%SCRIPT_DIR%web" +set "BACKEND_DIR=%SCRIPT_DIR%src\FastGateway" +set "TUNNEL_CLIENT_DIR=%SCRIPT_DIR%src\TunnelClient" +set "SOLUTION_FILE=%SCRIPT_DIR%FastGateway.sln" +set "BACKEND_WWWROOT=%BACKEND_DIR%\wwwroot" +set "FRONTEND_DIST=%WEB_DIR%\dist" + +echo. +echo ======================================== +echo FastGateway 构建开始 +echo ======================================== +echo. + +REM 检查必要的工具 +echo [*] 检查必要工具... +where dotnet >nul 2>&1 +if errorlevel 1 ( + echo [错误] 未找到 dotnet 命令!请确保已安装 .NET SDK + exit /b 1 +) +echo [✓] dotnet 已安装 + +where node >nul 2>&1 +if errorlevel 1 ( + echo [错误] 未找到 node 命令!请确保已安装 Node.js + exit /b 1 +) +echo [✓] node 已安装 + +where npm >nul 2>&1 +if errorlevel 1 ( + echo [错误] 未找到 npm 命令!请确保已安装 npm + exit /b 1 +) +echo [✓] npm 已安装 +echo. + +REM ======================================== +REM 第一步: 构建前端 +REM ======================================== +echo ======================================== +echo 第一步: 构建前端应用 +echo ======================================== +echo. + +if not exist "%WEB_DIR%" ( + echo [错误] 前端目录不存在: %WEB_DIR% + exit /b 1 +) + +cd /d "%WEB_DIR%" +if errorlevel 1 ( + echo [错误] 无法进入前端目录 + exit /b 1 +) + +echo [*] 安装前端依赖... +call npm install +if errorlevel 1 ( + echo [错误] 前端依赖安装失败 + exit /b 1 +) +echo [✓] 前端依赖安装完成 +echo. + +echo [*] 构建前端... +call npm run build +if errorlevel 1 ( + echo [错误] 前端构建失败 + exit /b 1 +) +echo [✓] 前端构建完成 +echo. + +REM 检查dist目录 +if not exist "%FRONTEND_DIST%" ( + echo [错误] 前端dist目录未生成: %FRONTEND_DIST% + exit /b 1 +) +echo [✓] 前端dist目录已生成 +echo. + +REM ======================================== +REM 第二步: 清理后端旧的wwwroot +REM ======================================== +echo ======================================== +echo 第二步: 清理后端wwwroot目录 +echo ======================================== +echo. + +if exist "%BACKEND_WWWROOT%" ( + echo [*] 删除旧的 wwwroot 目录... + rmdir /s /q "%BACKEND_WWWROOT%" + if errorlevel 1 ( + echo [警告] 删除 wwwroot 失败,继续进行... + ) else ( + echo [✓] 旧 wwwroot 已删除 + ) +) else ( + echo [*] wwwroot 目录不存在,无需清理 +) +echo. + +REM ======================================== +REM 第三步: 构建后端 +REM ======================================== +echo ======================================== +echo 第三步: 构建后端应用 +echo ======================================== +echo. + +cd /d "%SCRIPT_DIR%" +if errorlevel 1 ( + echo [错误] 无法回到项目根目录 + exit /b 1 +) + +echo [*] 恢复NuGet包... +dotnet restore "%SOLUTION_FILE%" +if errorlevel 1 ( + echo [错误] NuGet包恢复失败 + exit /b 1 +) +echo [✓] NuGet包恢复完成 +echo. + +echo [*] 编译后端项目 (Release)... +dotnet publish "%SOLUTION_FILE%" -c Release -o "%BACKEND_DIR%\publish" +if errorlevel 1 ( + echo [错误] 后端构建失败 + exit /b 1 +) +echo [✓] 后端构建完成 +echo. + +REM ======================================== +REM 第四步: 复制前端dist到后端wwwroot +REM ======================================== +echo ======================================== +echo 第四步: 复制前端文件到后端 +echo ======================================== +echo. + +if not exist "%BACKEND_DIR%\publish\wwwroot" ( + echo [*] 创建 wwwroot 目录... + mkdir "%BACKEND_DIR%\publish\wwwroot" + if errorlevel 1 ( + echo [错误] 无法创建 wwwroot 目录 + exit /b 1 + ) +) + +echo [*] 复制前端dist文件到后端wwwroot... +xcopy "%FRONTEND_DIST%\*" "%BACKEND_DIR%\publish\wwwroot\" /E /I /Y +if errorlevel 1 ( + echo [错误] 复制前端文件失败 + exit /b 1 +) +echo [✓] 前端文件复制完成 +echo. + +REM ======================================== +REM 第五步: 构建 TunnelClient +REM ======================================== +echo ======================================== +echo 第五步: 构建 TunnelClient 应用 +echo ======================================== +echo. + +if not exist "%TUNNEL_CLIENT_DIR%" ( + echo [错误] TunnelClient 目录不存在: %TUNNEL_CLIENT_DIR% + exit /b 1 +) + +cd /d "%SCRIPT_DIR%" +if errorlevel 1 ( + echo [错误] 无法回到项目根目录 + exit /b 1 +) + +echo [*] 编译 TunnelClient 项目 (Release)... +dotnet publish "%TUNNEL_CLIENT_DIR%\TunnelClient.csproj" -c Release -o "%TUNNEL_CLIENT_DIR%\publish" +if errorlevel 1 ( + echo [错误] TunnelClient 构建失败 + exit /b 1 +) +echo [✓] TunnelClient 构建完成 +echo. + +REM ======================================== +REM 构建完成 +REM ======================================== +echo ======================================== +echo 构建成功完成! +echo ======================================== +echo. +echo [✓] 前端构建: %FRONTEND_DIST% +echo [✓] 后端构建: %BACKEND_DIR%\publish +echo [✓] TunnelClient 构建: %TUNNEL_CLIENT_DIR%\publish +echo [✓] 前端文件已复制到: %BACKEND_DIR%\publish\wwwroot +echo. +echo 后端发布文件位于: %BACKEND_DIR%\publish +echo TunnelClient 发布文件位于: %TUNNEL_CLIENT_DIR%\publish +echo. + +endlocal +exit /b 0