diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 2fa1086..df00230 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -4,6 +4,24 @@ on: release: types: - published # 当通过 GitHub Releases 页面创建 release 时触发 + workflow_dispatch: + inputs: + build_type: + description: '构建类型' + required: true + type: choice + options: + - package-only # 只打包产物 + - package-and-docker # 打包产物 + Docker 镜像 + default: 'package-and-docker' + version: + description: '版本号(例如: v1.0.0)' + required: false + type: string + tag_name: + description: 'Git Tag 名称(留空则使用 version)' + required: false + type: string jobs: build-and-push: @@ -16,25 +34,61 @@ jobs: - name: Checkout code uses: actions/checkout@v4 with: - ref: ${{ github.event.release.tag_name }} # 使用 release 对应的 tag + ref: ${{ github.event.release.tag_name || github.event.inputs.tag_name || github.event.inputs.version || github.ref }} + + - name: Determine build type + id: build_config + run: | + # 确定构建类型 + if [ "${{ github.event_name }}" = "release" ]; then + # Release 事件:默认只打包产物(不构建 Docker) + BUILD_TYPE="package-only" + echo "📦 Release 事件:将只打包产物(不构建 Docker)" + else + # workflow_dispatch 事件:使用用户输入 + BUILD_TYPE="${{ github.event.inputs.build_type }}" + echo "🔧 手动触发:构建类型 = ${BUILD_TYPE}" + fi + + echo "BUILD_TYPE=${BUILD_TYPE}" >> $GITHUB_OUTPUT - name: Extract version and check if pre-release id: extract_version run: | - # 从 release tag 中提取版本号(例如 v1.0.0 -> 1.0.0) - TAG_NAME="${{ github.event.release.tag_name }}" - if [ -z "$TAG_NAME" ]; then - TAG_NAME=${GITHUB_REF#refs/tags/} + # 从不同事件源提取版本号 + if [ "${{ github.event_name }}" = "release" ]; then + # Release 事件:从 release tag 中提取 + TAG_NAME="${{ github.event.release.tag_name }}" + IS_PRERELEASE="${{ github.event.release.prerelease }}" + else + # workflow_dispatch 事件:从输入参数中提取 + TAG_NAME="${{ github.event.inputs.tag_name }}" + if [ -z "$TAG_NAME" ]; then + TAG_NAME="${{ github.event.inputs.version }}" + fi + # 如果仍然为空,尝试从 git ref 中提取 + if [ -z "$TAG_NAME" ]; then + TAG_NAME=${GITHUB_REF#refs/tags/} + if [ "$TAG_NAME" = "$GITHUB_REF" ]; then + # 不是 tag,尝试从分支名或 commit SHA 获取 + TAG_NAME=${GITHUB_REF#refs/heads/} + if [ "$TAG_NAME" = "$GITHUB_REF" ]; then + TAG_NAME="dev-$(date +%Y%m%d-%H%M%S)" + echo "⚠️ 未指定版本号,使用临时版本: $TAG_NAME" + fi + fi + fi + IS_PRERELEASE="false" fi # 验证版本号格式:v数字.数字.数字[-后缀](例如 v1.0.0, v2.10.102, v1.0.0-beta) - if [[ ! "$TAG_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]]; then - echo "错误: 版本号格式不正确,应为 v数字.数字.数字 或 v数字.数字.数字-后缀 (例如: v1.0.0, v1.0.0-beta)" - exit 1 + if [[ ! "$TAG_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]] && [[ ! "$TAG_NAME" =~ ^dev- ]]; then + echo "⚠️ 警告: 版本号格式不符合标准,但仍将继续构建" + echo " 当前版本号: $TAG_NAME" + echo " 标准格式应为: v数字.数字.数字 或 v数字.数字.数字-后缀 (例如: v1.0.0, v1.0.0-beta)" fi - VERSION=${TAG_NAME#v} # 移除 v 前缀 - IS_PRERELEASE="${{ github.event.release.prerelease }}" + VERSION=${TAG_NAME#v} # 移除 v 前缀(如果存在) echo "VERSION=$VERSION" >> $GITHUB_OUTPUT echo "TAG=$TAG_NAME" >> $GITHUB_OUTPUT @@ -47,7 +101,7 @@ jobs: fi - name: Send Telegram notification (build started) - if: steps.extract_version.outputs.IS_PRERELEASE == 'false' + if: steps.extract_version.outputs.IS_PRERELEASE == 'false' && steps.build_config.outputs.BUILD_TYPE == 'package-and-docker' env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} @@ -59,12 +113,15 @@ jobs: fi # 获取构建信息 - VERSION="${{ steps.extract_version.outputs.VERSION }}" TAG="${{ steps.extract_version.outputs.TAG }}" - RELEASE_URL="${{ github.event.release.html_url }}" - # 构建消息内容(仅包含关键信息) - MESSAGE="🔨 Docker 镜像构建中"$'\n'$'\n'"📦 版本: ${VERSION}"$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔗 查看 Release" + if [ "${{ github.event_name }}" = "release" ]; then + RELEASE_URL="${{ github.event.release.html_url }}" + MESSAGE="🔨 Release 构建中"$'\n'$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔧 构建类型: Docker 升级"$'\n'"🔗 查看 Release" + else + WORKFLOW_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + MESSAGE="🔨 构建中"$'\n'$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔧 构建类型: Docker 升级"$'\n'"🔗 查看 Workflow" + fi # 发送 Telegram 消息(使用 jq 转义 JSON) curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ @@ -141,12 +198,18 @@ jobs: echo "✅ 前端文件已复制" # 创建版本信息文件 + if [ "${{ github.event_name }}" = "release" ]; then + RELEASE_NOTES=$(echo '${{ github.event.release.body }}' | jq -Rs .) + else + RELEASE_NOTES="\"手动构建 - workflow_dispatch\"" + fi + cat > update-package/version.json < checksums.txt - name: Upload Update Package to Release + if: github.event_name == 'release' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -178,7 +242,8 @@ jobs: asset_name: polyhermes-${{ steps.extract_version.outputs.TAG }}-update.tar.gz asset_content_type: application/gzip - - name: Upload Checksums + - name: Upload Checksums to Release + if: github.event_name == 'release' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -188,19 +253,32 @@ jobs: asset_name: checksums.txt asset_content_type: text/plain + - name: Upload Update Package as Artifact + if: github.event_name == 'workflow_dispatch' + uses: actions/upload-artifact@v4 + with: + name: polyhermes-${{ steps.extract_version.outputs.TAG }}-update + path: | + polyhermes-${{ steps.extract_version.outputs.TAG }}-update.tar.gz + checksums.txt + retention-days: 30 + - name: Set up Docker Buildx + if: steps.build_config.outputs.BUILD_TYPE == 'package-and-docker' uses: docker/setup-buildx-action@v3 with: # 启用多架构构建支持 platforms: linux/amd64,linux/arm64 - name: Log in to Docker Hub + if: steps.build_config.outputs.BUILD_TYPE == 'package-and-docker' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Prepare Docker build context + if: steps.build_config.outputs.BUILD_TYPE == 'package-and-docker' run: | echo "📦 准备 Docker 构建上下文..." # 确保构建产物存在且可访问 @@ -217,6 +295,7 @@ jobs: ls -lh backend/build/libs/*.jar - name: Build and push Docker image + if: steps.build_config.outputs.BUILD_TYPE == 'package-and-docker' uses: docker/build-push-action@v5 with: context: . @@ -234,6 +313,12 @@ jobs: GITHUB_REPO_URL=https://github.com/WrBug/PolyHermes cache-from: type=registry,ref=wrbug/polyhermes:latest cache-to: type=inline + + - name: Skip Docker build notice + if: steps.build_config.outputs.BUILD_TYPE == 'package-only' + run: | + echo "⏭️ 跳过 Docker 镜像构建(构建类型:package-only)" + echo "✅ 仅打包产物已完成" - name: Send Telegram notification if: steps.extract_version.outputs.IS_PRERELEASE == 'false' @@ -250,13 +335,26 @@ jobs: # 获取构建信息 VERSION="${{ steps.extract_version.outputs.VERSION }}" TAG="${{ steps.extract_version.outputs.TAG }}" - RELEASE_NAME="${{ github.event.release.name }}" - RELEASE_URL="${{ github.event.release.html_url }}" - REPO_NAME="${{ github.repository }}" + BUILD_TYPE="${{ steps.build_config.outputs.BUILD_TYPE }}" # 构建消息内容(仅包含关键信息) DEPLOY_DOC_URL="https://github.com/WrBug/PolyHermes/blob/main/docs/zh/DEPLOYMENT.md" - MESSAGE="✅ Docker 镜像构建成功"$'\n'$'\n'"📦 版本: ${VERSION}"$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔗 查看 Release"$'\n'"📚 Docker 部署文档" + + if [ "${{ github.event_name }}" = "release" ]; then + RELEASE_URL="${{ github.event.release.html_url }}" + if [ "$BUILD_TYPE" = "package-and-docker" ]; then + MESSAGE="✅ Release 构建成功"$'\n'$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔧 构建类型: Docker 升级"$'\n'"🔗 查看 Release"$'\n'"📚 Docker 部署文档" + else + MESSAGE="✅ Release 打包成功"$'\n'$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔧 构建类型: 在线升级"$'\n'"🔗 查看 Release"$'\n'"📍 升级路径: 系统管理 → 概览 → 检查更新" + fi + else + WORKFLOW_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + if [ "$BUILD_TYPE" = "package-and-docker" ]; then + MESSAGE="✅ 构建成功"$'\n'$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔧 构建类型: Docker 升级"$'\n'"🔗 查看 Workflow"$'\n'"📚 Docker 部署文档" + else + MESSAGE="✅ 打包成功"$'\n'$'\n'"🏷️ Tag: ${TAG}"$'\n'"🔧 构建类型: 在线升级"$'\n'"🔗 查看 Workflow"$'\n'"📍 升级路径: 系统管理 → 概览 → 检查更新" + fi + fi # 发送 Telegram 消息(使用 jq 转义 JSON) curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \