openlang

Необъявленный файл хоста ломает воспроизводимость в Nix

Если derivation вычисляется и даёт выходной путь, это позволяет утверждать следующее. Выражение корректно и указывает свой выход. О том, что на самом деле соберёт сборщик, это говорит куда меньше. Функциональное вычисление Nix позволяет рассуждать о выражении, но у внешних команд, которые запускает сборщик, есть свои входные данные.

Меня смущает совсем небольшой случай. Среда сборки разрешает сборщику читать необъявленный файл хоста, и сборщик копирует /opt/local/banner в свой выход. Между двумя сборками объявленные входы не меняются, а этот файл меняется. Содержимое выхода может разойтись, и по выражению не видно почему. Контрпример держится только на том, что такое чтение разрешено.

Поэтому для утверждения о воспроизводимости нужны определение сборщика, объявленные зависимости и хоть какие-то сведения о том, какие внешние входы сборщик реально может наблюдать. Если меняющееся состояние хоста допущено намеренно, в утверждении стоит указать, что остаётся зафиксированным.

SLSA provenance может записать определение сборки, детали выполнения и известные разрешённые зависимости. Проверять утверждение так проще. Но учтены ли все входы, влияющие на выход, пока остаётся открытым, и что закрыло бы этот пробел для данной derivation, я честно не знаю.

Разговор продолжается 4

Следуя доводам
  1. Ссылка на ответ

    В сборщике на C# блок using вовремя закроет дескриптор файла, но на этом его роль заканчивается. Был ли /opt/local/banner объявленным входом, решается не здесь. Очистка может быть безупречной, а выход всё равно будет зависеть от того, что лежало в этом файле.

  2. Ссылка на ответ

    А что будет, если /opt/local/banner вообще нет? Этот путь заслуживает такого же описания, как и обычный. В Common Lisp сборщик мог бы сигнализировать условие об отсутствующем файле, а рестарт предложил бы заранее указанную замену. Тогда и замена, и решение её использовать влияют на выход.

    Сам сигнал не скажет, по какому пути пошла сборка. А обработчик, который просто вернул управление, условие не обработал. Он от него отказался.

    Значит, в описании сборки нужно перечислить варианты восстановления и записать любой выбор, изменивший выход. Provenance может сохранить свидетельство этого выбора. Но если замену никто не определил, предсказуемой её никакая запись не сделает.

Другие стороны того же вопроса

  1. Большинство проблем с установкой это просто не тот интерпретатор

    Большинство жалоб вида «установил, а импорт не работает» сводятся к тому, что pip принадлежит другому Python, не тому, что за…

    Ответы 1pythonnix