Claude의 MCP를 사용한 완전 자동 SonarCloud 파이프라인 구축
Source: Dev.to
위의 링크에 있는 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. (코드 블록, URL 및 기술 용어는 그대로 유지됩니다.)
소개
터미널, GitHub, 그리고 SonarCloud 웹 UI를 계속 전환하지 않고도 SonarCloud 코드‑품질 보고서를 원했습니다.
목표: Claude Code에서 한 번의 명령만 입력하면 즉시 전체 품질 보고서를 받아볼 수 있습니다.
결과적으로 Claude Code의 MCP (Model Context Protocol) 생태계가 이를 가능하게 하지만, 도달하기 위해서는 다음과 같은 과정이 필요했습니다:
- 9개의 개별 실패
- 3개의 PAT 권한 업데이트
- GitHub가 CI 상태를 보고하는 방식에 대한 중요한 발견 1건
내가 만든 것
완전 자동화된 파이프라인:
You write code
→ Claude commits & pushes
→ Creates PR via GitHub MCP
→ GitHub Actions runs sonar‑scanner
→ Claude polls for completion
→ Pulls report via SonarQube MCP
→ Shows quality gate + issues table
| 지표 | 값 |
|---|---|
| 총 소요 시간 (commit → report) | ~2.5 minutes |
| 수동 단계 (after one‑time setup) | 0 |
Source:
The Stack
| Component | Role |
|---|---|
| Claude Code CLI | 오케스트레이터 |
| mcp/sonarqube | SonarCloud 데이터 읽기 — 품질 게이트, 이슈, 메트릭 |
| ghcr.io/github/github‑mcp‑server | 저장소, 브랜치, PR 관리 |
| GitHub Actions | sonar‑scanner 실행 |
| SonarCloud (free tier) | 분석 결과 호스팅 |
설정: Happy Path (~30 분)
SonarCloud
- **“Analyze new project”**를 통해 프로젝트를 가져옵니다 (수동으로 만들지 마세요).
- 자동 분석 비활성화.
- 프로젝트 분석 토큰을 생성합니다 (사용자 토큰이 아니라 – Challenge #3 참고).
GitHub PAT (세분화된)
| 권한 | 수준 | 이유 |
|---|---|---|
| Contents | Read & Write | 파일 푸시 |
| Workflows | Read & Write | .github/workflows/ 파일 생성 |
| Actions | Read & Write | 워크플로 실행 관리 |
| Pull requests | Read & Write | PR 생성 |
| Commit statuses | Read | CI 상태 조회 |
| Metadata | Read | 필요 |
이 중 하나라도 누락되면 다양한 단계에서 403 오류가 발생합니다.
Workflows와 Commit statuses가 가장 흔히 누락됩니다.
MCP 서버
# Pull Docker images
docker pull mcp/sonarqube
docker pull ghcr.io/github/github-mcp-server
# Add to Claude Code (run from terminal, NOT inside Claude)
claude mcp add sonarqube \
--env SONARQUBE_TOKEN=YOUR_TOKEN \
--env SONARQUBE_ORG=YOUR_ORG \
-- docker run -i --rm -e SONARQUBE_TOKEN -e SONARQUBE_ORG mcp/sonarqube
claude mcp add github \
-e GITHUB_PERSONAL_ACCESS_TOKEN=YOUR_PAT \
-- docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN \
ghcr.io/github/github-mcp-server
# RESTART Claude Code (MCP servers only load on startup)
GitHub Actions 워크플로
리포지토리에 두 개 파일을 추가합니다:
sonar-project.properties
sonar.projectKey=YourOrg_yourrepo
sonar.organization=yourorg
sonar.sources=src
sonar.exclusions=**/node_modules/**,**/dist/**
.github/workflows/sonarcloud.yml
name: SonarCloud Analysis
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
sonarcloud:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: SonarSource/sonarqube-scan-action@v5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Claude는 GitHub MCP를 통해 두 파일을 생성할 수 있습니다 — 수동 파일 생성이 필요 없습니다.
브라우저에서 수행해야 하는 유일한 단계: SONAR_TOKEN을 GitHub Actions 비밀로 추가합니다.
9가지 과제 (순서대로)
| # | Issue | Fix |
|---|---|---|
| 1 | MCP Server Not Connecting – claude mcp add 로 서버를 추가했지만 도구가 보이지 않음. | Claude Code를 재시작 (서버는 시작 시에만 로드됩니다). |
| 2 | Docker Image Not Pulled – 설정은 올바른데 서버가 시작되지 않음. | 먼저 docker pull mcp/sonarqube 실행. |
| 3 | “Project Not Found” – 스캐너는 실행됐지만 프로젝트를 찾을 수 없음. | Project Analysis Token 사용 (SonarCloud → My Account → Security). |
| 4 | 403 on Workflow File – Claude가 .github/workflows/sonarcloud.yml 파일을 생성하지 못함. | PAT에 Workflows: Read & Write 권한 추가. |
| 5 | Invalid sonar.sources – 스캔 중인 브랜치에 소스 디렉터리가 존재하지 않음. | sonar.sources가 해당 브랜치에 존재하는 디렉터리를 가리키도록 설정. |
| 6 | Automatic Analysis Conflict – “You are running CI analysis while Automatic Analysis is enabled.” | SonarCloud UI에서 Automatic Analysis 비활성화 (MCP에서는 설정 불가). |
| 7 | Branch Analysis 404 – 품질 게이트가 비기본 브랜치에 대해 404 반환. | 무료 플랜은 main + PR 분석만 지원. PR 기반 분석 사용. |
| 8 | Go Not Supported by Automatic Analysis – 자동 분석은 JS/TS, Python, Java, C#만 지원. | 컴파일 언어는 GitHub Actions CI 방식 사용. |
| 9 | PR Creation 403 – PAT에 Pull‑request 권한이 없음. | PAT에 Pull requests: Read & Write 권한 추가. |
흥미로운 발견: GitHub 상태 vs. 체크 런
폴링 중에 pull_request_read(get_status)를 사용해 CI가 완료됐는지 확인했지만, SonarCloud가 끝난 뒤에도 **“pending”**이 계속 반환되었습니다.
왜 그럴까요? SonarCloud는 결과를 **GitHub 체크 런(Check Runs)**을 통해 보고하고, **커밋 상태(Commit Statuses)**를 통해서는 보고하지 않습니다. get_status 메서드는 커밋 상태만 확인하므로, 완료된 체크 런을 절대 감지하지 못합니다.
해결 방법: SonarQube MCP를 기본 폴링 방법으로 사용하세요:
get_project_quality_gate_status(pullRequest: "PR_NUMBER")
이 호출이 오류 대신 데이터를 반환하면 분석이 완료된 것입니다—GitHub 상태 API보다 훨씬 신뢰할 수 있습니다.
Dry‑Run 결과
| 단계 | 시간 |
|---|---|
| Commit + push | ~5 s |
| Create PR | ~2 s |
| Poll (4 × 30 s) | ~2 min |
| Pull report | ~3 s |
| 총합 | ~2.5 분 |
품질 게이트
❌ FAILED (intentionally)
발견된 이슈
6개 – 2 Critical, 1 Major, 3 Minor
승인 피로 해소
기본적으로 Claude Code는 모든 도구 호출에 대해 허가를 요청합니다. 자동화된 흐름에서는 이 때문에 경험이 망가집니다.
해결책: .claude/settings.local.json에 자동 승인 블록을 추가합니다:
{
"permissions": {
"allow": [
"Bash(git status:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git push:*)",
"Bash(sleep:*)",
"mcp__sonarqube__get_project_quality_gate_status",
"mcp__sonarqube__search_sonar_issues_in_projects",
"mcp__github__create_pull_request",
"mcp__github__pull_request_read"
]
}
}
이렇게 하면 필요한 Git 명령, 폴링 대기(sleep), 그리고 MCP 도구 호출이 자동으로 승인되어 진정한 한 번의 명령 경험을 제공합니다.
MCP가 할 수 있는 것과 할 수 없는 것
✅ 할 수 있는 것
- 품질 게이트, 이슈, 메트릭 읽기
- GitHub Actions 재실행 트리거
- 파일, 브랜치, PR 생성
- GitHub 시크릿 생성
- 커밋 푸시, diff 읽기
- SonarCloud 프로젝트 설정 변경
- 로컬에서 코드 스니펫 분석
- 워크플로 로그를 실시간으로 모니터링
❌ 아직 할 수 없는 것
(항목이 없습니다)
무료 티어 팁
- Private repos: 50 k 라인 무료.
sonar.exclusions를 적극적으로 사용하세요. - PR analysis: 무료 티어에서 작동하며 새 코드만 스캔합니다 — 제한을 초과하지 않기 위한 최적 전략입니다.
- Branch analysis: 유료 티어가 필요합니다. 대신 PR을 사용하세요.
전체 가이드
위 내용에 예제 구성 파일, “Claude에 피드하기” 지침(어떤 Claude Code 인스턴스도 흐름을 실행할 수 있도록), 그리고 상세한 문제 해결이 추가됩니다:
aadhin/claude-sonarcloud‑guide on GitHub
Go + React/TypeScript 데스크톱 앱(Wails v2) 작업 중에 제작되었습니다. SonarCloud 무료 티어 + GitHub Actions CI.