메인 콘텐츠로 건너뛰기
풀 리퀘스트를 제출하면 ClickHouse 지속적 통합(CI) 시스템이 코드에 대해 몇 가지 자동화된 검사를 실행합니다. 이 과정은 리포지토리 메인테이너(ClickHouse 팀 구성원)가 코드를 검토한 뒤 풀 리퀘스트에 can be tested 레이블을 추가하면 진행됩니다. 검사 결과는 GitHub checks documentation에 설명된 대로 GitHub 풀 리퀘스트 페이지에 표시됩니다. 검사가 실패하면 수정이 필요할 수 있습니다. 이 페이지에서는 마주칠 수 있는 검사를 개괄적으로 설명하고, 이를 해결하기 위해 수행할 수 있는 작업을 안내합니다. 검사 실패가 변경 사항과 관련이 없어 보인다면, 일시적인 실패이거나 인프라 문제일 수 있습니다. 풀 리퀘스트에 빈 커밋을 푸시하여 CI 검사를 다시 시작하십시오:
git commit --allow-empty
git push
어떻게 해야 할지 잘 모르겠다면 메인테이너에게 도움을 요청하십시오.

master와 머지

PR을 master에 머지할 수 있는지 확인합니다. 머지할 수 없으면 Cannot fetch mergecommit 메시지와 함께 실패합니다. 이 검사를 통과하려면 GitHub 문서에 설명된 대로 충돌을 해결하거나, git을 사용해 master 브랜치를 pull request 브랜치에 머지하십시오.

문서 검사

ClickHouse 문서 웹사이트 빌드를 시도합니다. 문서를 변경한 경우 실패할 수 있습니다. 가장 가능성이 높은 원인은 문서 내 일부 교차 링크가 잘못되었기 때문입니다. 검사 보고서로 이동하여 ERRORWARNING 메시지를 확인하십시오.

설명 검사

풀 리퀘스트 설명이 템플릿 PULL_REQUEST_TEMPLATE.md을 준수하는지 확인하십시오. 변경 사항에 대한 changelog 카테고리(예: Bug Fix)를 지정하고, CHANGELOG.md에 변경 내용을 설명하는 사용자가 이해할 수 있는 메시지를 작성해야 합니다.

Docker 이미지

ClickHouse 서버와 Keeper Docker 이미지를 빌드하여 정상적으로 빌드되는지 확인합니다.

공식 Docker 라이브러리 테스트

공식 Docker 라이브러리의 테스트를 실행해 clickhouse/clickhouse-server Docker 이미지가 올바르게 동작하는지 확인합니다. 새 테스트를 추가하려면 디렉터리 ci/jobs/scripts/docker_server/tests/$test_name를 만들고 그 안에 run.sh 스크립트를 생성하십시오. 테스트에 대한 추가 정보는 CI jobs scripts 문서에서 확인할 수 있습니다.

Marker 검사

이 검사는 CI 시스템이 풀 리퀘스트 처리를 시작했음을 나타냅니다. 상태가 ‘pending’이면 아직 모든 검사가 시작되지 않았다는 의미입니다. 모든 검사가 시작되면 상태가 ‘success’로 변경됩니다.

스타일 검사

코드베이스에서 다양한 스타일 검사를 수행합니다. Style Check 작업의 기본 검사 항목:
cpp
ci/jobs/scripts/check_style/check_cpp.sh 스크립트를 사용해 간단한 정규식 기반 code style 검사를 수행합니다(로컬에서도 실행할 수 있습니다). 검사에 실패하면 코드 스타일 가이드에 따라 스타일 문제를 수정하세요.
codespell, aspell
문법 오류와 오탈자를 점검합니다.
mypy
Python 코드의 정적 타입 검사를 수행합니다.

로컬에서 Style Check 작업 실행하기

전체 Style Check 작업은 다음과 같이 Docker 컨테이너에서 로컬로 실행할 수 있습니다:
python -m ci.praktika run "Style check"
특정 체크를 실행하려면(예: cpp 체크):
python -m ci.praktika run "Style check" --test cpp
이 명령은 clickhouse/style-test Docker 이미지를 가져와 컨테이너화된 환경에서 작업을 실행합니다. Python 3와 Docker 외에는 별도의 종속성이 필요하지 않습니다.

stateless tests 실행하기

기본 설정으로 로컬에 설치한 ClickHouse는 일부 테스트 케이스에서는 동작할 수 있지만, 모든 테스트 쿼리를 올바르게 실행할 수는 없습니다. CI에서는 각 작업마다 특정 ClickHouse 구성(예: S3 storage, 병렬 레플리카)을 설치하므로 이를 수동으로 재현하기가 번거로울 수 있습니다. 이런 번거로움을 피하려면 CI와 동일한 오케스트레이션을 사용해 로컬에서 모든 CI 작업을 재현할 수 있으며, 수동 구성은 필요하지 않습니다.

사전 요구 사항

  • Python 3 (표준 라이브러리만)
  • Docker
필요한 경우 Ubuntu에 Docker를 설치한 후 다시 로그인하십시오:
sudo apt-get update
sudo apt-get install docker.io
sudo usermod -aG docker "$USER"
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "ipv6": true,
  "ip6tables": true
}
EOF
sudo systemctl restart docker

CI 작업을 로컬에서 실행하기

CI 보고서에서 원하는 job 이름을 선택한 다음 로컬에서 실행하십시오:
python -m ci.praktika run "<JOB_NAME>"
  • 항상 CI 보고서에 표시된 작업 이름을 그대로 정확히 따옴표로 묶어 사용하십시오(공백과 쉼표가 포함될 수 있음). 예: "Stateless tests (amd_debug, parallel)". 이렇게 하면 CI와 동일한 ClickHouse 구성이 설정되고 동일한 테스트가 실행됩니다.
  • 작업 이름에 포함된 아키텍처와 빌드 유형(예: amd_debug)은 CI 전용 레이블입니다. 로컬에서 실행할 때는 영향을 주지 않습니다. 즉, 현재 실행 중인 아키텍처와 제공한 바이너리가 무엇이든 작업은 그것을 사용합니다. 작업 이름은 ClickHouse 구성과 테스트 세트만 결정합니다(--test로 재정의하지 않는 한).
  • CI에서는 리소스를 더 효율적으로 활용하기 위해 기능 테스트를 여러 배치로 나누어 실행합니다. 예를 들어 "Stateless tests (amd_debug, parallel)""Stateless tests (amd_debug, sequential)"를 함께 실행하면 전체 범위를 포괄합니다. 병렬 실행이 안전한 테스트는 동시에 실행되고, 나머지는 순차적으로 실행됩니다. 이렇게 분할하면 가능한 범위에서 병렬성을 극대화하여 전체 CI 시간을 줄일 수 있습니다. 로컬에서 전체 테스트 범위를 재현하려면 두 배치를 모두 실행하십시오.
  • 제한된 범위의 기능 테스트를 실행해 ClickHouse의 기본 기능을 검증하는 "Fast test" CI 작업도 있습니다. 이 작업은 모든 선택적 모듈이 포함되지 않은 빌드를 사용하며, 회귀를 가장 빠르게 찾아내는 방법입니다. 로컬에서도 같은 방식으로 실행할 수 있습니다. ClickHouse 바이너리를 기본 검색 경로 중 하나(./ci/tmp/clickhouse, ./build/programs/clickhouse, 또는 ./clickhouse)에 두십시오. 그렇지 않으면 작업이 먼저 ClickHouse를 빌드하려고 시도합니다:
    python -m ci.praktika run "Fast test"
    

CI 작업 내에서 특정 테스트 실행

--test를 사용하면 CI에서 사용하는 것과 동일한 ClickHouse 구성을 준비한 뒤, 선택한 테스트만 실행합니다:
python -m ci.praktika run "Stateless tests (amd_debug, parallel)" \
  --test 00001_select1
  • 여러 테스트 이름을 지정할 수 있습니다:
    python -m ci.praktika run "Stateless tests (amd_debug, parallel)" \
      --test 00001_select1 00002_log_and_exception_messages_formatting
    
  • 팁: ClickHouse 구성은 아무 것이나 상관없고 특정 테스트만 실행하면 되는 경우, 전체 작업 이름 대신 별칭 functional을 사용하세요:
    python -m ci.praktika run functional --test 00001_select1
    

추가 사용자 설정 옵션

  • --path PATH — ClickHouse 실행 파일의 사용자 지정 경로입니다. 기본적으로 러너는 ./ci/tmp/clickhouse, ./build/programs/clickhouse, ./clickhouse 순서대로 검색합니다.
  • --count N — 각 테스트를 N번 반복합니다.
  • --workers N — 머신 용량을 기준으로 자동 계산되는 병렬 워커 수를 재정의합니다.

빌드 검사

후속 단계에서 사용할 수 있도록 다양한 구성으로 ClickHouse를 빌드합니다.

로컬에서 빌드 실행하기

다음을 사용하면 CI와 유사한 환경에서 로컬로 빌드를 실행할 수 있습니다.
python -m ci.praktika run "<BUILD_JOB_NAME>"
Python 3와 Docker 외에는 추가 의존성이 필요하지 않습니다.

사용 가능한 빌드 작업

빌드 작업 이름은 CI Report에 표시되는 이름과 정확히 동일합니다. AMD64 빌드:
  • Build (amd_debug) - 심볼이 포함된 디버그 빌드
  • Build (amd_release) - 최적화된 릴리스 빌드
  • Build (amd_asan) - Address Sanitizer 빌드
  • Build (amd_tsan) - Thread Sanitizer 빌드
  • Build (amd_msan) - Memory Sanitizer 빌드
  • Build (amd_ubsan) - Undefined Behavior Sanitizer 빌드
  • Build (amd_binary) - Thin LTO 없이 빠르게 생성하는 릴리스 빌드
  • Build (amd_compat) - 구형 시스템용 호환성 빌드
  • Build (amd_musl) - musl libc를 사용한 빌드
  • Build (amd_darwin) - macOS 빌드
  • Build (amd_freebsd) - FreeBSD 빌드
ARM64 빌드:
  • Build (arm_release) - ARM64용 최적화 릴리스 빌드
  • Build (arm_asan) - ARM64 Address Sanitizer 빌드
  • Build (arm_coverage) - 커버리지 계측이 포함된 ARM64 빌드
  • Build (arm_binary) - Thin LTO 없이 빠르게 생성하는 ARM64 릴리스 빌드
  • Build (arm_darwin) - macOS ARM64 빌드
  • Build (arm_v80compat) - ARMv8.0 호환성 빌드
기타 아키텍처:
  • Build (ppc64le) - PowerPC 64비트 리틀 엔디안
  • Build (riscv64) - RISC-V 64비트
  • Build (s390x) - IBM System/390 64비트
  • Build (loongarch64) - LoongArch 64비트
작업이 성공하면 빌드 결과는 <repo_root>/ci/tmp/build 디렉터리에서 확인할 수 있습니다. 참고: “기타 아키텍처” 범주에 속하지 않는 빌드에는 교차 컴파일이 사용되므로, BUILD_JOB_NAME에서 요청한 빌드를 생성하려면 로컬 머신의 아키텍처가 빌드 유형과 일치해야 합니다.

예시

로컬 디버그 빌드를 실행하려면 다음을 수행하십시오.
python -m ci.praktika run "Build (amd_debug)"
위 방법이 맞지 않는다면, 빌드 로그의 cmake 옵션을 사용하고 일반 빌드 프로세스를 따르십시오.

상태 비저장 기능 테스트

Release, Debug, sanitizer 사용 등 다양한 구성으로 빌드된 ClickHouse 바이너리에 대해 상태 비저장 기능 테스트를 실행합니다. 어떤 테스트가 실패하는지 보고서에서 확인한 다음, 여기에 설명된 대로 로컬에서 실패를 재현하십시오. 재현할 때는 올바른 빌드 구성을 사용해야 합니다. 예를 들어 테스트가 AddressSanitizer에서는 실패하지만 Debug에서는 통과할 수 있습니다. CI 빌드 검사 페이지에서 바이너리를 다운로드하거나 로컬에서 빌드하십시오.

통합 테스트

통합 테스트를 실행합니다.

버그 수정 검증 검사

새 테스트(기능 또는 통합)가 있거나, master 브랜치에서 빌드한 바이너리에서 실패하는 변경된 테스트가 있는지 확인합니다. 이 검사는 풀 리퀘스트에 “pr-bugfix” 레이블이 있을 때 실행됩니다.

스트레스 테스트

여러 클라이언트에서 상태 비저장 기능 테스트를 동시에 실행하여 동시성 관련 오류를 감지합니다. 실패하면:
  • 먼저 다른 테스트 실패를 모두 해결하십시오;
    • 보고서에서 서버 로그를 찾아 오류의 가능한 원인을 확인하십시오.

호환성 검사

오래된 libc 버전의 배포판에서도 clickhouse 실행 파일이 실행되는지 확인합니다. 실패하면 메인테이너에게 도움을 요청하십시오.

AST fuzzer

무작위로 생성된 쿼리를 실행해 프로그램 오류를 찾아냅니다. 실패하면 메인테이너에게 도움을 요청하십시오.

성능 테스트

쿼리 성능의 변화를 측정합니다. 자동으로 실행되는 검사 중 가장 오래 걸리며, 완료까지 6시간이 채 걸리지 않습니다. 성능 테스트 보고서에 대한 자세한 설명은 여기에 있습니다.
마지막 수정일 2026년 6월 10일