원격 실행을 위한 Bazel 규칙 조정

문제 신고 소스 보기 Nightly · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

이 페이지는 원격 실행 컨텍스트에서 Bazel 규칙의 요구사항을 이해하려는 맞춤 빌드 및 테스트 규칙을 작성하는 Bazel 사용자를 위해 작성되었습니다.

원격 실행을 사용하면 Bazel이 데이터 센터와 같은 별도의 플랫폼에서 작업을 실행할 수 있습니다. Bazel은 원격 실행에 gRPC 프로토콜을 사용합니다. 분산된 원격 실행 플랫폼을 제공하는 것을 목표로 하는 오픈소스 프로젝트인 bazel-buildfarm을 사용하여 원격 실행을 시도해 볼 수 있습니다.

이 페이지에서는 다양한 환경 유형 또는 플랫폼을 언급할 때 다음 용어를 사용합니다.

  • 호스트 플랫폼: Bazel이 실행되는 위치입니다.
  • 실행 플랫폼: Bazel 작업이 실행되는 위치입니다.
  • 타겟 플랫폼: 빌드 출력물 (및 일부 작업)이 실행되는 플랫폼입니다.

개요

원격 실행을 위해 Bazel 빌드를 구성할 때는 이 페이지에 설명된 가이드라인을 따라야 빌드가 오류 없이 원격으로 실행됩니다. 이는 원격 실행의 특성 때문입니다.

  • 격리된 빌드 작업 빌드 도구는 상태를 유지하지 않으며 종속 항목이 서로 유출될 수 없습니다.

  • 다양한 실행 환경 로컬 빌드 구성이 원격 실행 환경에 적합하지 않은 경우도 있습니다.

이 페이지에서는 원격 실행을 위한 맞춤 Bazel 빌드 및 테스트 규칙을 구현할 때 발생할 수 있는 문제와 이를 방지하는 방법을 설명합니다. 다음 주제를 다룹니다.

도구 모음 규칙을 통해 빌드 도구 호출

Bazel 도구 모음 규칙은 빌드 규칙에 컴파일러 및 링커와 같은 빌드 도구를 사용하고 규칙 작성자가 정의한 매개변수를 사용하여 이를 구성하는 방법을 알려주는 구성 제공자입니다. 도구 모음 규칙을 사용하면 빌드 및 테스트 규칙이 원격 실행과 호환되는 예측 가능하고 사전 구성된 방식으로 빌드 도구를 호출할 수 있습니다. 예를 들어 원격 실행 환경에서 상응하는 값으로 설정되지 않을 수 있는 PATH, JAVA_HOME 또는 기타 로컬 변수를 통해 빌드 도구를 호출하는 대신 도구 모음 규칙을 사용하세요.

현재 Scala, Rust, Go의 Bazel 빌드 및 테스트 규칙에 관한 도구 모음 규칙이 있으며, bash와 같은 다른 언어 및 도구를 위한 새 도구 모음 규칙이 진행 중입니다. 규칙에서 사용하는 도구에 도구 모음 규칙이 없는 경우 도구 모음 규칙을 만들어 보세요.

암시적 종속 항목 관리

빌드 도구가 빌드 작업 전반에서 종속 항목에 액세스할 수 있는 경우 각 원격 빌드 작업이 다른 작업과 별도로 실행되므로 원격으로 실행하면 이러한 작업이 실패합니다. 일부 빌드 도구는 빌드 작업 전반에서 상태를 유지하고 도구 호출에 명시적으로 포함되지 않은 종속 항목에 액세스하므로 원격으로 실행된 빌드 작업이 실패합니다.

예를 들어 Bazel이 상태 저장 컴파일러에 foo를 로컬에서 빌드하도록 지시하면 컴파일러는 foo의 빌드 출력에 대한 참조를 유지합니다. 그런 다음 Bazel이 컴파일러 호출에 포함하기 위해 BUILD 파일에서 종속 항목을 명시적으로 지정하지 않고 foo에 종속된 bar를 빌드하도록 컴파일러에 지시하면 동일한 컴파일러 인스턴스가 두 작업 모두에 대해 실행되는 한 작업이 성공적으로 실행됩니다 (로컬 실행의 일반적인 경우). 그러나 원격 실행 시나리오에서는 각 빌드 작업이 별도의 컴파일러 인스턴스를 실행하므로 컴파일러 상태와 barfoo에 대한 암시적 종속 항목이 손실되고 빌드가 실패합니다.

이러한 종속 항목 문제를 감지하고 제거하는 데 도움이 되도록 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 규칙을 사용하여 생성된 파일을 내보내면 됩니다. 각 도구 모음 컨테이너 내부와 같은 새 실행 환경에서 이러한 규칙을 실행하고 참조할 소스 저장소에 있는 원격 실행 빌드의 출력을 확인할 수 있습니다.

예를 들어 cudapython에 관한 Tensorflow의 규칙의 경우 WORKSPACE 규칙은 다음 BUILD files을 생성합니다. 로컬 실행의 경우 호스트 환경을 확인하여 생성된 파일이 사용됩니다. 원격 실행의 경우 환경 변수의 조건문을 사용하면 규칙에서 저장소에 체크인된 파일을 사용할 수 있습니다.

BUILD 파일은 로컬과 원격에서 모두 실행할 수 있는 genrules를 선언하고 여기에 표시된 대로 이전에 repository_ctx.symlink를 통해 실행되었던 필수 처리를 실행합니다.