Хороший вопрос.
Почти во всех реальных случаях Jenkins должен требовать некоторый тип связи с целевыми серверами, такими как, tomcat, jboss, контейнеры и т. Д.
В случае tomcat или jboss для java-приложений эти серверы предоставляютконечная точка http, которая позволяет удаленным клиентам (таким как jenkins) или плагинам загружать артефакты сборки для их развертывания.
В случае решений для докеров, jenkins должен иметь возможность подключаться к хосту докера для выполнения таких команд докера, каксборка, запуск и т. д.
В случае решений saas, таких как heroku, openshift и т. д., ими управляет весь комплекс инфраструктуры.Пользователю разработчика нужно только нажать исходный код.
Здесь некоторые подходы
Подход 1. Копирование файлов с хоста jenkins в контейнер
Этопример того, как копировать файлы с хоста в живой контейнер
docker cp /file/in/host/foo.txt mycontainer:/foo.txt
Выполнить эту строку от jenkins до локального докера (если ваш jenkins находится на том же хосте вашего контейнера Docker) или удаленно вудаленный linux (в случае, если jenkins и docker находятся на разных машинах).
Во втором случае (удаленный docker) весь код также должен быть клонирован на удаленном компьютере.
Возможно, вы можете сжать исходный код, прежде чем скопировать его в контейнер.
Дженкинс должен иметь доступ к докеру для выполнения команд докера.
Подход 2: Развернуть конечную точку
- Разработать контейнер, который предоставляет конечную точку с именем / deploy .Эта конечная точка получает ваш артефакт, такой как java, или просто файл, такой как php, nodejs и т. Д.
- От jenkins отправьте артефакт, выполнив запрос http на / deploy
- OtherИдеи: / deploy должен возвращать успех или неудачу, чтобы определить состояние развертывания
Этот подход понятен, поскольку вам не нужны сумасшедшие сценарии оболочки для передачи артефактов или исходного кода в живой док-контейнер.
В этом случае Jenkins не требуется низкоуровневая связь (ssh) с вашим док-контейнером.Даже ваше контейнерное приложение может быть развернуто в другом облаке, например, Amazon, Azure или Google.
Подход 3: клонировать исходный код внутри контейнера
- Создать образ докера с готовыми конфигурациями, такими как: ssh-agent, git, language (java), узел и т. д.) и т. д.
- Клонировать исходный код внутри контейнера на этапе сборки или запуска
- Когда изображение создается или запускается, выполняйте следующие задачи в следующем порядке: клонируйте исходный код, выполните сборку и запустите,
- Jenkins просто создаст или запустит этот образ
docker run ...
отправив такие параметры, как git_url и т. Д.
Jenkins должен иметь доступ к докеру для выполнения команд Docker.
Подход 4: Создать что-то вроде heroku или openshift
- Реализация подхода 3
- Detectсобытие git push с использованием конфигураций webhook в jenkins: (https://jrichardsz.github.io/devops/devops-with-git-and-jenkins-using-webhooks)
- При обнаружении события push jenkins должен определить язык программирования репозитория и запустить ваш крутой образ докера Approach 3 .
- Уведомлять о результатах развертывания по электронной почте или что-то в этом роде.
- Сделать открытым исходным кодом