Bazel의 실험: 버전.txt

16525 단어 bazelgit
출력이 version.txtgit describe --always --dirty 파일을 만드는 데 유용한 규칙을 만들려고 합니다.
  • 버전 번호로 git annotated tag를 사용하면 이 명령을 사용할 때 주석이 있는 태그만 표시합니다. 그렇지 않으면 짧은 해시 (주석이 없는 경우), 마지막으로 주석이 있는 해시 (접두사 (접두사 g, 접두사 dirty 와 같은 더 많은 정보를 제공할 것입니다. 제출하지 않은 변경 사항이 있다면.
  • version.txt를 다른 규칙의 입력으로 사용할 수 있으며 이 메타데이터를 구조에 포함시킬 수 있다.
  • # commit previous changes then
    ❯ git describe --always --dirty
    5472a43
    # add the first annoted tag
    ❯ git tag -a "0.1.0" -m ":bookmark: 0.1.0"
    ❯ git describe --always --dirty
    0.1.0
    


    현재 규칙을 만듭니다. git describe 폴더 .git 의 내용에 접근해야 실행할 수 있으며,bazel은 명확하게 입력해야 하며, 입력 파일은 가방 아래에 있어야 합니다.따라서, 우리는 규칙을 ./BUILD.bazel 부모 폴더, 즉 작업 영역 루트 폴더에 만들 것입니다.
    genrule(
        name = "version",
        srcs = [".git"],
        outs = ["version.txt"],
        cmd_bash = "git --git-dir=$(location :.git) describe --always --dirty |tee $@",
    )
    
    ❯ bazel build //:version
    INFO: Analyzed target //:version (1 packages loaded, 2 targets configured).
    INFO: Found 1 target...
    WARNING: /home/david/src/github.com/davidB/sandbox_bazel/BUILD.bazel:1:8: input '.git' to //:version is a directory; dependency checking of directories is unsound
    INFO: From Executing genrule //:version:
    0.1.0-dirty
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.046s, Critical Path: 0.01s
    INFO: 2 processes: 1 internal, 1 linux-sandbox.
    INFO: Build completed successfully, 2 total actions
    
    그러나 경고가 작용한 것 같다.이 코드를 제출하고bazel을 다시 실행합니다.
    ❯ git add BUILD.bazel
    ❯ git commit -m ":alembic: create version.txt"
    [development b5fea4c] :alembic: create version.txt
     1 file changed, 6 insertions(+)
     create mode 100644 BUILD.bazel
    
    ❯ git describe --always --dirty
    0.1.0-1-gb5fea4c
    
    ❯ bazel build //:version
    INFO: Analyzed target //:version (0 packages loaded, 0 targets configured).
    INFO: Found 1 target...
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.029s, Critical Path: 0.00s
    INFO: 1 process: 1 internal.
    INFO: Build completed successfully, 1 total action
    
    : - (바젤은 변화를 감지하지 못했다.
    우리는 함수.git로 폴더의 모든 내용을 설명하는 것이지 glob를 입력으로 설명하는 것이 아닙니다. 이것은 무엇입니까?
    genrule(
        name = "version",
        srcs = glob([".git/**"]),
        outs = ["version.txt"],
        cmd_bash = "git --git-dir=$(location :.git) describe --always --dirty |tee $@",
    )
    
    ❯ bazel build //:version
    ERROR: /home/david/src/github.com/davidB/sandbox_bazel/BUILD.bazel:1:8: in cmd_bash attribute of genrule rule //:version: label '//:.git' in $(location) expression is not a declared prerequisite of this rule
    ERROR: Analysis of target '//:version' failed; build aborted: Analysis of target '//:version' failed
    INFO: Elapsed time: 0.116s
    INFO: 0 processes.
    FAILED: Build did NOT complete successfully (1 packages loaded, 111 targets configured)
    
    빌어먹을 location, 단일 파일이라면 .git SRC에 포함되지 않습니다.또한 .git 폴더 아래의 파일만git 작업 디렉터리가 아니라 기호 링크이기 때문에, 이 명령은 작업 디렉터리를 항상 '더러움' 으로 검사합니다.이 경우, 우리는 Bazel에게 규칙을 모래상자에 실행하지 말고 local = True (연습으로 복제 envinfo_local 를 통해 규칙 envinfo 을 만들고 조정하도록 요구해야 할 수도 있습니다.)
    genrule(
        name = "version",
        srcs = glob([".git/**"]),
        outs = ["version.txt"],
        cmd_bash = "git --git-dir=.git --no-pager describe --always --dirty |tee $@",
        local = True,
    )
    
    테스트
    ❯ bazel build //:version
    INFO: Analyzed target //:version (1 packages loaded, 112 targets configured).
    INFO: Found 1 target...
    INFO: From Executing genrule //:version:
    0.1.0-1-gb5fea4c-dirty
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.073s, Critical Path: 0.01s
    INFO: 2 processes: 1 internal, 1 local.
    INFO: Build completed successfully, 2 total actions
    
    ❯ git add BUILD.bazel
    ❯ git commit -m ":alembic: tune version"
    ❯ git describe --always --dirty
    0.1.0-2-ge453fae
    
    ❯ bazel build //:version
    INFO: Analyzed target //:version (1 packages loaded, 115 targets configured).
    INFO: Found 1 target...
    INFO: From Executing genrule //:version:
    0.1.0-2-ge453fae-dirty
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.057s, Critical Path: 0.01s
    INFO: 2 processes: 1 internal, 1 local.
    INFO: Build completed successfully, 2 total actions
    
    ❯ git describe --always --dirty
    0.1.0-2-ge453fae
    
    이것은 더 좋은 것이지만, 우리가 예상치 못한 -dirty일 때, 바젤을 통해 운행된다.cmd_bashls -al 이전에 git로 수정하면git 명령을 실행하는 폴더는 항상 샌드박스입니다. 이 폴더를 가리키는 기호 링크 (없음local = True보다 더 많은 기호 링크가 있지만 기호 링크와 다른 파일과 폴더가 있습니다.
    ❯ bazel build //:version
    INFO: Analyzed target //:version (1 packages loaded, 118 targets configured).
    INFO: Found 1 target...
    INFO: From Executing genrule //:version:
    total 28
    drwxr-xr-x 5 david david 4096 Mar 28 17:51 .
    drwxr-xr-x 3 david david 4096 Mar 14 11:08 ..
    lrwxrwxrwx 1 david david   61 Mar 28 17:51 .bazelversion -> /home/david/src/github.com/davidB/sandbox_bazel/.bazelversion
    lrwxrwxrwx 1 david david   52 Mar 28 17:51 .git -> /home/david/src/github.com/davidB/sandbox_bazel/.git
    lrwxrwxrwx 1 david david   55 Mar 28 17:51 .github -> /home/david/src/github.com/davidB/sandbox_bazel/.github
    lrwxrwxrwx 1 david david   58 Mar 28 17:51 .gitignore -> /home/david/src/github.com/davidB/sandbox_bazel/.gitignore
    lrwxrwxrwx 1 david david   59 Mar 28 17:51 BUILD.bazel -> /home/david/src/github.com/davidB/sandbox_bazel/BUILD.bazel
    lrwxrwxrwx 1 david david   63 Mar 28 17:51 WORKSPACE.bazel -> /home/david/src/github.com/davidB/sandbox_bazel/WORKSPACE.bazel
    drwxr-xr-x 5 david david 4096 Mar 28 17:51 bazel-out
    lrwxrwxrwx 1 david david   59 Mar 28 17:51 exp_genrule -> /home/david/src/github.com/davidB/sandbox_bazel/exp_genrule
    drwxr-xr-x 2 david david 4096 Mar 28 17:51 external
    drwx------ 3 david david 4096 Mar 28 17:51 local-spawn-runner.1529500632871132789
    0.1.0-2-ge453fae-dirty
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.098s, Critical Path: 0.01s
    INFO: 2 processes: 1 internal, 1 local.
    INFO: Build completed successfully, 2 total actions
    
    아마도 다른 해결 방안을 찾을 때가 된 것 같다.우리는 로고--dirty를 삭제할 수 있지만, 이것은 제출하지 않은 변경 사항이 잘못된 버전 정보를 가진 코드를 생성할 수 있고, 일부 신뢰를 이 정보에 소각하여 디버깅을 할 수 있다는 것을 의미한다.

    작업공간 상태


    바셀 파일로 돌아가면 일부분을 찾을 수 있습니다Workspace status

    Use these options to "stamp" Bazel-built binaries: to embed additional information into the binaries, such as the source control revision or other workspace-related information. You can use this mechanism with rules that support the stamp attribute, such as genrule, cc_binary, and more...


    우리의 목표에 맞추기 위해서 한번 해 봅시다.디테일에 관해서는 왜...위에서 링크한 문서를 읽으십시오. 그러나 Bazel에 키/값 쌍을 만들어야 하는 스크립트를 제공할 수 있습니다. STABLE_ 로 시작하는 키는 파일 bazel-out/stable-status.txt 에 저장되고, 다른 것은 bazel-out/volatile-status.txt 에 저장됩니다.두 파일 모두 작업/규칙에 사용할 수 있습니다.stamp = True의 변경 사항이 검출되면attribebazel-out/stable-status.txt의 동작을 다시 터치합니다.
    # check if the files already existscat bazel-out/stable-status.txt
    BUILD_EMBED_LABEL 
    BUILD_HOST xxxxxxxxx
    BUILD_USER david
    
    ❯ cat bazel-out/volatile-status.txt
    BUILD_TIMESTAMP 1616946664
    
    이 자습서의 나머지 부분과 마찬가지로 linux/macOs에만 한정된 bash 스크립트를workspace 상태tools/workspace_status.sh로 사용합니다(실행 파일로 설정하는 것을 잊지 마세요).
    mkdir tools
    touch tools/workspace_status.sh
    chmod +x tools/workspace_status.sh
    
    tools/workspace_status.sh의 내용을 다음과 같이 정의합니다.
    #!/bin/bash
    
    echo "STABLE_BUILD_GIT_DESCRIBE $(git --no-pager describe --always --dirty)"
    
    도구를 사용하여 빠른 파일럿 및 시각 검사stable-status.txt:
    ❯ bazel build //:version --workspace_status_command "tools/workspace_status.sh"
    INFO: Analyzed target //:version (0 packages loaded, 0 targets configured).
    INFO: Found 1 target...
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.049s, Critical Path: 0.01s
    INFO: 1 process: 1 internal.
    INFO: Build completed successfully, 1 total action
    
    ❯ cat bazel-out/stable-status.txt
    BUILD_EMBED_LABEL 
    BUILD_HOST dwaynebox6
    BUILD_USER david
    STABLE_BUILD_GIT_DESCRIBE 0.1.0-2-ge453fae
    
    버전 번호 -dirty 는 포함되지 않습니다.dirty 로고는 추적되지 않은 파일을 무시하기 때문입니다. 예를 들어 우리가 만든 새 파일 (완벽하지 않습니다.)
    따라서 버전 규칙을 수정하여 bazel-out/stable-status.txt의 정보를 사용할 수 없습니다.
    genrule(
        name = "version",
        outs = ["version.txt"],
        # alternative: "sed -n 's/STABLE_BUILD_GIT_DESCRIBE //p' bazel-out/stable-status.txt"
        cmd_bash = "grep -Po '^STABLE_BUILD_GIT_DESCRIBE\\s+\\K.*' bazel-out/stable-status.txt |tee $@",
        stamp = True,
    )
    
    ❯ bazel build //:version --workspace_status_command "tools/workspace_status.sh"
    INFO: Analyzed target //:version (1 packages loaded, 1 target configured).
    INFO: Found 1 target...
    INFO: From Executing genrule //:version:
    0.1.0-2-ge453fae-dirty
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.079s, Critical Path: 0.02s
    INFO: 2 processes: 1 internal, 1 linux-sandbox.
    INFO: Build completed successfully, 2 total actions
    
    변경 사항을 제출하지 않은 테스트를 진행하기 전에, 우리는 --workspace_status_command "tools/workspace_status.sh"를 통해 각각 bazel build 호출에 레지스터.bazelrc를 기본 표시로 추가할 것입니다.
    echo 'build --workspace_status_command "tools/workspace_status.sh"' >>.bazelrc
    
    아니, 약속을 하고 더러운 것이 사라졌는지 테스트할 때가 됐어.
    ❯ git add BUILD.bazel tools/* .bazelrc
    ❯ git commit -m ":recycle: rewrite version using workspace status"
    
    ❯ bazel build //:version
    INFO: Analyzed target //:version (1 packages loaded, 1 target configured).
    INFO: Found 1 target...
    INFO: From Executing genrule //:version:
    0.1.0-3-g95b84e9
    Target //:version up-to-date:
      bazel-bin/version.txt
    INFO: Elapsed time: 0.087s, Critical Path: 0.02s
    INFO: 2 processes: 1 internal, 1 linux-sandbox.
    INFO: Build completed successfully, 2 total actions
    
    🎉

    결론


    version.txt 파일이 있으면 우리는 실제 프로젝트에서 사용할 수 있다. 이것은 긴 실험이다.우리는 genrule에 대해 더 좋은 이해와 경험을 했고 localstamp 속성을 발견했다.
    sandbox bazel은github에 위탁 관리됩니다. (오류로 인해 역사 기록이 다르기 때문에) tag를 사용하면 글 끝에 예상된 보기를 얻을 수 있습니다. article/3_versiontxt

    좋은 웹페이지 즐겨찾기