실패한 nix 빌드를 진단하는 방법은 무엇입니까?

실패한 nix 빌드를 진단하는 방법은 무엇입니까?

nix 빌드 실패를 진단하는 방법은 무엇입니까?

현재 표시되는 출력은 다음과 같습니다.

nix build -v
warning: dumping very large path (> 256 MiB); this may run out of memory
building '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv'...
builder for '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv' failed with exit code 1; last 5 log lines:
  unpacking sources
  unpacking source archive /nix/store/s7r5vlvp49ad6a9d5hqhsiaxw691iyhf-Blog
  source root is Blog
  patching sources
  configuring
[0 built (1 failed), 0.0 MiB DL]
error: build of '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv' failed

왜 빌드되지 않는지에 대한 로그/오류를 찾고 싶습니다.


다음에서https://stackoverflow.com/a/47264375/1663462:

build-cache-failures = true;추가 를 시도했지만 default.nix여전히 출력이 표시되지 않습니다.

nix-store --read-log

결과 nix-store --query-failed-paths:

error: no operation specified
Try 'nix-store --help' for more information.

답변1

또한보십시오:

패키지의 빌드 프로세스를 디버그합니다.

바꾸다nix-build

nix-build -E 'with import <nixpkgs> {}; callPackage ./. {}'

실행하여 nix-shell빌드 환경으로 들어갑니다.

nix-shell -E 'with import <nixpkgs> {}; callPackage ./. {}'

그런 다음 빌드 단계를 실행하십시오.

# run build in tempdir
cd $(mktemp -d)

# dont install to /nix/store
for n in $outputs; do eval export $n=$PWD/result-$n; done

