失敗した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に感謝します。欠点は次のとおりです。

abreakpointHookのにパッケージを追加します。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

だから我々はコマンドを実行します。 rootユーザーには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に関するいくつかの詳細を追加したいと思います。これは非常に強力なデバッグフックです。こんにちは

pkgs.breakpointHook を buildInputs に入れると動作します。エラーが発生すると、正しい "connect"コマンドがコンソールに印刷されます。このコマンド(cntr)を使用して、シェルをビルド環境に接続できます。これを使用するには、cntrでsudoを実行できる必要があります(したがって、cntrパッケージを最初にインストールする必要があります;-)。

@Mic92 NixConプレゼンテーションでより興味深い詳細を見ることができます。Jörg 'Mic92' Thalheim - Nixサンドボックスとブレークポイント情報(NixCon 2018)

以下は、マニュアルの関連部分へのリンクです。https://nixos.org/manual/nixpkgs/stable/#breakpointhook

関連情報