Skip to content

fix: 修复连接事件异步等待问题 #53

fix: 修复连接事件异步等待问题

fix: 修复连接事件异步等待问题 #53

Workflow file for this run

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 }}