diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 5be4dfc..769d56a 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -17,6 +17,7 @@ jobs: outputs: version: ${{ env.VERSION }} should_build: ${{ steps.check-tag.outputs.should_build }} + should_build_gost: ${{ steps.check-tag.outputs.should_build_gost }} tag_exists: ${{ steps.check-tag.outputs.tag_exists }} steps: - uses: actions/checkout@v3 @@ -27,23 +28,34 @@ jobs: run: | echo "Current version: ${{ env.VERSION }}" - - name: Check if tag exists + - name: Check if tag exists and detect changes id: check-tag run: | if git rev-parse "${{ env.VERSION }}" >/dev/null 2>&1; then - echo "Tag ${{ env.VERSION }} already exists, will only update files" - echo "should_build=false" >> $GITHUB_OUTPUT + echo "Tag ${{ env.VERSION }} already exists" echo "tag_exists=true" >> $GITHUB_OUTPUT + echo "should_build=false" >> $GITHUB_OUTPUT + + # 检查从tag到现在,go-gost目录下的文件是否有变化 + TAG_COMMIT=$(git rev-list -n 1 "${{ env.VERSION }}") + if git diff --quiet $TAG_COMMIT HEAD -- go-gost/; then + echo "✅ GOST files unchanged since tag" + echo "should_build_gost=false" >> $GITHUB_OUTPUT + else + echo "🔄 GOST files changed since tag, will rebuild GOST binary" + echo "should_build_gost=true" >> $GITHUB_OUTPUT + fi else echo "Tag ${{ env.VERSION }} does not exist, will build all components" echo "should_build=true" >> $GITHUB_OUTPUT + echo "should_build_gost=true" >> $GITHUB_OUTPUT echo "tag_exists=false" >> $GITHUB_OUTPUT fi build-gost: name: Build & Compress GOST Binary needs: check-version - if: needs.check-version.outputs.should_build == 'true' + if: needs.check-version.outputs.should_build_gost == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -245,10 +257,51 @@ jobs: echo "✅ 所有文件已上传到 Release ${VERSION}" + update-release-gost: + name: Update GOST Binaries in Release + needs: [check-version, build-gost] + if: needs.check-version.outputs.should_build == 'false' && needs.check-version.outputs.should_build_gost == 'true' + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - name: Download GOST AMD64 binary + uses: actions/download-artifact@v4 + with: + name: gost-binary-amd64 + path: ./artifacts/amd64 + + - name: Download GOST ARM64 binary + uses: actions/download-artifact@v4 + with: + name: gost-binary-arm64 + path: ./artifacts/arm64 + + - name: Rename binaries + run: | + mv ./artifacts/amd64/gost-amd64 ./artifacts/gost-amd64 + mv ./artifacts/arm64/gost-arm64 ./artifacts/gost-arm64 + + - name: Update GOST binaries in Release + env: + GH_TOKEN: ${{ github.token }} + run: | + VERSION="${{ needs.check-version.outputs.version }}" + + echo "🔄 更新 Release ${VERSION} 中的 GOST 二进制文件..." + + gh release upload "${VERSION}" ./artifacts/gost-amd64 --clobber + gh release upload "${VERSION}" ./artifacts/gost-arm64 --clobber + + echo "✅ GOST 二进制文件更新完成!" + echo "ℹ️ Docker 镜像未重新构建" + update-release-files: name: Update Release Files Only needs: check-version - if: needs.check-version.outputs.tag_exists == 'true' + if: needs.check-version.outputs.tag_exists == 'true' && needs.check-version.outputs.should_build == 'false' && needs.check-version.outputs.should_build_gost == 'false' runs-on: ubuntu-latest permissions: contents: write diff --git a/go-gost/x/socket/websocket_reporter.go b/go-gost/x/socket/websocket_reporter.go index d164970..02ecd98 100644 --- a/go-gost/x/socket/websocket_reporter.go +++ b/go-gost/x/socket/websocket_reporter.go @@ -1132,6 +1132,34 @@ func tcpPingHost(ip string, port int, count int, timeoutMs int) (float64, float6 fmt.Printf("🔍 开始TCP ping测试: %s,次数: %d,超时: %dms\n", target, count, timeoutMs) + // 如果是域名,先解析一次DNS,避免每次连接都重新解析导致延迟累加 + var resolvedIPs []string + if net.ParseIP(ip) == nil { + // 是域名,需要解析 + fmt.Printf("🔍 检测到域名,正在解析DNS...\n") + dnsStart := time.Now() + + addrs, err := net.LookupHost(ip) + dnsDuration := time.Since(dnsStart) + + if err != nil { + return 0, 100.0, fmt.Errorf("DNS解析失败: %v", err) + } + if len(addrs) == 0 { + return 0, 100.0, fmt.Errorf("DNS解析未返回任何IP地址") + } + + resolvedIPs = addrs + fmt.Printf("✅ DNS解析完成 (%.2fms),解析到 %d 个IP: %v\n", + dnsDuration.Seconds()*1000, len(addrs), addrs) + + // 使用第一个解析到的IP进行测试 + target = net.JoinHostPort(addrs[0], fmt.Sprintf("%d", port)) + fmt.Printf("🎯 使用IP地址进行测试: %s\n", target) + } else { + fmt.Printf("🎯 使用IP地址进行测试: %s\n", target) + } + for i := 0; i < count; i++ { start := time.Now()