Я пытаюсь использовать Jenkins для создания проекта C ++ в контейнере Docker. У меня нет проблем со сборкой в Дженкинсе или сборкой в контейнере за пределами Дженкинса.
Ниже я попробовал. Я опускаю отображение томов для ясности.
Дело 1
Следующая команда успешно запускает сборку в оболочке.
docker run --rm --interactive=true --tty=true $IMAGE make
Однако при запуске в Jenkins в качестве шага «выполнить оболочку» Docker возвращает следующую ошибку.
cannot enable tty mode on non tty input
Дело 2
Следующая команда похожа на предыдущую, но отключает интерактивность.
docker run --rm $IMAGE make
Дженкинс может успешно запустить сборку. Однако при прерывании сборки возникают серьезные проблемы. Сборка сразу помечается как прерванная, но контейнер продолжает работать до завершения сборки. Также контейнер не удаляется после выхода.
При запуске в оболочке команда строится успешно, но ее невозможно прервать. Также контейнер удаляется после выхода.
Вопрос
Кто-нибудь знает, как правильно запускать сборки в контейнерах Docker из Jenkins и сохранять ли возможность отмены сборок?
Использование любого из плагинов Jenkins не вариант, потому что вызовы Docker находятся внутри скриптов и не могут быть легко извлечены.
Ответы:
Самый простой способ запустить сборку докеров в Jenkins - это использовать конвейерное задание. Он имеет много встроенных плагинов, которые могут контролировать вашу среду Docker и контейнеры.
несколько примеров
Для получения дополнительной информации: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
источник
Вы можете реализовать следующий рабочий процесс:
docker exec container cmd ...
для выдачи команд сборки и тестированияЭто
docker exec ...
похоже на удаленный доступ к сетевой машине. По умолчанию он не интерактивен и не выделяет tty. Это должно подойти для компиляции и выполнения тестовых наборов. Команда правильно перенаправляет статус выхода команды, выполненной внутри контейнера.Задание на сборку может быть прервано с помощью:
docker stop container
(отправляет TERM и KILL и ждет между ними), илиdocker kill container
, или дажеdocker exec container pkill someexecutable
Рабочий процесс с конкретными командами:
Для реального примера, использующего этот рабочий процесс, вы можете посмотреть этот файл .travis.yml , реальные сценарии CI , сценарий, выполняемый внутри контейнера, и файлы Docker используемых изображений.
источник