В последнее время я работал над (повторным) изучением Дженкинса и изучаю, как использовать их функцию трубопроводов.
Мы установили сервер Jenkins по адресу $ curr_job, чтобы разгрузить часть потенциальной работы от Бамбука, а также только потому, что мы пытаемся как команда DevOps отказаться от бамбука, так как мы не слишком довольны этим.
Docker Swarm
Во -первых, давайте обратимся к слону из десяти тысяч фунтов в комнате: Docker Swarm менее прохладный, чем Kubernetes.
Для небольших, простых в настройке/управлении кластерами Docker в Prem Docker Swarm хорош и вполне подходит. Автоматическая балансировка нагрузки опубликованных портов на все узлы/менеджер по умолчанию действительно гладко.
При этом не все отлично. Чтобы это работало, вам нужно разоблачить API Docker Swarm, и сделать это довольно уродливым. Я не собираюсь закрепить его, так как это лабораторная установка.
Разоблачение роя небезопасной манерой довольно прямолинейно. Найдите файл устройства SystemD и добавьте его в конец строки Execstart, а затем перезапустите службу: -h TCP://0.0.0.0: 2375
Дженкинс сервис
Вот мой Docker-compose.yml, который я использовал, чтобы развернуть это:
version: '3' services: jenkins: image: jenkins/jenkins ports: - 8080:8080 - 50000:50000 restart: always volumes: - /usr/bin/docker:/usr/bin/docker environment: - "JENKINS_SLAVE_AGENT_PORT=50000"
Помимо Docker/Swarm, я не попадаю в конфигурацию Jenkins. Существует много документации, которая существует для конфигурации и использования генерала Дженкинса.
Я не могу подчеркнуть, что это не производственная услуга. Нет ничего устойчивого.
Genkins Docker Swarm Plugn
Следующие два раздела являются самыми раздражающими. Документация определенно не хватает, когда она существует.
Чтобы включить доступ Docker Swarm в Дженкинсе, вам нужно установить «плагин Docker Swarm», а затем перезагрузить Дженкинса.
Это добавляет пару вещей Дженкинсу. Прежде всего, Docker Swarm Dashboard:
Тогда более важная вещь, в управлении jenkins -> system system, внизу есть вариант для добавления облака:
Конфигурация для этого довольно проста:
Игнорируйте 403, я, очевидно, изменил FQDNS
Кнопка «Тест» немного тревожна от того, что я видел, вам может потребоваться сохранить вашу конфигурацию, прежде чем она преуспеет.
Jenkins JNLP Агенты
Это была самая интересная часть. И под интересным, я имею в виду разочарование. Именно здесь действительно не хватало документации, и мне случайно найти сообщение в блоге с быстрым объяснением того, как все это работает.
Когда вы настраиваете кластер выше, вы получаете кнопку для добавления шаблонов:
Нажатие этой кнопки дает вам это:
В целом, очень круто, с предостережением
Метка — это то, что вы можете использовать для таргетинга, изображение — это контейнер Docker для извлечения. Они на самом деле предоставляют кучу контейнеров для использования: https://github.com/jenkinsci/jnlp-agents
Изображение Docker отличается от других контейнеров и работает, как задокументировано/хорошо с примером конфигурации. Общая идея о том, как он должен работать, заключается в том, что когда контейнер начинается, он делает завиток мастеру Дженкинса и загружает агента JNLP, чтобы убедиться, что нет версий ошибок.
Насколько я могу судить, ни одно из изображений агента не работает таким образом. Все они основаны на своих языках/наборах инструментов альпийских изображений и не имеют таких инструментов, как Curl или Git, но в Dockerfile Jenkins копирует агента. Jar из базового изображения агента JNLP.
Команда JNLP-Docker:
sh -cx curl --connect-timeout 20 --max-time 60 -o agent.jar $DOCKER\_SWARM\_PLUGIN\_JENKINS\_AGENT\_JAR\_URL && java -jar agent.jar -jnlpUrl $DOCKER\_SWARM\_PLUGIN\_JENKINS\_AGENT\_JNLP\_URL -secret $DOCKER\_SWARM\_PLUGIN\_JENKINS\_AGENT\_SECRET -noReconnect -workDir /tmp
Команда jnlp-python:
sh -cx apk -u add git && java -jar /usr/share/jenkins/agent.jar -jnlpUrl $DOCKER\_SWARM\_PLUGIN\_JENKINS\_AGENT\_JNLP\_URL -secret $DOCKER\_SWARM\_PLUGIN\_JENKINS\_AGENT\_SECRET -noReconnect -workDir /tmp
Потребовалось немного отладки и копания, чтобы выяснить, что отличалось между двумя изображениями контейнеров, и выяснить, почему мой контейнер Docker работал, но мой контейнер Python не был.
Другой большой «Gotchas», с которым я столкнулся, заключается в том, что контейнер должен работать как root, или он не будет запущен. Для Docker вам также необходимо убедиться, что вы установили/var/run/docker.sock от хоста в контейнер, чтобы у клиента Docker в контейнере есть демон Docker для работы.
Jenkinsfile
pipeline{ agent { label 'jenkins-docker' } stages { stage('Print Test'){ agent { label 'jenkins-docker' } steps { sh "uname -a" sh "docker run hello-world" } } stage('Schedule Tests'){ agent { label 'jenkins-python' } steps{ sh 'python --version' sh 'ls .' sh 'printenv' } } } }
Приведенный выше Jenkinsfile является рабочим примером, в котором у меня есть агенты для уровня трубопровода, и каждый этап (работа порождает в качестве первого агента, а затем порождает агенты для каждого из этапов).
Работа работа, агенты на разных этапах
Я не собираюсь настраивать сборки на вызовах API, опять же, это входит в документацию Дженкинса, которая хороша, и есть много.
Надеюсь, это поможет. Было бы неплохо иметь эту ссылку для себя в будущем.
Оригинал: «https://dev.to/roylarsen/jenkins-build-agents-as-docker-swarm-services-9b4»