이 페이지에서는 hermeticity, hermetic 빌드 사용의 이점, 빌드에서 hermetic이 아닌 동작을 식별하는 전략을 다룹니다.
개요
동일한 입력 소스 코드와 제품 구성이 제공되면 hermetic 빌드 시스템은 항상 호스트 시스템의 변경사항으로부터 빌드를 격리하여 동일한 출력을 반환합니다.
빌드를 격리하기 위해 hermetic 빌드는 로컬 또는 원격 호스트 머신에 설치된 라이브러리 및 기타 소프트웨어에 민감하지 않습니다. 컴파일러와 같은 빌드 도구의 특정 버전과 라이브러리와 같은 종속 항목에 따라 달라집니다. 빌드 환경 외부의 서비스에 의존하지 않으므로 빌드 프로세스가 자체 포함됩니다.
hermeticity의 두 가지 중요한 측면은 다음과 같습니다.
- 격리: Hermetic 빌드 시스템은 도구를 소스 코드로 취급합니다. 도구의 사본을 다운로드하고 관리되는 파일 트리 내에서 스토리지와 사용을 관리합니다. 이렇게 하면 설치된 언어 버전을 비롯하여 호스트 머신과 로컬 사용자 간에 격리가 생성됩니다.
- 소스 ID: Hermetic 빌드 시스템은 입력의 동일성을 보장하려고 합니다. Git과 같은 코드 저장소는 고유한 해시 코드로 코드 변경사항 집합을 식별합니다. Hermetic 빌드 시스템은 이 해시를 사용하여 빌드의 입력 변경사항을 식별합니다.
이점
hermetic 빌드의 주요 이점은 다음과 같습니다.
- 속도: 작업의 출력을 캐시할 수 있으며 입력이 변경되지 않는 한 작업을 다시 실행할 필요가 없습니다.
- 병렬 실행: 지정된 입력 및 출력의 경우 빌드 시스템은 모든 작업의 그래프를 구성하여 효율적이고 병렬 실행을 계산할 수 있습니다. 빌드 시스템은 규칙을 로드하고 작업 그래프와 해시 입력을 계산하여 캐시에서 조회합니다.
- 여러 빌드: 동일한 머신에서 여러 hermetic 빌드를 빌드할 수 있으며 각 빌드는 서로 다른 도구와 버전을 사용합니다.
- 재현성: Hermetic 빌드는 빌드를 생성한 정확한 조건을 알고 있으므로 문제 해결에 유용합니다.
hermeticity가 아닌 동작 식별
Bazel로 전환할 준비를 하고 있다면 기존 빌드의 hermeticity를 미리 개선하는 것이 이전하기 더 쉽습니다. 빌드에서 hermeticity가 아닌 동작의 일반적인 원인은 다음과 같습니다.
.mk파일의 임의 처리- 비결정적으로 파일을 만드는 작업 또는 도구(일반적으로 빌드 ID 또는 타임스탬프 포함)
- 호스트 간에 다른 시스템 바이너리 (예:
/usr/bin바이너리, 절대 경로, 네이티브 C++ 규칙 자동 구성용 시스템 C++ 컴파일러) - 빌드 중에 소스 트리에 쓰기. 이렇게 하면 동일한 소스 트리를 다른 대상에 사용할 수 없습니다. 첫 번째 빌드는 소스 트리에 쓰고 대상 A의 소스 트리를 수정합니다. 그런 다음 대상 B를 빌드하려고 하면 실패할 수 있습니다.
hermetic이 아닌 빌드 문제 해결
로컬 실행부터 시작하여 로컬 캐시 적중률에 영향을 미치는 문제는 hermetic이 아닌 작업을 보여줍니다.
- null 순차 빌드 보장:
make를 실행하고 빌드가 성공하면 빌드를 다시 실행해도 대상을 다시 빌드해서는 안 됩니다. 각 빌드 단계를 두 번 실행하거나 서로 다른 시스템에서 실행하는 경우 파일 콘텐츠의 해시를 비교하고 다른 결과를 얻으면 빌드를 재현할 수 없습니다. - 다양한 잠재적 클라이언트 머신에서 로컬 캐시 적중률을 디버그하는 단계를 실행하여 클라이언트 환경이 작업으로 유출되는 사례를 포착해야 합니다.
- 체크아웃된 소스 트리와 호스트 도구의 명시적 목록만 포함된 Docker 컨테이너 내에서 빌드를 실행합니다. 빌드 중단 및 오류 메시지는 암시적 시스템 종속 항목을 포착합니다.
- 원격 실행 규칙을 사용하여 hermeticity 문제를 발견하고 해결합니다.
- 빌드의 작업은 상태 저장일 수 있고 빌드 또는 출력에 영향을 미칠 수 있으므로 작업별 수준에서 엄격한 샌드박스 를 사용 설정합니다.
- 작업공간 규칙
을 사용하면 개발자가 외부 작업공간에 종속 항목을 추가할 수 있지만 프로세스에서 임의 처리가 발생할 수 있을 만큼
충분히 풍부합니다. Bazel 명령어에
플래그
--experimental_workspace_rules_log_file=PATH를 추가하여 Bazel 작업공간 규칙에서 hermetic이 아닌 작업의 로그를 가져올 수 있습니다.
Bazel을 사용한 hermeticity
Bazel을 사용하여 hermetic 빌드를 성공적으로 사용한 다른 프로젝트에 관한 자세한 내용은 다음 BazelCon 강연을 참고하세요.
- Bazel을 사용하여 실시간 시스템 빌드 (SpaceX)
- Bazel 원격 실행 및 원격 캐싱 (Uber 및 TwoSigma)
- 원격 실행 및 캐싱으로 더 빠른 빌드
- Bazel 융합: 더 빠른 증분 빌드
- 원격 실행과 로컬 실행 비교
- 원격 캐싱의 유용성 개선 (IBM)
- Bazel을 사용하여 자율 주행 자동차 빌드 (BMW)
- Bazel을 사용하여 자율 주행 자동차 빌드 + Q&A (GM Cruise)