Как мне получить статус рабочего пространства в bazel

Я хотел бы версию артефактов сборки с номером сборки для CI, переданным в bazel через workspace_status_command. Иногда я хотел бы включить номер сборки к имени артефакта.

Есть ли способ получить доступ ctx при написании макроса (поскольку я пытался использовать ctx.info_file)? Пока что кажется, что я могу получить доступ к такой информации только в новом правиле при создании нового правила, что в данном случае немного неудобно.

Я предполагаю, что наличие номера сборки или подобной информации - довольно распространенный вариант использования, поэтому мне интересно, является ли это более простым способом доступа к такой информации.

2 ответа

Решение

Нет, вам действительно нужно определить собственное правило, чтобы иметь возможность использовать информацию, передаваемую из workspace_status_command через info_file а также version_fileфайл, и даже в этом случае вы не можете просто получить доступ к его значениям из Starlark, вы можете передать файл в свой инструмент (оболочку) и обработать входные данные там. В конце концов, правила (сборки) ничего не выполняют, они генерируют действия, которые будут выполнены на более позднем этапе.

Однако будьте осторожны, потому что если вы зависите от info_file (STABLE_*записи), изменения в файле делают цели недействительными в зависимости от этого. Для чего-то вроде номера сборки CI обычно это не то, что вам нужно, иversion_fileскорее то, что вам нужно. Возможно, вы захотите записать идентификатор, но обычно вы не хотите перестраивать материал только потому, что идентификатор сборки изменился (это новый запуск CI). Однако даже простое включение идентификаторов может считаться проблематичным, если вы хотите, чтобы ваши результаты были полностью воспроизводимыми.

Имена переменных артефактов - это совершенно новая проблема, и есть веские причины, почему бы этого не сделать. Но, как правило, поскольку предложено, имя будет определяться во время выполнения действий (чтение вversion_fileв вашем инструменте), вы прошли этап анализа, чтобы решить, что получится в результате действия. Единственный способ, о котором я сейчас знаю (то есть для входных переменных вне дерева, вы, конечно, всегда можете определить переменную Starlark иload это от твоего BUILD файл), чтобы иметь возможность сделать это, нужно использовать артефакты дерева (используя declare_directory в вашем правиле.

Вы не можете получить доступ к значению во время загрузки или анализа (например, в макросе).

Доступ к нему можно получить во время выполнения.

      def _my_rule_impl(ctx):
  output = ctx.actions.declare_file("%s.txt" % ctx.attr.name)
  
  ctx.actions.run_shell(
    args = [ctx.info_file.path, output.path],
    command = 'grep -oP "(?<=STABLE_BUILD_NUMBER=).*" "$1" > "$2"',
    inputs = [ctx.info_file],
    outputs = [output]
  )

  return [DefaultInfo(files = depset([output]))]

my_rule = rule(
  implementation = _my_rule_impl,
)

Переменные состояния рабочей области, начинающиеся сSTABLE_иBUILD_EMBED_LABELнаходятся вctx.info_fileи включены в ключ кэша. Другие находятся вctx.version_file, который исключен из ключа кэша.


Если вам нужен доступ к нему во время анализа, вы можете использовать настройку сборки.

Если вам нужен доступ к нему во время загрузки, вы можете написать файл Starlark.

      BUILD_NUMBER = ""
      echo BUILD_NUMBER="$BUILD_NUMBER" > vars.bzl
Другие вопросы по тегам