`/ bin / sh` не найден в tox внутри Jenkins внутри докера

1

Я пытаюсь настроить трубопровод Дженкинса, который запускает tox внутри контейнера докера. Существует известная проблема, что линии shebang очень длинны внутри Jenkins, и предлагаются два решения. Во-первых, используйте --workdir для выбора более короткого пути. Этот вариант работает в принципе, но я теряю автоматические уникальные имена путей для каждого проекта от Jenkins. Поэтому я предпочел бы использовать второй вариант, TOX_LIMITED_SHEBANG. К сожалению, это похоже на ошибку со следующей ошибкой, когда предполагается, что тестируемый пакет установлен: FileNotFoundError: [Errno 2] No such file or directory: "b'/bin/sh'": "b'/bin/sh'". Я подтвердил, что /bin/sh фактически доступен в контейнере докера. Файл Jenkins выглядит следующим образом:

node("docker") {
    // burnpanck/tox-base contains tox and many python versions
    docker.image('burnpanck/tox-base').inside {
        checkout scm
        stage('Matrix-test using Tox') {
            // verify that /bin/sh exists
            sh 'ls -al /bin'
            // the following does not work
            sh 'TOX_LIMITED_SHEBANG=1 tox -vv'
            // the following works 
            // sh 'tox --workdir=/var/jenkins_home/tox'
        }
    }
}

Tox - это версия 3.1.2 и работает под python 3.6 (изображение докеров генерируется из этого файла Docker). Что меня немного удивляет, это "b"/bin/sh ", исходящий из str -ing экземпляра bytes. Может ли быть, что ток действительно пытается запустить программу по имени sh' в пути b'/bin?

Используемый tox.ini просто называет pytest:

[tox]
envlist = py36
[testenv]
recreate = True
commands =
    pytest

Полная обратная связь от tox (выход консоли Jenkins) заключается в следующем:

py36 create: /var/jenkins_home/workspace/_debug_jenkins-long-shebang-L7UHBNCVPSOBSTKZ7COPFJBJLWR5XZXFIAD7TBGC4WQLVDLZYVQQ/.tox/py36
py36 inst: /var/jenkins_home/workspace/_debug_jenkins-long-shebang-L7UHBNCVPSOBSTKZ7COPFJBJLWR5XZXFIAD7TBGC4WQLVDLZYVQQ/.tox/dist/test_model-0.dev20180717.zip
ERROR: invocation failed (errno 2), args: [b'/bin/sh', '/var/jenkins_home/workspace/_debug_jenkins-long-shebang-L7UHBNCVPSOBSTKZ7COPFJBJLWR5XZXFIAD7TBGC4WQLVDLZYVQQ/.tox/py36/bin/pip', 'install', '/var/jenkins_home/workspace/_debug_jenkins-long-shebang-L7UHBNCVPSOBSTKZ7COPFJBJLWR5XZXFIAD7TBGC4WQLVDLZYVQQ/.tox/dist/test_model-0.dev20180717.zip'], cwd: /var/jenkins_home/workspace/_debug_jenkins-long-shebang-L7UHBNCVPSOBSTKZ7COPFJBJLWR5XZXFIAD7TBGC4WQLVDLZYVQQ
Traceback (most recent call last):
  File "/.pyenv/versions/3.6.6/bin/tox", line 11, in <module>
    sys.exit(cmdline())
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 39, in cmdline
    main(args)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 45, in main
    retcode = Session(config).runcommand()
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 422, in runcommand
    return self.subcommand_test()
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 620, in subcommand_test
    self.installpkg(venv, path)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 561, in installpkg
    venv.installpkg(path, action)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/venv.py", line 277, in installpkg
    self._install([sdistpath], extraopts=extraopts, action=action)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/venv.py", line 342, in _install
    self.run_install_command(packages=packages, options=options, action=action)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/venv.py", line 314, in run_install_command
    redirect=self.session.report.verbosity < 2,
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/venv.py", line 427, in _pcall
    return action.popen(args, cwd=cwd, env=env, redirect=redirect, ignore_ret=ignore_ret)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 153, in popen
    popen = self._popen(args, cwd, env=env, stdout=stdout, stderr=subprocess.STDOUT)
  File "/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tox/session.py", line 248, in _popen
    env=env,
  File "/.pyenv/versions/3.6.6/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/.pyenv/versions/3.6.6/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: "b'/bin/sh'": "b'/bin/sh'"
  • 0
    В основном да, строка /bin/sh неправильно искажается при любых попытках преобразовать ее в байтовую строку. Где происходит это преобразование?
  • 0
    Можем ли мы увидеть, что ваш tox.ini обрезан до абсолютного минимума, который демонстрирует такое поведение?
Показать ещё 1 комментарий
Теги:
docker
jenkins
tox

1 ответ

2
Лучший ответ

В настоящее время у нас есть открытая ошибка. TOX_LIMITED_SHEBANG нарушается, когда ток работает под python3.

Основная причина - отсутствует .decode() а список заканчивается смешанными bytes и экземплярами str.

Временные решения, пока я не исправлю это, не используйте TOX_LIMITED_SHEBANG для использования tox с интерпретатором TOX_LIMITED_SHEBANG.

  • 1
    Спасибо за указание мне на эту ошибку! К сожалению, мои принципы больше не позволяют мне запускать что-либо под python 2 ;-). До сих пор я работал без TOX_LIMITED_SHEBANG . Я рассмотрю возможность использования токсикоза.
  • 0
    Не виню тебя! Оставь питона 2!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню