TT Lab
요금제

한국어

시작하기
블로그

블로그

KubeVirt 소스 코드 읽기 8: 기여 입문 — 리뷰를 읽고, 첫 PR 을 고르고, 시험을 돌리기

상태: 초안 (2026-10-17), 저장소 문서 + 파일 실측. 기준은 KubeVirt v1.9.0(커밋 79d34c17)의 CONTRIBUTING.md, docs/reviewer-guide.md, docs/getting-started.md, OWNERS 파일, PR 템플릿입니다. 시험과 빌드는 돌리지 않았습니다.

KubeVirt 소스 코드 읽기 8: 기여 입문

목차

1. 직관: 사람의 판단과 봇의 라벨

KubeVirt 의 PR 은 사람 둘의 판단이 있어야 병합됩니다. reviewer 가 「코드가 좋다」(/lgtm), approver 가 「이 저장소에 들여도 된다」 (/approve)고 말합니다. 누가 reviewer·approver 인지는 PR 이 건드린 폴더의 OWNERS 파일이 정하고, 말은 PR 댓글의 슬래시 명령으로 합니다. 그 말을 라벨로 바꾸고, 시험 레인을 돌리고, 조건이 다 맞으면 병합하는 것은 prow 라는 봇 묶음입니다. 쿠버네티스와 같은 방식이라 한쪽에서 익히면 다른 쪽에서도 씁니다.

2. 그림

PR 하나가 main 에 들어가기까지 (prow) 코드 글꼴은 사람이 터미널이나 PR 댓글에 치는 명령 git commit -s DCO: Signed-off-by 줄이 없으면 막힌다 PR 열기 — 템플릿 · release-note 블록 첫 기여면 needs-ok-to-test 라벨 /ok-to-test 조직 멤버가 달면 시험 레인이 돈다 prow 레인: 단위 · 린트 · 기능 시험 실패하면 /retest 또는 /test <레인> 리뷰어 자동 배정 바뀐 폴더의 OWNERS → reviewers · approvers /lgtm reviewer 가 「코드가 좋다」 → lgtm 라벨 /approve OWNERS 의 approver 가 「들여도 된다」 → approved tide 가 병합 두 라벨 · 시험 통과 · /hold 없음 실측(v1.9.0): OWNERS 파일 141개 · 저장소 전체 approvers 24명 pkg/virt-controller/watch/vm 의 OWNERS 는 sig-compute 별칭을 쓴다
그림: PR 하나가 main 에 들어가기까지의 명령과 라벨

3. OWNERS 로 지도 다시 보기

v1.9.0 에는 OWNERS 파일이 141개 있습니다(실측). 루트 OWNERS 는 모든 파일의 기본 reviewer·approver 를 별칭 code-reviewers·approvers 로 정하고, 빌드 파일(BUILD.bazel, Makefile 등)은 sig-buildsystem 으로 따로 돌립니다. 폴더의 OWNERS 는 더 좁힙니다. 예를 들어 3편의 pkg/virt-controller/watch/vm/OWNERS 는 이렇습니다.

reviewers:
  - sig-compute-reviewers
approvers:
  - sig-compute-approvers
labels:
  - area/controller
  - sig/compute

출처: kubevirt/kubevirt v1.9.0 pkg/virt-controller/watch/vm/OWNERS(주석 줄 제외, Apache-2.0). 이 폴더를 건드린 PR 에는 prow 가 sig/compute·area/controller 라벨을 붙이고 sig-compute 에서 리뷰어를 고릅니다. 별칭의 실제 이름은 OWNERS_ALIASES 에 있습니다. 인원을 세 보면 이렇습니다(v1.9.0, 실측).

별칭 인원 별칭 인원
approvers(전체) 24 code-reviewers 11
sig-compute-approvers 8 sig-compute-reviewers 7
sig-storage-approvers 4 sig-storage-reviewers 6
sig-network-approvers 3 sig-network-reviewers 4
sig-buildsystem-approvers 3 sig-control-plane-reviewers 7

이 표가 곧 코드 지도의 다른 얼굴입니다. 4·5편의 네트워크 코드(pkg/network, converter/network)는 sig-network, 6편의 스토리지 쪽 (pkg/storage)은 sig-storage, 나머지 대부분은 sig-compute 가 봅니다. 리뷰를 빨리 받고 싶으면 PR 을 한 SIG 의 폴더 안에 머물게 하는 것이 좋습니다. 여러 SIG 를 건드리면 approver 도 여럿이 필요합니다.

4. 명령과 라벨

명령 누가 효과
/ok-to-test 조직 멤버 첫 기여자의 PR 에 붙는 needs-ok-to-test 를 풀어 시험 레인을 돌게 한다(CONTRIBUTING.md 67행)
/test <레인> · /retest 멤버 · 작성자 레인 하나를 다시 / 실패한 레인을 다시
/lgtm reviewer lgtm 라벨. 보통 새 커밋을 올리면 떨어진다
/approve 그 폴더의 approver approved 라벨. 건드린 OWNERS 영역마다 필요
/hold · /unhold 누구나 병합을 잠시 막는다
/cc @이름 · /assign 누구나 사람을 부른다