# https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
    configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
    ${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
    ${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";

echo writing nix-build-phases.txt
for curPhase in $phases; do
    echo "eval \"\${$curPhase:-$curPhase}\""
    if [ "$curPhase" = unpackPhase ]; then
        echo '[ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}"'
        echo 'cd "${sourceRoot:-.}"'
    fi
done >nix-build-phases.txt

echo "please manually run the build phases in nix-build-phases.txt"
echo
cat nix-build-phases.txt

예 nix-build-phases.txt

eval "${unpackPhase:-unpackPhase}"
[ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}"
cd "${sourceRoot:-.}"
eval "${patchPhase:-patchPhase}"
eval "${updateAutotoolsGnuConfigScriptsPhase:-updateAutotoolsGnuConfigScriptsPhase}"
eval "${configurePhase:-configurePhase}"
eval "${buildPhase:-buildPhase}"
eval "${checkPhase:-checkPhase}"
eval "${installPhase:-installPhase}"
eval "${fixupPhase:-fixupPhase}"
eval "${installCheckPhase:-installCheckPhase}"
eval "${distPhase:-distPhase}"

이 빌드 환경에서는 다음을 수행할 수 있습니다.

  • 빌드 오류의 원인을 알아보세요(어떤 빌드 단계가 실패했나요?)
  • 빌드 명령 수정(예: 재정의 buildPhase: 이전 단계 인쇄 실행 type buildPhase, 이전 단계 복사, 단계 수정, 새 단계 붙여넣기)
  • 수정된 빌드 명령을 실행합니다. 이는 전체 재구축보다 빠를 수 있습니다.

참고: 빌더는 다양한 빌드 단계를 수행할 수 있습니다. 실제 빌드 단계는 prePhases또는 같은 변수에 저장됩니다.preConfigurePhases

문제: 빌드 스크립트가 실행되어 set -e첫 번째 오류가 발생하면 종료되지만 이로 인해 대화형 셸이 종료됩니다. 이는 bash 셸의 제한 사항이므로 이상적으로는 bash 디버거에서 빌드 스크립트를 실행하고, 첫 번째 오류에서 실행을 중지하고, 명령을 수정하고, 명령을 취소하고 반복하고, 상태를 확인할 수 있습니다.

# run build in tempdir
cd $(mktemp -d)

# dont install to /nix/store
for n in $outputs; do eval export $n=$PWD/result-$n; done

# https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
    configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
    ${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
    ${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";

# test
#patchPhase="echo test error in patchPhase; false"

donePhases=()
missingPhases=($phases)
for curPhase in $phases; do
    # no. genericBuild does not "return 1" on error
    #phases="$curPhase" genericBuild || break
    echo
    echo "# running $curPhase"
    # FIXME this also traps suspend (Ctrl-Z)
    trap '
        echo "FIXME error in $curPhase"
        echo "done phases:" ${donePhases[@]}
        echo "missing phases:" ${missingPhases[@]}
        echo "hit Enter to close the nix-shell"
        read
    ' EXIT
    set -e # exit on error
    set -x # trace
    eval "${!curPhase:-$curPhase}"
    set +x
    set +e
    if [ "$curPhase" = unpackPhase ]; then
        [ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}"
        cd "${sourceRoot:-.}"
    fi
    donePhases+=($curPhase)
    missingPhases=(${missingPhases[@]:1})
done

답변2

읽기 로그가 작동해야 합니다. 파생 프로세스를 지정했습니까? nix-store --read-log /nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv

답변3

--debug추가 정보를 제공하는 옵션과 옵션이 있습니다 --print-build-logs(설정은 가능 nix build하지만 아님).nix-build

특정 문제에 관해서는 아마도 다음과 같은 오류가 있을 것입니다.https://github.com/NixOS/nix/issues/2176

추가 정보

https://releases.nixos.org/nix/nix-0.16/build/565033/download/1/manual/index.html#id494024

답변4

실패한 breakpointHook파생을 추가하는 것도 nativeBuildInputs강력한 기술입니다.cntr파생 빌드가 실패하면 환경을 탐색합니다.

NixOS Discourse에 대해 강연해주신 jamesbrock에게 감사드립니다.단점은 다음과 같습니다.

a의 breakpointHook에 패키지를 추가합니다 .nativeBuildInputsmkDerivation

nativeBuildInputs = [ breakpointHook ];

설치센터

nix-env -i cntr

Nix 빌드 명령을 실행하고 실패하면 breakpointHook은 다음 메시지를 출력합니다.

build failed in installPhase with exit code 1
To attach install cntr and run the following command as root:

   cntr attach -t command cntr-/nix/store/6vwxqrwq5h1fd3nw4mc61wgk7rppn2qw-jupyterlab-extended

그래서 우리는 명령을 실행합니다뿌리. 루트 사용자에게는 Nix 구성 파일에 설치한 PATH명령이 없으므로 cntr단일 사용자 설치를 위해 cntr에 대한 전체 경로를 제공하십시오.

sudo /home/$USER/.nix-profile/bin/cntr attach -t command cntr-/nix/store/6vwxqrwq5h1fd3nw4mc61wgk7rppn2qw-jupyterlab-extended

이제 우리는 잠자는 Knicks 컨테이너에 있습니다. 이 단계에서는 일반적인 도구를 사용하여 및 같은 경로 를
사용할 수 있지만 가 아닌 현재 디렉터리( )에 있습니다. (이렇게 사용할 수 있습니다.)$out$TMPDIR/var/lib/cntr/
cd $(echo $out | cut -c2-)

여기에서 실행하여 cntr exec빌드 환경을 완전히 로드합니다.

/home/$USER/.nix-profile/bin/cntr exec

$TMPDIR디렉터리는 Nix가 빌드 10을 위한 임시 디렉터리를 만드는 곳입니다.

cd $TMPDIR

buildPhase이제 우리는 완전히 빌드 컨텍스트에 있으며 셸에 입력하는 모든 명령은 포크가 실패했을 때 포크 단계(예를 들어) 중에 줄에 입력한 것처럼 나타납니다.


언급하다NixOS 토론에서:

또한 BreakpointHook에 대한 몇 가지 세부 정보를 추가하고 싶습니다. 이것은 매우 강력한 디버깅 후크입니다.@Mic92.

pkgs.breakpointHook를 buildInputs에 넣으면 작동합니다. 오류가 발생하면 정확한 "connect" 명령이 콘솔에 인쇄됩니다. 이 명령(cntr)을 사용하여 셸을 빌드 환경에 연결할 수 있습니다. 이를 사용하려면 cntr과 함께 sudo를 실행할 수 있어야 합니다(따라서 cntr 패키지를 먼저 설치해야 합니다;-)).

@Mic92 NixCon 프레젠테이션에서 더 흥미로운 세부 정보를 확인할 수 있습니다.Jörg 'Mic92' Thalheim - Nix 샌드박스 및 중단점 정보(NixCon 2018)

다음은 매뉴얼의 관련 부분에 대한 링크입니다.https://nixos.org/manual/nixpkgs/stable/#breakpointhook

관련 정보