fix: 修复连接事件异步等待问题 #53
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release NuGet Packages | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| # 当 commit message 包含 "release version" 且提交者邮箱是 "lbhdr@outlook.com" 时触发 | |
| # 使用 git log 检查最后一个 commit message 和提交者邮箱 | |
| jobs: | |
| release: | |
| runs-on: ubuntu-latest | |
| # 检查 commit message 是否包含 "release version" 且提交者邮箱是 "lbhdr@outlook.com" | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # 获取完整历史以检查 commit message | |
| - name: Check commit message and author email | |
| id: check_commit | |
| run: | | |
| COMMIT_MSG=$(git log -1 --pretty=%B) | |
| COMMIT_AUTHOR_EMAIL=$(git log -1 --pretty=%ae) | |
| echo "Last commit message: $COMMIT_MSG" | |
| echo "Last commit author email: $COMMIT_AUTHOR_EMAIL" | |
| # 检查 commit message 是否包含 "release version" 且提交者邮箱是 "lbhdr@outlook.com" | |
| if echo "$COMMIT_MSG" | grep -qi "release version"; then | |
| if [ "$COMMIT_AUTHOR_EMAIL" = "lbhdr@outlook.com" ]; then | |
| echo "trigger_release=true" >> $GITHUB_OUTPUT | |
| echo "✅ Commit message contains 'release version' and author email is 'lbhdr@outlook.com', triggering release" | |
| else | |
| echo "trigger_release=false" >> $GITHUB_OUTPUT | |
| echo "⚠️ Commit message contains 'release version' but author email is '$COMMIT_AUTHOR_EMAIL' (not 'lbhdr@outlook.com'), skipping release" | |
| fi | |
| else | |
| echo "trigger_release=false" >> $GITHUB_OUTPUT | |
| echo "ℹ️ Commit message does not contain 'release version', skipping release" | |
| fi | |
| - name: Generate version number | |
| id: version | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| run: | | |
| # 主版本号 | |
| MAJOR_VERSION=2 | |
| # 获取当前时间(UTC) | |
| YEAR=$(date -u +%y) # 年后两位,例如 25 | |
| MONTH=$(date -u +%m) # 月份,例如 12 | |
| DAY=$(date -u +%d) # 日期,例如 25 | |
| # 使用 date 命令直接获取时分(date 命令默认返回两位数,但可能被 bash 解释为八进制) | |
| HOUR_RAW=$(date -u +%H) # 小时原始值,例如 07 | |
| MINUTE_RAW=$(date -u +%M) # 分钟原始值,例如 16 | |
| # 使用 10# 前缀确保数字被解释为十进制(防止前导零被当作八进制) | |
| # 然后使用 printf 格式化为两位数,确保前导零保留 | |
| HOUR=$(printf "%02d" $((10#$HOUR_RAW))) | |
| MINUTE=$(printf "%02d" $((10#$MINUTE_RAW))) | |
| # 组合版本号:主版本号.年后两位.月日.时分 | |
| # 格式:2.YY.MMDD.HHmm(时分部分始终是4位数字,例如 0716) | |
| # 直接组合格式化后的 HOUR 和 MINUTE,确保前导零保留 | |
| TIME_PART="${HOUR}${MINUTE}" | |
| VERSION="${MAJOR_VERSION}.${YEAR}.${MONTH}${DAY}.${TIME_PART}" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "Generated version: $VERSION" | |
| echo "Version format: ${MAJOR_VERSION}.${YEAR}.${MONTH}${DAY}.${TIME_PART}" | |
| echo "Time part (HHmm): ${TIME_PART} (Hour: ${HOUR}, Minute: ${MINUTE})" | |
| echo "Example: 2.25.1202.0716 = Version 2, Year 2025, Dec 2, 07:16 UTC (时分部分始终是4位数字,前导零保留)" | |
| - name: Setup .NET | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| # .NET SDK 10.0 可以构建所有目标框架:netstandard2.1, net6.0, net7.0, net8.0, net9.0, net10.0 | |
| dotnet-version: '10.0.x' | |
| - name: Verify .NET SDK and target frameworks | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| run: | | |
| echo "=== .NET SDK Information ===" | |
| dotnet --version | |
| echo "" | |
| echo "=== Installed SDKs ===" | |
| dotnet --list-sdks | |
| echo "" | |
| echo "=== Supported Target Frameworks ===" | |
| echo "The project supports: netstandard2.1, net6.0, net7.0, net8.0, net9.0, net10.0" | |
| echo ".NET SDK 10.0 can build all these target frameworks." | |
| - name: Update version in all project files | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| echo "Updating version to $VERSION in all .csproj files..." | |
| # 需要更新的项目列表(排除 Sample 和 Tests) | |
| PROJECTS=( | |
| "Cyaim.WebSocketServer/Cyaim.WebSocketServer/Cyaim.WebSocketServer.csproj" | |
| "Cyaim.WebSocketServer/Cyaim.WebSocketServer.MessagePack/Cyaim.WebSocketServer.MessagePack.csproj" | |
| "Cyaim.WebSocketServer/Dashboard/Cyaim.WebSocketServer.Dashboard/Cyaim.WebSocketServer.Dashboard.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.StackExchangeRedis/Cyaim.WebSocketServer.Cluster.StackExchangeRedis.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.RabbitMQ/Cyaim.WebSocketServer.Cluster.RabbitMQ.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.FreeRedis/Cyaim.WebSocketServer.Cluster.FreeRedis.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.Hybrid/Cyaim.WebSocketServer.Cluster.Hybrid.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.Hybrid.Implementations/Cyaim.WebSocketServer.Cluster.Hybrid.Implementations.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.Hybrid.Redis.FreeRedis/Cyaim.WebSocketServer.Cluster.Hybrid.Redis.FreeRedis.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.Hybrid.MessageQueue.RabbitMQ/Cyaim.WebSocketServer.Cluster.Hybrid.MessageQueue.RabbitMQ.csproj" | |
| "Cyaim.WebSocketServer/Cluster/Cyaim.WebSocketServer.Cluster.Hybrid.Redis.StackExchange/Cyaim.WebSocketServer.Cluster.Hybrid.Redis.StackExchange.csproj" | |
| "Cyaim.WebSocketServer/Clients/Cyaim.WebSocketServer.Client/Cyaim.WebSocketServer.Client.csproj" | |
| ) | |
| UPDATED_COUNT=0 | |
| FAILED_COUNT=0 | |
| for file in "${PROJECTS[@]}"; do | |
| if [ -f "$file" ]; then | |
| echo "Updating: $file" | |
| # 使用 sed 更新版本号 | |
| if sed -i "s/<Version>[0-9.]*<\/Version>/<Version>${VERSION}<\/Version>/g" "$file"; then | |
| # 验证更新 | |
| if grep -q "<Version>${VERSION}</Version>" "$file"; then | |
| echo " ✅ Updated successfully" | |
| UPDATED_COUNT=$((UPDATED_COUNT + 1)) | |
| else | |
| echo " ⚠️ Warning: Version tag not found in expected format" | |
| FAILED_COUNT=$((FAILED_COUNT + 1)) | |
| fi | |
| else | |
| echo " ❌ Failed to update" | |
| FAILED_COUNT=$((FAILED_COUNT + 1)) | |
| fi | |
| else | |
| echo "⚠️ File not found: $file" | |
| FAILED_COUNT=$((FAILED_COUNT + 1)) | |
| fi | |
| done | |
| echo "" | |
| echo "Update summary:" | |
| echo " Updated: $UPDATED_COUNT" | |
| echo " Failed: $FAILED_COUNT" | |
| if [ $FAILED_COUNT -gt 0 ]; then | |
| echo "⚠️ Some files failed to update, but continuing..." | |
| fi | |
| - name: Restore dependencies | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| working-directory: Cyaim.WebSocketServer | |
| run: dotnet restore | |
| - name: Build | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| working-directory: Cyaim.WebSocketServer | |
| run: | | |
| echo "Building all target frameworks: netstandard2.1, net6.0, net7.0, net8.0, net9.0, net10.0" | |
| dotnet build --configuration Release --no-restore | |
| echo "" | |
| echo "=== Build Summary ===" | |
| echo "Checking built assemblies for each target framework..." | |
| find . -path "*/bin/Release/*.dll" -type f | grep -E "(netstandard2.1|net6.0|net7.0|net8.0|net9.0|net10.0)" | sort | |
| - name: Pack | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| working-directory: Cyaim.WebSocketServer | |
| run: | | |
| echo "Packing NuGet packages for all target frameworks..." | |
| dotnet pack --configuration Release --no-build --output ./artifacts | |
| echo "" | |
| echo "=== Package Contents Verification ===" | |
| echo "Each package should contain assemblies for: netstandard2.1, net6.0, net7.0, net8.0, net9.0, net10.0" | |
| - name: List packages | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| run: | | |
| echo "Generated NuGet packages:" | |
| find Cyaim.WebSocketServer/artifacts -name "*.nupkg" -type f | sort | |
| echo "" | |
| echo "Package count:" | |
| find Cyaim.WebSocketServer/artifacts -name "*.nupkg" -type f | wc -l | |
| - name: Verify NuGet API Key | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| run: | | |
| if [ -z "$NUGET_APIKEY" ]; then | |
| echo "❌ Error: NUGET_APIKEY secret is not set!" | |
| echo "Please set the NUGET_APIKEY secret in GitHub repository settings." | |
| echo "Go to: Settings → Secrets and variables → Actions → New repository secret" | |
| exit 1 | |
| else | |
| echo "✅ NUGET_APIKEY secret is set (length: ${#NUGET_APIKEY} characters)" | |
| fi | |
| env: | |
| NUGET_APIKEY: ${{ secrets.NUGET_APIKEY }} | |
| - name: Configure NuGet source | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| run: | | |
| echo "Configuring NuGet source..." | |
| # 移除可能存在的默认源 | |
| dotnet nuget remove source "nuget.org" 2>/dev/null || true | |
| # 添加正确的 NuGet 源 | |
| dotnet nuget add source "https://api.nuget.org/v3/index.json" \ | |
| --name "nuget.org" \ | |
| --username "GitHubActions" \ | |
| --password "$NUGET_APIKEY" \ | |
| --store-password-in-clear-text || true | |
| echo "✅ NuGet source configured" | |
| env: | |
| NUGET_APIKEY: ${{ secrets.NUGET_APIKEY }} | |
| - name: Push to NuGet | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| working-directory: Cyaim.WebSocketServer/artifacts | |
| env: | |
| NUGET_APIKEY: ${{ secrets.NUGET_APIKEY }} | |
| run: | | |
| # 推送所有包到 NuGet | |
| PUSH_COUNT=0 | |
| SUCCESS_COUNT=0 | |
| FAIL_COUNT=0 | |
| # 确保只推送可发布的包(排除 Sample 和 Tests) | |
| for package in *.nupkg; do | |
| if [ -f "$package" ]; then | |
| # 排除示例和测试包 | |
| if [[ "$package" == *"Sample"* ]] || [[ "$package" == *"Tests"* ]] || [[ "$package" == *"Example"* ]]; then | |
| echo "⊘ Skipping (Sample/Tests): $package" | |
| continue | |
| fi | |
| PUSH_COUNT=$((PUSH_COUNT + 1)) | |
| echo "" | |
| echo "[$PUSH_COUNT] Pushing $package to NuGet..." | |
| echo " Source: https://api.nuget.org/v3/index.json" | |
| # 使用环境变量中的 API Key 和明确的源 | |
| if dotnet nuget push "$package" \ | |
| --source "https://api.nuget.org/v3/index.json" \ | |
| --api-key "$NUGET_APIKEY" \ | |
| --skip-duplicate \ | |
| --no-symbols; then | |
| echo " ✅ Successfully pushed: $package" | |
| SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) | |
| else | |
| EXIT_CODE=$? | |
| if [ $EXIT_CODE -eq 0 ]; then | |
| echo " ⊘ Skipped (already exists): $package" | |
| else | |
| echo " ❌ Failed to push: $package (exit code: $EXIT_CODE)" | |
| FAIL_COUNT=$((FAIL_COUNT + 1)) | |
| fi | |
| fi | |
| fi | |
| done | |
| echo "" | |
| echo "=== Push Summary ===" | |
| echo "Total packages: $PUSH_COUNT" | |
| echo "Success: $SUCCESS_COUNT" | |
| echo "Failed: $FAIL_COUNT" | |
| if [ $FAIL_COUNT -gt 0 ]; then | |
| echo "⚠️ Some packages failed to push. Check the errors above." | |
| echo "Common issues:" | |
| echo " 1. NUGET_APIKEY secret not set or incorrect" | |
| echo " 2. API Key expired or invalid" | |
| echo " 3. Package already exists (if not using --skip-duplicate)" | |
| exit 1 | |
| fi | |
| - name: Create GitHub Release | |
| if: steps.check_commit.outputs.trigger_release == 'true' | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| tag_name: v${{ steps.version.outputs.version }} | |
| name: Release v${{ steps.version.outputs.version }} | |
| body: | | |
| ## Version ${{ steps.version.outputs.version }} | |
| Automated release triggered by commit message containing "release version". | |
| ### Published Packages | |
| The following NuGet packages have been published: | |
| - Cyaim.WebSocketServer | |
| - Cyaim.WebSocketServer.MessagePack | |
| - Cyaim.WebSocketServer.Dashboard | |
| - Cyaim.WebSocketServer.Cluster.StackExchangeRedis | |
| - Cyaim.WebSocketServer.Cluster.RabbitMQ | |
| - Cyaim.WebSocketServer.Cluster.FreeRedis | |
| - Cyaim.WebSocketServer.Cluster.Hybrid | |
| - Cyaim.WebSocketServer.Cluster.Hybrid.Implementations | |
| - Cyaim.WebSocketServer.Cluster.Hybrid.Redis.FreeRedis | |
| - Cyaim.WebSocketServer.Cluster.Hybrid.MessageQueue.RabbitMQ | |
| - Cyaim.WebSocketServer.Cluster.Hybrid.Redis.StackExchange | |
| - Cyaim.WebSocketServer.Client | |
| ### Version Format | |
| Version format: `主版本号.年后两位.月日.时分`(时分部分始终是4位数字,例如 0716) | |
| Example: `2.25.1202.0716` = Version 2, Year 2025, Dec 2, 07:16 UTC | |
| files: | | |
| Cyaim.WebSocketServer/artifacts/*.nupkg | |
| draft: false | |
| prerelease: false | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |