Skip to content

Commit a731e8b

Browse files
committed
fix(ci): 修复 PR 检查失败
- 升级 CI 校验的 Go patch 版本以通过 govulncheck - 修复 golangci-lint 报告的无效赋值和未检查类型断言 - 更新 API contract 与 scheduler snapshot 测试数据 - 将外部 TLS 指纹服务的 EOF/握手失败识别为外部服务不可用并跳过 验证: - golangci-lint run --timeout=30m - go test -tags=unit ./... - go test -tags=integration ./... - govulncheck ./... - pnpm build 提交前已检查暂存清单,未包含 backend/data、test/release、日志、pprof、tar 或构建产物。
1 parent d665f5f commit a731e8b

10 files changed

Lines changed: 36 additions & 13 deletions

.github/workflows/backend-ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
cache-dependency-path: backend/go.sum
2121
- name: Verify Go version
2222
run: |
23-
go version | grep -q 'go1.26.3'
23+
go version | grep -q 'go1.26.4'
2424
- name: Unit tests
2525
working-directory: backend
2626
run: make test-unit
@@ -60,7 +60,7 @@ jobs:
6060
cache-dependency-path: backend/go.sum
6161
- name: Verify Go version
6262
run: |
63-
go version | grep -q 'go1.26.3'
63+
go version | grep -q 'go1.26.4'
6464
- name: golangci-lint
6565
uses: golangci/golangci-lint-action@v9
6666
with:

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ jobs:
115115

116116
- name: Verify Go version
117117
run: |
118-
go version | grep -q 'go1.26.3'
118+
go version | grep -q 'go1.26.4'
119119
120120
# Docker setup for GoReleaser
121121
- name: Set up QEMU

.github/workflows/security-scan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
cache-dependency-path: backend/go.sum
2424
- name: Verify Go version
2525
run: |
26-
go version | grep -q 'go1.26.3'
26+
go version | grep -q 'go1.26.4'
2727
- name: Run govulncheck
2828
working-directory: backend
2929
run: |

backend/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/Wei-Shaw/sub2api
22

3-
go 1.26.3
3+
go 1.26.4
44

