Skip to content

[fix] main CI lint 실패 90건을 테스트 코드에서 고친다 #563

Closed

Description

@m16khb

요약

main의 CI verify job이 golangci-lint 단계에서 90건을 지적받고 실패한다. 이 단계가 실패하면 Build, race 테스트, self-verify 단계가 건너뛰어지므로 main에서 갈라진 PR은 변경 내용과 상관없이 체크가 실패한다. 지금 #562(#561)가 이 이유로 머지되지 못하고 있다.

원인

지적은 2026-10-12에 main으로 들어온 테스트 보강 커밋들(mutation 대응·coverage 확대)에서 생겼다. 그날 7ad771aa까지는 CI가 통과했고 dd271b8b부터 실패한다. 지적된 위치는 모두 *_test.go 파일이다.

종류 건수 내용
errcheck 62 requireOrcaCode, persistenceFailure, requiredPlanError처럼 error 타입을 돌려주는 테스트 helper의 반환값을 버린다. mcpservice/instance_test.go의 defer instance.Release()도 포함된다
govet inline 25 //go:fix inline이 붙은 helper(orcaTestUint64, handoffTestUint64, durationRef, i64)를 호출한다
unused 3 executioncmd의 explicitActor, issueopscycle의 prefetches 필드, selfverify의 stepLabels

재현 절차

  1. main을 체크아웃한다.
  2. CI와 같은 golangci-lint v2.12.2를 설치한다: GOBIN=/tmp/golangci-v2 go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.12.2
  3. Linux 기준으로 실행한다: GOOS=linux GOTOOLCHAIN="go$(go list -m -f '{{.GoVersion}}')" /tmp/golangci-v2/golangci-lint run ./...
90 issues:
* errcheck: 62
* govet: 25
* unused: 3

CI에서는 main push run 38562720520과 PR #562의 run 38692432299, 38692437854가 같은 90건으로 실패했다.

기대 동작과 실제 동작

  • 기대 동작: main에서 golangci-lint가 지적 없이 끝나고, CI verify job이 Build·race 테스트·self-verify까지 실행해 통과한다.
  • 실제 동작: lint 단계에서 90건으로 실패하고 뒤 단계는 모두 skipped로 남는다. 그래서 어느 PR도 CI 검증을 받지 못하고 merge-pr는 checks_failing으로 머지를 거부한다.

범위와 비목표

  • 범위: golangci-lint가 지목한 테스트 파일에서 지적 90건을 코드로 고친다. 반환값을 쓰지 않는 helper 호출은 값을 검사에 쓰거나 helper 형태를 바꾸고, inline 지적은 호출을 new(...)로 바꾸고, 쓰지 않는 선언은 지운다.
  • 비목표: .golangci.yml에 제외 규칙이나 //nolint를 더해 지적을 숨기지 않는다. .issueops/cautions/2026-10-03-native-http-validation-and-lint-toolchain.md의 "실제 errcheck·deprecated API·unused 지적은 코드와 테스트에서 해결한다." 규칙을 따른다.
  • 비목표: production 코드와 CLI/MCP 계약은 바꾸지 않는다. remote score 라벨 점수가 한국어 이슈에서 라벨을 거의 고르지 못한다 #561 사이클의 base 동기화와 재검증은 이 이슈가 머지된 뒤 그 사이클에서 따로 진행한다.
  • orca 테스트 파일도 함께 고친다. [refactor] Orca 연동을 걷어내고 direct 실행과 Herdr·수동 터미널 인계만 남긴다 #560(Orca 연동 제거)은 아직 계획 단계라서, 그것을 기다리면 main CI가 계속 실패한다. #560이 나중에 같은 파일을 지우면 그쪽의 삭제를 따르면 된다.

완료 기준

  • 재현 절차의 golangci-lint 명령이 0 issues.로 끝난다.
  • go vet ./..., go test ./... -count=1, go test -race ./... -count=1, go build ./cmd/issueops가 통과한다.
  • 이 이슈 PR의 CI verify job이 lint 이후 단계까지 모두 통과한다.
  • .golangci.yml 설정과 //nolint 주석 수가 늘지 않는다.

검증

GOOS=linux GOTOOLCHAIN="go$(go list -m -f '{{.GoVersion}}')" /tmp/golangci-v2/golangci-lint run ./...
go vet ./...
go test ./... -count=1
go test -race ./... -count=1
go build -o bin/issueops ./cmd/issueops
git diff --stat origin/main -- .golangci.yml

기대 결과: lint는 0 issues.를 출력하고, 나머지 명령은 exit 0으로 끝나며, .golangci.yml diff는 비어 있다.

계획 검토

계획 검토: 1차 수정 요청(지적 3건) → 계획 수정 → 2차 통과(지적 3건)

진행 결과

main CI의 golangci-lint 지적 90건을 설정 제외나 //nolint 없이 테스트 코드에서 고쳤고, 그동안 lint에 가려 있던 internal/adapter/update 테스트의 Linux 전용 결함도 함께 고쳤습니다. PR #564가 squash로 머지되어 main CI가 다시 Lint, Build, race 테스트, self-verify 단계까지 통과합니다.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions