밀폐

문제 신고 소스 보기

이 페이지에서는 밀폐성, 밀폐 빌드 사용의 이점, 빌드에서 밀폐된 동작을 식별하기 위한 전략을 설명합니다.

개요

동일한 입력 소스 코드와 제품 구성이 주어지면 밀폐 빌드 시스템은 호스트 시스템 변경사항으로부터 빌드를 격리하여 항상 같은 출력을 반환합니다.

빌드를 격리하기 위해 밀폐 빌드는 로컬 또는 원격 호스트 머신에 설치된 라이브러리 및 기타 소프트웨어에 민감하지 않습니다. 이는 빌드 도구의 특정 버전(예: 컴파일러)과 라이브러리(예: 라이브러리)에 종속됩니다. 이렇게 하면 빌드 프로세스가 외부 환경에 의존하지 않으므로 빌드 프로세스가 독립적입니다.

밀폐의 두 가지 중요한 측면은 다음과 같습니다.

  • 격리: 밀폐 빌드 시스템은 도구를 소스 코드로 취급합니다. 서비스의 사본을 다운로드하고 저장용량을 관리하고 관리형 파일 트리 내에서 사용합니다. 이렇게 하면 설치된 언어 버전을 비롯하여 호스트 머신과 로컬 사용자가 격리됩니다.
  • 소스 ID: 밀폐 빌드 시스템은 입력의 동일성을 보장하려고 시도합니다. Git와 같은 코드 저장소는 고유한 해시 코드로 코드 변형 집합을 식별합니다. 밀폐 빌드 시스템은 이 해시를 사용하여 빌드 입력의 변경사항을 식별합니다.

이점

밀폐 빌드의 주요 이점은 다음과 같습니다.

  • 속도: 작업 출력을 캐시할 수 있으며, 입력이 변경되지 않는 한 작업을 다시 실행할 필요가 없습니다.
  • 병렬 실행: 지정된 입력과 출력에 대해 빌드 시스템은 모든 작업의 그래프를 구성하여 효율적이고 병렬 실행 방식을 계산할 수 있습니다. 빌드 시스템은 규칙을 로드하고 작업 그래프와 해시 입력을 계산하여 캐시에서 조회합니다.
  • 여러 빌드: 같은 머신에 각각 다른 도구와 버전을 사용하여 여러 개의 밀폐식 빌드를 빌드할 수 있습니다.
  • 재현성: 밀폐 빌드는 빌드를 발생시킨 정확한 조건을 알고 있으므로 문제 해결에 유용합니다.

기본 제공 식별

Bazel로의 전환을 준비하는 경우 기존 빌드의 밀폐성을 미리 개선하면 더 쉽게 이전할 수 있습니다. 빌드에서 기본 제공되지 않는 일반적인 소스는 다음과 같습니다.

  • 파일 .mk개의 임의 처리
  • 일반적으로 빌드 ID 또는 타임스탬프가 포함된 비결정적으로 파일을 생성하는 작업 또는 도구
  • 호스트 간에 다른 시스템 바이너리 (예: /usr/bin 바이너리, 절대 경로, 네이티브 C++ 규칙 자동 구성용 시스템 C++ 컴파일러)
  • 빌드 중에 소스 트리에 쓰기 이렇게 하면 다른 타겟에 동일한 소스 트리가 사용되지 않습니다. 첫 번째 빌드는 소스 트리에 쓰면서 대상 A의 소스 트리를 수정합니다. 그러면 대상 B를 빌드하려고 하면 실패할 수 있습니다.

기본 제공되지 않는 빌드 문제 해결

로컬 실행부터 로컬 캐시 적중에 영향을 미치는 문제에는 기본 제공되지 않는 작업이 드러납니다.

  • null 순차 빌드를 확인합니다. make를 실행하고 빌드를 성공으로 나타내면 빌드를 다시 실행하면 대상이 다시 빌드되지 않습니다. 각 빌드 단계를 두 번 실행하거나 서로 다른 시스템에서 실행하는 경우 파일 콘텐츠의 해시를 비교하여 다른 결과가 나오면 빌드를 재현할 수 없습니다.
  • 다양한 클라이언트 시스템에서 로컬 캐시 적중을 디버그하는 단계를 실행하여 작업에 누출되는 클라이언트 환경이 있는 경우를 모두 포착합니다.
  • 체크아웃된 소스 트리와 호스트 도구의 명시적 목록만 포함하는 Docker 컨테이너 내에서 빌드를 실행합니다. 빌드 중단 및 오류 메시지가 암시적 시스템 종속 항목을 포착합니다.
  • 원격 실행 규칙을 사용하여 밀폐 문제를 발견하고 해결합니다.
  • 빌드의 작업은 스테이트풀(Stateful)일 수 있고 빌드 또는 출력에 영향을 줄 수 있으므로 작업 수준별로 엄격한 샌드박스를 사용 설정합니다.
  • 작업공간 규칙을 사용하면 개발자가 외부 작업공간에 종속 항목을 추가할 수 있지만, 이 리스트는 그 과정에서 임의의 처리가 이루어질 수 있을 정도로 풍부합니다. Bazel 명령어에 --experimental_workspace_rules_log_file=PATH 플래그를 추가하여 Bazel 작업공간 규칙에서 밀폐되지 않을 수 있는 일부 작업의 로그를 가져올 수 있습니다.

Bazel과의 밀폐성

Bazel과 함께 밀폐 빌드를 사용하여 다른 프로젝트가 성공한 방법을 자세히 알아보려면 다음 BazelCon 강연을 참고하세요.