이 페이지는 커스텀 빌드 및 테스트 규칙을 작성하는 Bazel 사용자를 대상으로 합니다. 조직의 맥락에서 Bazel 규칙의 요구사항을 이해하려는 실행할 수 있습니다
원격 실행을 통해 Bazel은 별도의 플랫폼에서 다음과 같은 작업을 실행할 수 있습니다. 구성할 수 있습니다 Bazel은 gRPC 프로토콜 할 수 있습니다. 다음을 사용하여 원격 실행을 시도할 수 있습니다. bazel-buildfarm 이 프로젝트는 분산된 원격 실행을 제공하는 것을 목표로 하는 있습니다.
이 페이지에서는 환경 유형 또는 플랫폼:
- 호스트 플랫폼 - Bazel이 실행되는 곳입니다.
- 실행 플랫폼 - Bazel 작업이 실행되는 곳입니다.
- 타겟 플랫폼 - 빌드 출력 (및 일부 작업)이 실행되는 위치입니다.
개요
원격 실행을 위해 Bazel 빌드를 구성할 때는 빌드가 원격으로 실행되도록 하기 위해 이 페이지에 설명된 가이드라인 오류가 없습니다. 이는 원격 실행의 특성 때문입니다. 예를 들면 다음과 같습니다.
격리된 빌드 작업. 빌드 도구가 상태 및 종속 항목을 유지하지 않음 누출되지 않습니다.
다양한 실행 환경. 로컬 빌드 구성이 항상 아님 원격 실행 환경에 적합합니다.
이 페이지에서는 커스텀 Bazel을 구현할 때 발생할 수 있는 문제를 설명합니다. 원격 실행 규칙을 빌드하고 테스트하는 방법과 이를 방지하는 방법을 알아봅니다. 이 가이드에서 다루는 내용은 다음과 같습니다. 다음 주제도 살펴보세요.
도구 모음 규칙을 통해 빌드 도구 호출
Bazel 도구 모음 규칙은 빌드 규칙에
사용할 빌드 도구(예: 컴파일러 및 링커)와 이를 구성하는 방법
규칙을 만들 수 있습니다. 도구 모음 규칙을 통해 빌드 가능
및 테스트 규칙을 사용하여 예측 가능하고 사전 구성된 방식으로 빌드 도구를 호출합니다.
실행되어야 합니다. 예를 들어 도구 모음 규칙을 사용합니다.
PATH
, JAVA_HOME
또는 기타 로컬
원격에서 동등한 값으로 (또는 전혀) 설정되지 않을 수 있는 변수
실행할 수 있습니다
현재 Bazel 빌드에 대한 툴체인 규칙과 Scala, Rust, 및 Go 와 같은 다른 언어 및 도구에 대해서도 새로운 도구 모음 규칙이 bash 규칙에서 사용하는 도구에 대한 도구 모음 규칙이 존재하지 않는 경우 도구 모음 규칙 만들기에 대해 자세히 알아보세요.
암시적 종속 항목 관리
빌드 도구가 빌드 작업 전반에 걸쳐 종속 항목에 액세스할 수 있는 경우 해당 작업은 각 원격 빌드 작업이 실행되므로 원격으로 실행하면 실패하게 됩니다. 서로 분리할 수 있습니다 일부 빌드 도구는 빌드 작업과 도구에 명시적으로 포함되지 않은 종속 항목에 액세스하는 경우 호출하면 원격으로 실행된 빌드 작업이 실패합니다.
예를 들어 Bazel이 스테이트풀(Stateful) 컴파일러에 foo를 로컬로 빌드하도록 지시하는 경우 컴파일러가 foo의 빌드 출력에 대한 참조를 유지합니다. 그러면 Bazel이 는 컴파일러에 설명 없이 foo에 종속되는 bar를 빌드하도록 지시합니다. BUILD 파일에 해당 종속 항목을 컴파일러가 호출되면 작업이 성공적으로 실행됩니다. 컴파일러 인스턴스는 두 작업에 대해 실행됩니다 (로컬 실행의 경우 일반적). 그러나 원격 실행 시나리오에서 각 빌드 작업은 별도의 컴파일러 인스턴스, 컴파일러 상태, bar의 암시적 종속 항목이 foo가 손실되고 빌드가 실패합니다.
Bazel 0.14.1은 이러한 종속성 문제를 감지하고 제거하기 위해 로컬 Docker 샌드박스는 원격 애플리케이션과 종속 항목에 대해 동일한 제한사항이 있습니다. 실행할 수 있습니다 샌드박스를 사용하여 원격 실행을 위해 빌드를 준비하고 종속 항목 관련 빌드 오류 식별 및 해결 Docker 샌드박스로 Bazel 원격 실행 문제 해결을 참조하세요. 를 참조하세요.
플랫폼 종속 바이너리 관리
일반적으로 호스트 플랫폼에서 구축된 바이너리는 컴퓨터에서 안전하게 실행할 수 없습니다. 잠재적으로 일치하지 않는 종속 항목으로 인한 임의의 원격 실행 플랫폼입니다. 예를 들어 Bazel과 함께 제공된 SingleJar 바이너리는 호스트 플랫폼을 대상으로 합니다. 그러나 원격 실행의 경우 SingleJar를 프로세스의 일부로 컴파일해야 합니다. 원격 실행 플랫폼을 대상으로 하도록 코드를 빌드하는 것입니다. ( 대상 선택 로직)
빌드에 필요한 빌드 도구의 바이너리를 소스 코드와 함께 제공하지 마세요. 실행 플랫폼에서 안전하게 실행된다는 확신이 없다면 말이죠. 대신 다음 중 하나:
다음과 같이 도구의 소스 코드를 배송하거나 외부에서 참조합니다. 원격 실행 플랫폼용으로 빌드되었습니다.
이 도구를 원격 실행 환경에 사전 설치합니다 (예: 도구 모음 컨테이너)이 충분히 안정적인 경우 도구 모음 규칙을 사용하여 이를 실행합니다. 확인할 수 있습니다
구성 스타일 WORKSPACE 규칙 관리
Bazel의 WORKSPACE
규칙은 호스트 플랫폼에서 도구를 프로브하는 데 사용할 수 있습니다.
빌드에 필요한 라이브러리로, 로컬 빌드의 경우에는 Bazel의
실행할 수 있습니다 빌드가 로컬 빌드 도구에 명시적으로 종속되고
실행 중 오류가 발생하며, 원격 실행 플랫폼이
호스트 플랫폼과 동일하지 않습니다.
WORKSPACE
규칙으로 수행하는 다음 작업은 호환되지 않습니다.
원격 실행:
바이너리 빌드.
WORKSPACE
규칙에서 컴파일 작업 실행 원격 실행 플랫폼과 호환되지 않는 바이너리가 생성됩니다. 구별합니다.pip
패키지 설치WORKSPACE
을 통해 설치된 패키지pip
개 이러한 규칙의 경우 해당 종속 항목이 호스트 플랫폼에 사전 설치되어 있어야 합니다. 호스트 플랫폼용으로 특별히 빌드된 이러한 패키지는 호스트와 다를 경우 원격 실행 플랫폼과 호환되지 않음 있습니다.로컬 도구 또는 아티팩트에 대한 심볼릭 링크. 도구 또는 라이브러리 심볼릭 링크
WORKSPACE
규칙을 통해 생성된 호스트 플랫폼에 설치된 경우 빌드가 실패하는 이유는 Bazel이 지원하지 않기 때문입니다. 찾아낼 수 있습니다. 대신 표준 빌드 작업을 사용하여 심볼릭 링크를 만들어 Bazel의runfiles
에서 심볼릭 링크 도구 및 라이브러리에 액세스할 수 있습니다. 있습니다.repository_ctx.symlink
사용 안함 외부 저장소 디렉터리 외부의 대상 파일을 심볼릭 링크로 만듭니다호스트 플랫폼 변경. Bazel 외부에 파일을 만들지 않기
runfiles
트리: 환경 변수를 만들고 이와 유사한 작업을 원격 실행 플랫폼에서 예기치 않게 동작할 수 있습니다.
기본 제공되지 않는 잠재적인 동작을 찾으려면 Workspace 규칙 로그를 참고하세요.
외부 종속 항목이 호스트에 종속된 특정 작업을 실행하는 경우
WORKSPACE
및 빌드 간에 이러한 작업을 분할해야 합니다.
규칙을 적용할 수 있습니다.
플랫폼 검사 및 종속 항목 열거. 이러한 연산은
WORKSPACE
규칙을 통해 로컬에서 실행하는 것이 안전하며, 이 규칙을 통해 라이브러리가 설치되고, 빌드해야 하는 패키지를 다운로드하고, 필수 아티팩트를 만들어야 합니다. 이러한 규칙은 원격 실행 시 또한 사전 확인된 아티팩트를 사용하여 일반적으로 호스트 플랫폼 검사 중에 얻게 될 것입니다. 사전 선택됨 아티팩트를 사용하면 Bazel이 종속 항목을 로컬인 것처럼 설명할 수 있습니다. 사용 이를 위해서는 조건문 또는--override_repository
플래그를 사용해야 합니다.타겟별 아티팩트 및 플랫폼 변형 생성 또는 컴파일. 이러한 작업은 일반 빌드 규칙을 통해 실행해야 합니다. 사용자가 외부 종속 항목에 대한 대상별 아티팩트를 생성해야 하며 확인할 수 있습니다
원격 실행을 위해 사전 확인된 아티팩트를 더 쉽게 생성하려면
생성된 파일을 내보내는 WORKSPACE
규칙 이러한 규칙은
실행 환경을 확인하고 각 도구 모음 컨테이너 내부와 같은
원격 실행의 출력이 참조할 소스 저장소에 빌드됩니다.
예를 들어 cuda
에 대한 TensorFlow 규칙의 경우
및 python
,
WORKSPACE
규칙은 다음과 같은 BUILD files
를 생성합니다.
로컬 실행의 경우 호스트 환경을 확인하여 생성된 파일이 사용됩니다.
원격 실행의 경우 조건문
를 사용하면 규칙은 내부에 체크인된 파일을
확인할 수 있습니다
BUILD
파일은 genrules
를 선언합니다.
로컬/원격 모두 실행하고 필요한 처리를 수행할 수 있는
이 작업은 여기에 나온 것처럼 이전에 repository_ctx.symlink
를 통해 실행되었습니다.