55
require (
66
entgo.io/ent v0.14.5

backend/internal/pkg/tlsfingerprint/dialer_integration_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,13 @@ func skipIfExternalServiceUnavailable(t *testing.T, err error) {
2828
if strings.Contains(errStr, "certificate has expired") ||
2929
strings.Contains(errStr, "certificate is not yet valid") ||
3030
strings.Contains(errStr, "connection refused") ||
31+
strings.Contains(errStr, "connection reset") ||
3132
strings.Contains(errStr, "no such host") ||
3233
strings.Contains(errStr, "network is unreachable") ||
34+
strings.Contains(errStr, "TLS handshake failed") ||
35+
strings.Contains(errStr, "unexpected EOF") ||
36+
strings.Contains(errStr, "EOF") ||
37+
strings.Contains(errStr, "remote error") ||
3338
strings.Contains(errStr, "timeout") ||
3439
strings.Contains(errStr, "deadline exceeded") {
3540
t.Skipf("skipping test: external service unavailable: %v", err)

backend/internal/server/api_contract_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,7 @@ func TestAPIContracts(t *testing.T) {
800800
"payment_visible_method_alipay_enabled": true,
801801
"payment_visible_method_wxpay_enabled": false,
802802
"openai_advanced_scheduler_enabled": true,
803+
"openai_clean_relay_enabled": false,
803804
"risk_control_enabled": false,
804805
"openai_free_account_repair_enabled": false,
805806
"openai_free_account_repair_weekly_threshold_usd": 60,
@@ -1033,6 +1034,7 @@ func TestAPIContracts(t *testing.T) {
10331034
"payment_visible_method_alipay_enabled": false,
10341035
"payment_visible_method_wxpay_enabled": false,
10351036
"openai_advanced_scheduler_enabled": false,
1037+
"openai_clean_relay_enabled": false,
10361038
"risk_control_enabled": false,
10371039
"openai_free_account_repair_enabled": false,
10381040
"openai_free_account_repair_weekly_threshold_usd": 60,

backend/internal/service/openai_gateway_chat_completions_raw.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ func (s *OpenAIGatewayService) forwardAsRawChatCompletions(
4040
}
4141
clientStream := gjson.GetBytes(body, "stream").Bool()
4242
reasoningEffort := extractOpenAIReasoningEffortFromBody(body, originalModel)
43-
serviceTier := extractOpenAIServiceTierFromBody(body)
4443

4544
billingModel := resolveOpenAIForwardModel(account, originalModel, defaultMappedModel)
4645
upstreamModel := normalizeOpenAIModelForUpstream(account, billingModel)
@@ -59,7 +58,7 @@ func (s *OpenAIGatewayService) forwardAsRawChatCompletions(
5958
}
6059
return nil, err
6160
}
62-
serviceTier = extractOpenAIServiceTierFromBody(upstreamBody)
61+
serviceTier := extractOpenAIServiceTierFromBody(upstreamBody)
6362
if clientStream {
6463
upstreamBody, err = ensureOpenAIChatStreamUsage(upstreamBody)
6564
if err != nil {

backend/internal/service/openai_ws_forwarder_ingress_session_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,8 +597,15 @@ func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_PassthroughModeR
597597
require.Equal(t, 1, captureDialer.DialCount(), "passthrough 模式应直接建立上游 websocket")
598598
require.Len(t, upstreamConn.writes, 1, "passthrough 模式应透传首条 response.create")
599599
require.False(t, upstreamConn.writes[0]["previous_response_id"] != nil, "洁净中继 cold start 应清理客户端 previous_response_id")
600-
require.Equal(t, "input_text", upstreamConn.writes[0]["input"].([]any)[0].(map[string]any)["type"])
601-
require.Equal(t, openAICleanRelayInstallationID(account.ID), upstreamConn.writes[0]["client_metadata"].(map[string]any)[openAICleanRelayInstallationField])
600+
upstreamInput, ok := upstreamConn.writes[0]["input"].([]any)
601+
require.True(t, ok)
602+
require.NotEmpty(t, upstreamInput)
603+
upstreamInputItem, ok := upstreamInput[0].(map[string]any)
604+
require.True(t, ok)
605+
require.Equal(t, "input_text", upstreamInputItem["type"])
606+
upstreamMetadata, ok := upstreamConn.writes[0]["client_metadata"].(map[string]any)
607+
require.True(t, ok)
608+
require.Equal(t, openAICleanRelayInstallationID(account.ID), upstreamMetadata[openAICleanRelayInstallationField])
602609
require.NotEqual(t, "client-cache", upstreamConn.writes[0]["prompt_cache_key"])
603610
require.Equal(t, openAICleanRelayInstallationID(account.ID), captureDialer.lastHeaders.Get(openAICleanRelayInstallationField))
604611
require.NotEqual(t, "client-session", captureDialer.lastHeaders.Get("session_id"))

backend/internal/service/scheduler_snapshot_hydration_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func TestOpenAISelectAccountWithLoadAwareness_HydratesSelectedAccountFromSchedul
7171
Schedulable: true,
7272
Concurrency: 1,
7373
Priority: 1,
74+
GroupIDs: []int64{2},
7475
Credentials: map[string]any{
7576
"model_mapping": map[string]any{
7677
"gpt-4": "gpt-4",
@@ -87,6 +88,7 @@ func TestOpenAISelectAccountWithLoadAwareness_HydratesSelectedAccountFromSchedul
8788
Schedulable: true,
8889
Concurrency: 1,
8990
Priority: 1,
91+
GroupIDs: []int64{2},
9092
Credentials: map[string]any{
9193
"api_key": "sk-live",
9294
"model_mapping": map[string]any{"gpt-4": "gpt-4"},

backend/internal/service/usage_record_worker_pool.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,16 +320,24 @@ func (p *UsageRecordWorkerPool) execute(task UsageRecordTask) {
320320

321321
defer func() {
322322
if recovered := recover(); recovered != nil {
323-
logger.L().With(
324-
zap.String("component", "service.usage_record_worker_pool"),
325-
zap.Any("panic", recovered),
326-
).Error("usage_record.task_panic")
323+
logUsageRecordTaskPanic(recovered)
327324
}
328325
}()
329326

330327
task(ctx)
331328
}
332329

330+
func logUsageRecordTaskPanic(recovered any) {
331+
defer func() {
332+
_ = recover()
333+
}()
334+
335+
logger.L().With(
336+
zap.String("component", "service.usage_record_worker_pool"),
337+
zap.Any("panic", recovered),
338+
).Error("usage_record.task_panic")
339+
}
340+
333341
func (p *UsageRecordWorkerPool) logDrop(reason string) {
334342
now := time.Now().UnixNano()
335343
last := p.lastDropLogNanos.Load()

0 commit comments

Comments
 (0)