병합은 사람이 버튼을 누르지 않고 tide 가 합니다. 두 라벨과 시험 통과가 갖춰지고 막는 라벨(do-not-merge/…, /hold)이 없으면 큐에 넣습니다. 초안(draft) PR 은 CI 를 돌리지 않고 리뷰어도 배정되지 않으니, 방향을 묻고 싶을 때는 초안으로 여는 것이 예의입니다.

PR 에 꼭 있어야 하는 것은 셋입니다.

  1. 모든 커밋의 Signed-off-by: — DCO. git commit -s 로 붙입니다. 없으면 DCO 검사가 막습니다.
  2. PR 템플릿의 release-note 블록 — 사용자에게 보일 변화면 한 줄, 아니면 NONE. 릴리스 노트가 이 블록에서 만들어집니다.
  3. 시험 — 리뷰 안내서의 최저선은 「새 코드에는 단위 시험, 새 기능과 버그 수정에는 e2e 시험 하나 이상」 입니다 (reviewer-guide.md:103 부근).

커밋 메시지는 쿠버네티스 규칙을 따릅니다(docs/commit-message-guidelines.md). 제목 50자 안팎·명령형·마침표 없음, 본문은 72자에서 줄바꿈, 본문에 무엇과 왜를 적고 Fixes #123 같은 키워드는 커밋이 아니라 PR 설명에 씁니다. 앞에 net, vmi: 같은 영역 접두사를 붙이는 예가 문서에 있습니다. 그리고 v1.9.0 의 PR 템플릿 체크리스트에는 KubeVirt AI 기여 정책을 지켰는지 묻는 항목이 있습니다. 도구의 도움을 받아 쓴 PR 이면 그 정책을 먼저 읽으세요.

5. 리뷰 안내서가 보라는 것

docs/reviewer-guide.md 는 짧지만, 앞의 일곱 편에서 본 설계가 왜 그런지를 거꾸로 설명해 줍니다. 리뷰를 받을 때 나올 말을 미리 알 수 있습니다.

6. 첫 기여로 좋은 자리

이 시리즈의 지도에서 보면, 처음에는 한 파일과 그 시험만 건드리는 자리가 좋습니다.

7. 시험 돌리는 법과 필요한 도구

이번 글을 쓰며 시험은 돌리지 않았고, 아래 도구도 받지 않았습니다. 필요한 것만 적습니다.

단위 시험. 가장 확실한 길은 저장소가 정한 빌더 컨테이너입니다.

make test                                    # Bazel 로 전체(빌더 컨테이너 안)
make go-test WHAT=./pkg/virt-controller/...  # Bazel 없이 go test (역시 컨테이너 안)

필요한 것은 Docker 또는 Podman, rsync, 그리고 처음 한 번 받는 빌더 이미지(quay.io/kubevirt/builder:<판>, hack/dockerized 19행)입니다. 컨테이너 밖에서 go test 를 바로 돌리려면 go.mod 의 go 1.26.0 에 맞는 Go 와, virt-launcher 쪽 패키지가 cgo 로 쓰는 libvirt 개발 헤더 (libvirt.org/go/libvirt)가 필요합니다. 컨테이너 밖에서 어느 패키지까지 도는지는 import 를 따라가 봐야 해서 이번에는 확인하지 않았습니다 (미확인). 처음에는 컨테이너가 편합니다. 단위 시험도 Ginkgo 라서 하나만 돌릴 때는 -ginkgo.focus='문자열' 을 넘깁니다.

기능 시험. make cluster-up 이 kubevirtci 로 노드를 VM 으로 띄운 클러스터를 만들고, make cluster-sync 가 내 빌드를 올리고, make functest 가 tests/ 를 돌립니다. 일부만 돌릴 때는 FUNC_TEST_ARGS='--focus-file=…' 를 씁니다(docs/getting-started.md 221행). 필요한 것은 중첩 가상화가 되는 리눅스 기계(맥에서는 어렵습니다), 넉넉한 메모리, 그리고 kubevirtci 가 받는 노드 이미지입니다. PR 에서는 이 시험을 prow 레인이 SIG 별로 대신 돌려 주므로, 처음에는 단위 시험까지만 내 기계에서 돌리고 기능 시험은 레인 결과를 읽는 것으로 시작해도 됩니다.

8. 한계

티티 한마디. 첫 PR 은 작을수록 좋아요. 파일 하나, 시험 하나, 왜 바꿨는지 한 문단! 그리고 리뷰 댓글은 공격이 아니라 지도의 빈칸을 채워 주는 거예요. 고맙다고 하고 하나씩 고치면 돼요!

참고

모두 2026-10-17 에 열람했습니다.

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다