빌드 이벤트 프로토콜

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

빌드 이벤트 프로토콜(BEP)을 사용하면 서드 파티 프로그램이 Bazel 호출에 대한 통계를 얻을 수 있습니다. 예를 들어 BEP를 사용하여 IDE 플러그인 또는 빌드 결과를 표시하는 대시보드에 대한 정보를 수집할 수 있습니다.

프로토콜은 그 위에 정의된 일부 시맨틱이 있는 프로토콜 버퍼 메시지 집합입니다. 빌드 및 테스트 결과, 빌드 진행률, 빌드 구성 등에 관한 정보가 포함됩니다. BEP는 프로그래매틱 방식으로 사용하도록 설계되었으며 Bazel의 명령줄 출력을 파싱하는 작업은 더 이상 필요하지 않게 됩니다.

빌드 이벤트 프로토콜은 빌드에 관한 정보를 이벤트로 나타냅니다. 빌드 이벤트는 빌드 이벤트 식별자, 하위 이벤트 식별자 집합, 페이로드로 구성된 프로토콜 버퍼 메시지입니다.

  • 빌드 이벤트 식별자: 빌드 이벤트의 종류에 따라 불투명 문자열이거나 빌드 이벤트에 관해 더 많은 정보를 보여주는 구조화된 정보일 수 있습니다. 빌드 이벤트 식별자는 빌드 내에서 고유합니다.

  • 하위 요소: 빌드 이벤트는 하위 요소 필드에 빌드 이벤트 식별자를 포함하여 다른 빌드 이벤트를 공지할 수 있습니다. 예를 들어 PatternExpanded 빌드 이벤트는 확장되는 타겟을 하위 요소로 공지합니다. 프로토콜은 첫 번째 이벤트를 제외한 모든 이벤트가 이전 이벤트에 의해 공지되도록 보장합니다.

  • 페이로드: 페이로드에는 빌드 이벤트에 관한 구조화된 정보가 포함되며, 이 정보는 해당 이벤트에 관한 프로토콜 버퍼 메시지로 인코딩됩니다. 페이로드는 예상되는 유형이 아닐 수 있지만 빌드가 조기에 중단된 경우 Aborted 메시지일 수 있습니다.

이벤트 그래프 빌드

모든 빌드 이벤트는 상위 및 하위 관계를 통해 방향성 비순환 그래프를 형성합니다. 초기 빌드 이벤트를 제외한 모든 빌드 이벤트에는 하나 이상의 상위 이벤트가 있습니다. 하위 이벤트의 모든 상위 이벤트가 하위 이벤트 전에 게시되어야 하는 것은 아닙니다. 빌드가 완료되면 (성공 또는 실패) 모든 공지된 이벤트가 게시됩니다. Bazel 비정상 종료 또는 네트워크 전송 실패의 경우 일부 공지된 빌드 이벤트가 게시되지 않을 수 있습니다.

이벤트 그래프의 구조는 명령어의 수명 주기를 반영합니다. 모든 BEP 그래프는 다음과 같은 특징적인 모양을 갖습니다.

  1. 루트 이벤트는 항상 BuildStarted 이벤트입니다. 다른 모든 이벤트는 그 하위 요소입니다.
  2. BuildStarted 이벤트의 바로 아래 하위 요소에는 명령어에 관한 메타데이터가 포함됩니다.
  3. 빌드된 파일 및 테스트 결과와 같이 명령어에서 생성된 데이터가 포함된 이벤트는 BuildFinished 이벤트 앞에 표시됩니다.
  4. BuildFinished 이벤트 뒤에는 빌드에 관한 요약 정보 (예: 측정항목 또는 프로파일링 데이터)가 포함된 이벤트가 나타날 수 있습니다.

빌드 이벤트 프로토콜 사용

바이너리 형식으로 소비

바이너리 형식으로 BEP를 사용하려면 다음 단계를 따르세요.

  1. --build_event_binary_file=/path/to/file 옵션을 지정하여 Bazel이 프로토콜 버퍼 메시지를 파일로 직렬화하도록 합니다. 이 파일에는 각 메시지가 길이로 구분된 직렬화된 프로토콜 버퍼 메시지가 포함됩니다. 각 메시지 앞에는 가변 길이 정수로 인코딩된 길이가 접두사로 추가됩니다. 이 형식은 프로토콜 버퍼 라이브러리의 parseDelimitedFrom(InputStream) 메서드를 사용하여 읽을 수 있습니다.

  2. 그런 다음 직렬화된 프로토콜 버퍼 메시지에서 관련 정보를 추출하는 프로그램을 작성합니다.

텍스트 또는 JSON 형식으로 소비

다음 Bazel 명령줄 플래그는 텍스트 및 JSON과 같이 사람이 읽을 수 있는 형식으로 BEP를 출력합니다.

--build_event_text_file
--build_event_json_file

빌드 이벤트 서비스

빌드 이벤트 서비스 프로토콜은 빌드 이벤트를 게시하기 위한 일반 gRPC 서비스입니다. 빌드 이벤트 서비스 프로토콜은 BEP와 독립적이며 BEP 이벤트를 불투명한 바이트로 취급합니다. Bazel은 빌드 이벤트 프로토콜 이벤트를 게시하는 빌드 이벤트 서비스 프로토콜의 gRPC 클라이언트 구현과 함께 제공됩니다. --bes_backend=HOST:PORT 플래그를 사용하여 이벤트를 전송할 엔드포인트를 지정할 수 있습니다. 백엔드에서 gRPC를 사용하는 경우 주소 앞에 적절한 스키마(암호화되지 않은 gRPC의 경우 grpc://, TLS가 사용 설정된 gRPC의 경우 grpcs://)를 추가해야 합니다.

빌드 이벤트 서비스 플래그

Bazel에는 다음과 같이 빌드 이벤트 서비스 프로토콜과 관련된 여러 플래그가 있습니다.

  • --bes_backend
  • --[no]bes_lifecycle_events
  • --bes_results_url
  • --bes_timeout
  • --bes_instance_name

각 플래그에 대한 설명은 명령줄 참조를 참고하세요.

인증 및 보안

Bazel의 빌드 이벤트 서비스 구현은 인증 및 TLS도 지원합니다. 이러한 설정은 아래 플래그를 사용하여 제어할 수 있습니다. 이러한 플래그는 Bazel의 원격 실행에도 사용됩니다. 즉, 빌드 이벤트 서비스와 원격 실행 엔드포인트는 동일한 인증 및 TLS 인프라를 공유해야 합니다.

  • --[no]google_default_credentials
  • --google_credentials
  • --google_auth_scopes
  • --tls_certificate
  • --[no]tls_enabled

각 플래그에 대한 설명은 명령줄 참조를 참고하세요.

빌드 이벤트 서비스 및 원격 캐싱

BEP에는 일반적으로 Bazel이 실행 중인 머신에 저장된 로그 파일 (test.log, test.xml 등)에 대한 많은 참조가 포함됩니다. 원격 BES 서버는 일반적으로 이러한 파일이 다른 머신에 있으므로 이러한 파일에 액세스할 수 없습니다. 이 문제를 해결하는 방법은 원격 캐싱과 함께 Bazel을 사용하는 것입니다. Bazel은 BEP에서 참조된 파일을 포함하여 모든 출력 파일을 원격 캐시로 업로드하고 BES 서버는 캐시에서 참조된 파일을 가져올 수 있습니다.

자세한 내용은 GitHub 문제 3689를 참고하세요.