WORKSPACE 규칙에서 비밀폐 동작 찾기

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

다음에서 호스트 머신은 Bazel이 실행되는 머신입니다.

원격 실행을 사용하면 실제 빌드 또는 테스트 단계가 호스트 머신에서 실행되지 않고 대신 원격 실행 시스템으로 전송됩니다. 그러나 워크스페이스 규칙을 확인하는 단계는 호스트 머신에서 실행됩니다. 워크스페이스 규칙이 실행 중에 사용할 호스트 머신에 대한 정보에 액세스하는 경우 환경 간의 비호환성으로 인해 빌드가 중단될 수 있습니다.

원격 실행을 위해 Bazel 규칙을 조정하는 과정에서 이러한 워크스페이스 규칙을 찾아 수정해야 합니다. 이 페이지에서는 워크스페이스 로그를 사용하여 문제가 있을 수 있는 워크스페이스 규칙을 찾는 방법을 설명합니다.

비밀 유지가 불가능한 규칙 찾기

작업공간 규칙을 사용하면 개발자가 외부 작업공간에 종속 항목을 추가할 수 있지만 프로세스에서 임의의 처리가 이루어질 수 있을 만큼 풍부합니다. 모든 관련 명령어는 로컬에서 실행되며 잠재적인 비밀 유지 위반의 원인이 될 수 있습니다. 일반적으로 기본 제공되지 않는 동작은 호스트 머신과 상호작용할 수 있는 repository_ctx를 통해 도입됩니다.

Bazel 0.18부터 Bazel 명령어에 --experimental_workspace_rules_log_file=[PATH] 플래그를 추가하여 잠재적으로 비밀 유지가 불가능한 작업의 로그를 가져올 수 있습니다. 여기서 [PATH]는 로그가 생성될 파일 이름입니다.

다음 사항을 참고하세요.

  • 로그는 이벤트가 실행될 때 이벤트를 캡처합니다. 일부 단계가 캐시되면 로그에 표시되지 않으므로 전체 결과를 가져오려면 먼저 bazel clean --expunge를 실행해야 합니다.

  • 함수가 재실행될 수도 있으며, 이 경우 관련 이벤트가 로그에 여러 번 표시됩니다.

  • Workspace 규칙은 현재 Starlark 이벤트만 로깅합니다.

워크스페이스 초기화 중에 실행된 항목을 찾으려면 다음 단계를 따르세요.

  1. bazel clean --expunge을 실행합니다. 이 명령어는 로컬 캐시와 캐시된 저장소를 정리하여 모든 초기화가 다시 실행되도록 합니다.

  2. Bazel 명령어에 --experimental_workspace_rules_log_file=/tmp/workspacelog를 추가하고 빌드를 실행합니다.

    그러면 WorkspaceEvent 유형의 메시지를 나열하는 바이너리 프로토 파일이 생성됩니다.

  3. Bazel 소스 코드를 다운로드하고 아래 명령어를 사용하여 Bazel 폴더로 이동합니다. workspacelog 파서로 워크스페이스 로그를 파싱하려면 소스 코드가 필요합니다.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
  4. Bazel 소스 코드 저장소에서 전체 워크스페이스 로그를 텍스트로 변환합니다.

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
  5. 출력은 상당히 장황할 수 있으며 내장된 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
  6. /tmp/workspacelog.txt를 열고 안전하지 않은 작업이 있는지 확인합니다.

로그는 repository_ctx에서 실행된 특정 비밀 유지 불가능한 작업을 설명하는 WorkspaceEvent 메시지로 구성됩니다.

밀폐되지 않을 수 있는 것으로 강조 표시된 작업은 다음과 같습니다.

  • execute: 호스트 환경에서 임의의 명령어를 실행합니다. 호스트 환경에 종속 항목이 도입될 수 있는지 확인합니다.

  • download, download_and_extract: 견고한 빌드를 보장하려면 sha256이 지정되어 있는지 확인합니다.

  • file, template: 자체적으로 비밀 유지가 아닙니다. 하지만 호스트 환경의 종속 항목을 저장소에 도입하기 위한 메커니즘일 수 있습니다. 입력의 출처를 파악하고 호스트 환경에 종속되지 않는지 확인합니다.

  • os: 자체적으로 비밀 유지가 아닙니다. 하지만 호스트 환경에서 종속 항목을 가져오는 간단한 방법입니다. 기본 제공 빌드는 일반적으로 이를 호출하지 않습니다. 사용량이 격리되어 있는지 평가할 때는 작업자가 아닌 호스트에서 실행된다는 점에 유의하세요. 일반적으로 원격 빌드의 경우 호스트에서 환경 세부정보를 가져오는 것은 좋지 않습니다.

  • symlink: 일반적으로 안전하지만 경고 신호를 찾습니다. 저장소 외부 또는 절대 경로의 심볼릭 링크는 원격 작업자에서 문제를 일으킵니다. 호스트 머신 속성을 기반으로 심볼릭 링크가 생성된 경우에도 문제가 발생할 수 있습니다.

  • which: 호스트에 설치된 프로그램을 확인하는 것은 일반적으로 문제가 됩니다. 작업자의 구성이 다를 수 있기 때문입니다.