Як запускати складання в контейнерах Docker від Jenkins


18

Я намагаюся використовувати Дженкінса для створення проекту C ++ у контейнері Docker. У мене немає проблем з будівництвом в Дженкінсі або з будівництвом контейнера поза Дженкінсом.

Нижче - те, що я спробував. Я опускаю відображення томів для наочності.

Випадок 1

Наступна команда успішно виконує збірку в оболонці.

docker run --rm --interactive=true --tty=true $IMAGE make

Однак при запуску в Дженкінс як "виконувати оболонку" крок Докер повертає наступну помилку.

cannot enable tty mode on non tty input

Випадок 2

Наступна команда схожа на попередню, але вимикає інтерактивність.

docker run --rm $IMAGE make

Дженкінс може запустити збірку успішно. Однак при перериванні конструкції є серйозні проблеми. Збірка відразу позначається як перервана, але контейнер працює, поки збірка не завершиться. Також контейнер не виймається після виходу.

При запуску в оболонці команда будується успішно, але перервати її неможливо. Також контейнер виймається після виходу.

Питання

Хто-небудь знав би, як чисто запускати збірки в контейнерах Docker від Jenkins і зберігати можливість переривати збірки?

Використання будь-якого з плагінів Дженкінса не є можливим, оскільки виклики Докера знаходяться всередині сценаріїв і не можуть бути легко вилучені.


1
Можливо, із завданням після збирання, завданням якого є видалення контейнера? А для випадків, коли ви скасовуєте збірку, можливо, у вас може бути спеціальна збірка, яка зупиняє і видаляє всі помилкові контейнери? Це неоптимально, але принаймні, його легко налаштувати. :-)
lgeorget

1
Це не зовсім відповідає моєму визначенню чистого :) Але я ціную пропозицію, і це, безумовно, є коректним рішенням.
marcv81

Відповіді:


3

Найпростіший спосіб запустити свій докерський конвеєр у Дженкінсі - це використовувати трубопровідну роботу. У ньому багато вбудованих плагінів, які могли б контролювати ваше середовище та контейнери Docker.

кілька прикладів

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

Для отримання додаткової інформації: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

Ви можете реалізувати наступний робочий процес:

  1. створіть контейнер докера та вкажіть ім'я, щоб ви могли легко посилатися на нього (наприклад, у скриптах)
  2. запустіть його та використовуйте щось як точку входу, яка підтримує роботу контейнера
  3. Використовуйте docker exec container cmd ...для видачі команд побудови та тестування
  4. Зупиніть контейнер
  5. Видаліть зображення

Це docker exec ...як віддалений доступ оболонки до мережевої машини. За замовчуванням він не є інтерактивним, а також не виділяє tty. Це має бути добре для складання та виконання тестових наборів. Команда належним чином пересилає стан виходу команди, виконаної всередині контейнера.

Робота зі створення може бути скасована за допомогою:

  • docker stop container (надсилає TERM і KILL і чекає між ними), або
  • docker kill container, або навіть
  • docker exec container pkill someexecutable

Робочий процес з конкретними командами:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

Для реального прикладу, що використовує цей робочий процес, ви можете подивитися цей .travis.yml файл, фактичні сценарії CI , сценарій, що працює всередині контейнера, та файли докера використаних зображень.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.