스크립트에서 Bazel 호출

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

스크립트에서 Bazel을 호출하여 빌드를 실행하거나 테스트를 실행하거나 종속 항목 그래프를 쿼리할 수 있습니다. Bazel은 효과적인 스크립팅을 지원하도록 설계되었지만 이 섹션에서는 스크립트를 더 강력하게 만들기 위해 유의해야 할 몇 가지 세부정보를 나열합니다.

출력 기준 선택

--output_base 옵션은 Bazel 프로세스가 빌드의 출력을 작성해야 하는 위치와 Bazel에서 내부적으로 사용하는 다양한 작업 파일을 제어합니다. 그중 하나는 여러 Bazel 프로세스에서 출력 기반을 동시에 변경하지 못하도록 하는 잠금입니다.

스크립트에 적합한 출력 기본 디렉터리를 선택하는 것은 여러 요인에 따라 달라집니다. 빌드 출력을 특정 위치에 배치해야 하는 경우 사용해야 하는 출력 기반이 결정됩니다. Bazel을 '읽기 전용'으로 호출하는 경우 (예: bazel query) 잠금 요소가 더 중요합니다. 특히 스크립트의 여러 인스턴스를 동시에 실행해야 하는 경우 각 Blaze 서버 프로세스는 한 번에 최대 하나의 호출만 처리할 수 있다는 점에 유의해야 합니다. 상황에 따라 스크립트의 각 인스턴스가 차례를 기다리는 것이 좋을 수도 있고, --output_base를 사용하여 여러 Blaze 서버를 실행하고 이를 사용하는 것이 좋을 수도 있습니다.

기본 출력 기본 값을 사용하면 사용자의 대화형 Bazel 명령어에서 사용하는 것과 동일한 잠금을 얻기 위해 경쟁하게 됩니다. 사용자가 빌드와 같이 장기 실행 명령어를 실행하는 경우 스크립트는 이러한 명령어가 완료될 때까지 기다려야 계속 진행할 수 있습니다.

서버 모드에 관한 참고사항

기본적으로 Bazel은 장기 실행 서버 프로세스를 최적화로 사용합니다. 스크립트에서 Bazel을 실행할 때는 서버를 완료할 때 shutdown를 호출하거나 유휴 서버가 즉시 종료되도록 --max_idle_secs=5를 지정해야 합니다.

어떤 종료 코드가 표시되나요?

Bazel은 고려 중인 소스 코드로 인한 실패를 Bazel이 제대로 실행되지 못하게 하는 외부 오류와 구분하려고 시도합니다. Bazel 실행으로 인해 다음과 같은 종료 코드가 발생할 수 있습니다.

모든 명령어에 공통적인 종료 코드:

  • 0 - 성공
  • 2 - 명령줄 문제, 잘못되거나 잘못된 플래그 또는 명령어 조합, 잘못된 환경 변수 명령줄을 수정해야 합니다.
  • 8 - 빌드가 중단되었지만 정상적으로 종료되었습니다.
  • 9 - 서버 잠금이 유지되고 --noblock_for_lock가 전달되었습니다.
  • 32 - 이 머신이 아닌 외부 환경에서 발생한 오류입니다.

  • 33 - Bazel의 메모리가 부족하여 비정상 종료되었습니다. 명령줄을 수정해야 합니다.

  • 34 - Google 내부용으로 예약되었습니다.

  • 35 - Google 내부용으로 예약되었습니다.

  • 36 - 로컬 환경 문제로 영구적인 것으로 의심됨

  • 37 - 처리되지 않은 예외 / 내부 Bazel 오류

  • 38 - 빌드 이벤트 서비스에 결과를 게시하는 중에 일시적인 오류가 발생했습니다.

  • 39 - Bazel에 필요한 Blob이 원격 캐시에서 제거됩니다.

  • 41-44 - Google 내부용으로 예약되었습니다.

  • 45 - 빌드 이벤트 서비스에 결과를 게시하는 데 지속적인 오류가 발생합니다.

  • 47 - Google 내부용으로 예약되었습니다.

  • 49 - Google 내부용으로 예약되었습니다.

명령어 bazel build, bazel test의 반환 코드:

  • 1 - 빌드에 실패했습니다.
  • 3 - 빌드가 정상적으로 완료되었지만 일부 테스트가 실패했거나 시간이 초과되었습니다.
  • 4 - 빌드가 성공했지만 테스트가 요청되었는데도 테스트가 발견되지 않았습니다.

bazel run의 경우:

  • 1 - 빌드에 실패했습니다.
  • 빌드가 성공했지만 실행된 하위 프로세스가 0이 아닌 종료 코드를 반환하면 명령어의 종료 코드도 됩니다.

bazel query의 경우:

  • 3 - 부분적으로 성공했지만 쿼리에서 입력 BUILD 파일 세트에 하나 이상의 오류가 발생하여 작업 결과가 100% 신뢰할 수 없습니다. 이는 명령줄의 --keep_going 옵션으로 인한 것일 수 있습니다.
  • 7 - 명령어 실패

향후 Bazel 버전에서는 종료 코드를 추가하여 일반적인 실패 종료 코드 1를 특정 의미가 있는 다른 0이 아닌 값으로 대체할 수 있습니다. 그러나 0이 아닌 모든 종료 값은 항상 오류가 됩니다.

.bazelrc 파일 읽기

기본적으로 Bazel은 기본 워크스페이스 디렉터리 또는 사용자의 홈 디렉터리에서 .bazelrc 파일을 읽습니다. 이러한 동작이 바람직한지 여부는 스크립트에 따라 다릅니다. 스크립트가 완전히 봉인되어야 하는 경우 (예: 출시 빌드를 실행할 때) --bazelrc=/dev/null 옵션을 사용하여 .bazelrc 파일 읽기를 사용 중지해야 합니다. 사용자의 기본 설정을 사용하여 빌드를 실행하려면 기본 동작이 더 좋습니다.

명령어 로그

Bazel 출력은 다음 명령어로 찾을 수 있는 명령 로그 파일에서도 사용할 수 있습니다.

bazel info command_log

명령어 로그 파일에는 최신 Bazel 명령어의 교차된 stdout 및 stderr 스트림이 포함되어 있습니다. bazel info를 실행하면 이 파일의 콘텐츠가 덮어쓰기됩니다. 이 파일이 최신 Bazel 명령어이기 때문입니다. 그러나 --output_base 또는 --output_user_root 옵션의 설정을 변경하지 않는 한 명령 로그 파일의 위치는 변경되지 않습니다.

출력 파싱

Bazel 출력은 다양한 목적으로 쉽게 파싱할 수 있습니다. 스크립트에 유용할 수 있는 두 가지 옵션은 진행률 메시지를 억제하는 --noshow_progress와 '최신 빌드' 메시지가 출력되는지 여부를 제어하는 --show_result n입니다. 이러한 메시지는 파싱되어 성공적으로 빌드된 타겟과 생성된 출력 파일의 위치를 확인할 수 있습니다. 이러한 메시지를 사용하는 경우 매우 큰 n 값을 지정해야 합니다.

프로파일링을 통한 성능 문제 해결

성능 프로파일링 섹션을 참고하세요.