여기서 호스트 머신은 Bazel이 실행되는 머신입니다.
원격 실행을 사용하는 경우 실제 빌드 또는 테스트 단계는 호스트 머신에서 발생하지 않고 원격 실행 시스템으로 전송됩니다. 하지만 워크스페이스 규칙을 해결하는 데 관련된 단계는 호스트 머신에서 발생합니다. 워크스페이스 규칙이 실행 중에 사용할 호스트 머신에 관한 정보에 액세스하는 경우 환경 간 비호환성으로 인해 빌드가 중단될 수 있습니다.
원격 실행을 위해 Bazel 규칙을 적용하는 과정에서 이러한 작업공간 규칙을 찾아 수정해야 합니다. 이 페이지에서는 작업공간 로그를 사용하여 문제가 있을 수 있는 작업공간 규칙을 찾는 방법을 설명합니다.
비밀폐 규칙 찾기
작업공간 규칙을 사용하면 개발자가 외부 작업공간에 종속 항목을 추가할 수 있지만 프로세스에서 임의 처리가 발생할 수 있을 만큼 충분히 풍부합니다. 모든 관련 명령어는 로컬에서 실행되며 비밀폐성의 잠재적 원인이 될 수 있습니다. 일반적으로 기본 제공되지 않는 동작은 호스트 머신과 상호작용할 수 있는 repository_ctx를 통해 도입됩니다.
Bazel 0.18부터 Bazel 명령어에 --experimental_workspace_rules_log_file=[PATH] 플래그를 추가하여 비밀폐형 작업의 로그를 가져올 수 있습니다. 여기서 [PATH]은 로그가 생성될 파일 이름입니다.
다음 사항을 참고하세요.
- 로그는 이벤트가 실행될 때 이를 캡처합니다. 일부 단계가 캐시되면 로그에 표시되지 않으므로 전체 결과를 얻으려면 미리 - bazel clean --expunge를 실행해야 합니다.
- 함수가 재실행되는 경우가 있으며, 이 경우 관련 이벤트가 로그에 여러 번 표시됩니다. 
- Workspace 규칙은 현재 Starlark 이벤트만 로깅합니다. 
작업공간 초기화 중에 실행된 항목을 확인하려면 다음 단계를 따르세요.
- bazel clean --expunge을 실행합니다. 이 명령어는 로컬 캐시와 캐시된 저장소를 정리하여 모든 초기화가 다시 실행되도록 합니다.
- Bazel 명령어에 - --experimental_workspace_rules_log_file=/tmp/workspacelog를 추가하고 빌드를 실행합니다.- 그러면 WorkspaceEvent 유형의 메시지를 나열하는 바이너리 proto 파일이 생성됩니다. 
- Bazel 소스 코드를 다운로드하고 아래 명령어를 사용하여 Bazel 폴더로 이동합니다. workspacelog 파서로 워크스페이스 로그를 파싱하려면 소스 코드가 필요합니다. - git clone https://github.com/bazelbuild/bazel.git- cd bazel
- Bazel 소스 코드 저장소에서 전체 작업공간 로그를 텍스트로 변환합니다. - bazel build src/tools/workspacelog:parser- bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
- 출력이 상당히 장황해지고 내장 Bazel 규칙의 출력이 포함될 수 있습니다. - 출력에서 특정 규칙을 제외하려면 - --exclude_rule옵션을 사용하세요. 예를 들면 다음과 같습니다.- bazel build src/tools/workspacelog:parser- bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \ --exclude_rule "//external:local_config_cc" \ --exclude_rule "//external:dep" > /tmp/workspacelog.txt
- /tmp/workspacelog.txt를 열고 안전하지 않은 작업을 확인합니다.
로그는 repository_ctx에서 실행된 특정 비밀폐형 작업을 설명하는 WorkspaceEvent 메시지로 구성됩니다.
밀폐되지 않을 수 있다고 강조 표시된 작업은 다음과 같습니다.
- execute: 호스트 환경에서 임의의 명령어를 실행합니다. 이러한 요소가 호스트 환경에 종속 항목을 도입하는지 확인합니다.
- download,- download_and_extract: hermetic 빌드를 보장하려면 sha256이 지정되어 있는지 확인하세요.
- file,- template: 자체적으로는 비밀폐형이 아니지만 호스트 환경에 대한 종속 항목을 저장소에 도입하는 메커니즘일 수 있습니다. 입력이 어디에서 오는지, 호스트 환경에 종속되지 않는지 확인합니다.
- os: 자체적으로는 비밀폐형이 아니지만 호스트 환경에서 종속 항목을 쉽게 가져올 수 있습니다. 기본 제공 빌드는 일반적으로 이를 호출하지 않습니다. 사용량이 hermetic한지 평가할 때 작업자가 아닌 호스트에서 실행된다는 점을 유의하세요. 일반적으로 호스트에서 환경 세부정보를 가져오는 것은 원격 빌드에 적합하지 않습니다.
- symlink: 일반적으로 안전하지만 위험 신호를 찾아보세요. 리포지토리 외부 또는 절대 경로로 연결되는 심볼릭 링크는 원격 작업자에서 문제를 일으킵니다. 심볼릭 링크가 호스트 머신 속성을 기반으로 생성되는 경우에도 문제가 될 수 있습니다.
- which: 작업자의 구성이 다를 수 있으므로 호스트에 설치된 프로그램을 확인하는 것은 일반적으로 문제가 됩니다.