Для l oop в gilab-ci выходит, когда внутренняя команда выдает ненулевой код выхода - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь запустить анализ кода mypy внутри моего gitlab-ci. Я делаю это с помощью следующего кода:

mypy:
  only:
  - master
  script:
  - for config_path in $(find * -regex '.*__init__.py' -mindepth 2); do mypy $config_path; exit_code=$?; done
  allow_failure: true

К сожалению, CI останавливается после выполнения mypy для первого элемента из списка, найденного командой find . Команда mypy возвращает RC = 2.

Я помещаю извлечение кода выхода в переменную из-за предупреждения: Если какая-либо из команд сценария возвращает код выхода, отличный от нуля, задание потерпит неудачу и дальнейшие команды не будут выполнены. Этого поведения можно избежать, сохранив код выхода в переменной , упомянутой здесь: https://docs.gitlab.com/ee/ci/yaml/README.html#script

Как можно добиться запуска целого для l oop несмотря на ненулевое значение коды выхода внутри его тела?

Ответы [ 3 ]

1 голос
/ 27 января 2020

try

do mypy $config_path || true; done

|| true принудительно возвращает код возврата 0 независимо от того, какой код возврата mypy $config_path имеет.

0 голосов
/ 24 января 2020

Я бы просто поместил скрипт в текстовый файл, добавил его к git и просто вызвал его с .gitlab-ci.yml. Примерно так:

//run_mypy.sh
for config_path in $(find * -regex '.*__init__.py' -mindepth 2); do mypy $config_path; exit_code=$?; done

//.gitlab-ci.yml
mypy:
  only:
   - master
  script:
   - run_mypy.sh
  allow_failure: true

Я слишком много раз пытался и изо всех сил пытался заставить сложные скрипты запускаться прямо из файла .gitlab-ci.yml. В моем случае это были windows командные файлы и сценарии powershell, но все они страдают от одной и той же проблемы: у вас есть файл yaml, который поддерживает определенный формат и использует определенные специальные символы, и внутри этого вы пытаетесь express совершенно другой формат.

Также гораздо проще управлять кодом выхода из отдельного скрипта, чем пытаться выяснить, как именно GitLab обрабатывает коды выхода. Опять же, это в основном может быть проблемой для сценариев PowerShell, но я все же рекомендую всем хранить ваши сложные сценарии вне .gitlab-ci.yml.

0 голосов
/ 23 января 2020

Я не уверен, что gitlab-ci поддерживает <(), но в bash это будет </p>

while read -r -d '' config_path; do mypy "$config_path"; exit_code=$?; done < <(find . -mindepth 2 -name '*__init__.py' -print0)

Ошибка, вероятно, связана с тем, что -mindepth 2 следует после флага -regex, однако -name или -iname, вероятно, лучше для этого

...