Недавно я собирал быстрый проект Maven, чтобы показать возможный подход к организации проекта JBoss Fuse .
Проект доступен на Github здесь: https://github.com/paoloantinori/fuse_ci
И это небольшая эволюция того, что я узнал, работая с моим другом Джеймсом Роулингсом
Проект предлагает способ организации вашей кодовой базы в мультимодульном проекте Maven.
Проект находится в постоянном развитии, благодаря отзывам и предложениям, которые я получаю; но ключевой момент — показать способ организации всех артефактов, сценариев и конфигурации, составляющих ваш проект.
В папке ci
вы найдете подпапки, такие как features
или karaf_scripts
с файлами, которые вы, вероятно, в конечном итоге karaf_scripts
в каждом проекте, и с встроенными комментариями, которые помогут вам с настройкой и настройкой в соответствии с вашими конкретными потребностями .
В проекте также используется Fabric8 для управления созданным набором контейнеров OSGi и использования всех его функций для организации рабочих процессов, настройки и управления версиями ваших развертываний.
В этом посте я покажу вам, как развернуть этот пример проекта в очень типичной среде разработки, в которую входят JBoss Fuse , Maven , Git , Nexus и Jenkins .
Причина, по которой я решил осветить эту тему, заключается в том, что я часто встречаю хороших разработчиков, которые говорят мне, что, даже если они знают о добавленной стоимости инфраструктуры непрерывной интеграции, у них нет времени посвятить этой деятельности . Без дополнительного времени они сосредоточены только на развитии.
Я не хочу, чтобы вы проповедовали на эту тему или пытались рассказать вам, что они должны делать. Мне нравится доверять им и полагать, что они знают свои приоритеты проекта и что они приняли компромисс между доступным временем, отставанием и дополнительными общими преимуществами каждого вида деятельности. Точно так же мне нравится верить, что мы все согласны с тем, что для больших и длинных проектов оптимальная практика CI, безусловно, обязательна, и что никто не должен спорить об их ценности.
Имея это в виду, я хочу показать возможную настройку и рабочий процесс, чтобы показать, как быстро можно потратить один час своего времени на выгоды, которые будут длиться дольше .
Я не буду покрывать пошаговые инструкции. Но чтобы доказать вам, что все это работает, я создал bash-скрипт, использующий Docker , который продемонстрирует, как можно легко создавать сценарии и, что более важно, они действительно работают!
Если вы хотите перейти прямо до конца, скрипт доступен здесь:
https://github.com/paoloantinori/fuse_ci/blob/master/ci/deploy_scripts/remote_nexus.sh
Он использует некоторые образы Docker, которые я создал и опубликовал в качестве доверенных сборок на Docker Index :
https://index.docker.io/u/pantinor/fuse/
https://index.docker.io/u/pantinor/centos-jenkins/
https://index.docker.io/u/pantinor/centos-nexus/
Они представляют собой удобный и многократно используемый способ отправки исполняемых файлов, поскольку они показывают выполненные действия; они также могут рассматриваться как способ документирования процедуры установки и настройки.
Как уже упоминалось выше, они не обязательно вам нужны . Вы можете вручную установить и настроить службы самостоятельно. Это просто проверенный и открытый способ сэкономить время или показать вам
как я это сделал .
Давайте начнем с описания компонента нашего примера установки Continuous Integration :
- JBoss Fuse 6.1
- нексус
- Дженкинс
- Git Server
Это среда выполнения, которую мы собираемся развернуть. Он живет в специальной коробке. Он взаимодействует с Nexus как источником артефактов, которые мы производим и публикуем.
Это программное обеспечение, которое мы используем для хранения двоичных файлов, которые мы производим из нашей базы кода. К нему обращается JBoss Fuse , который загружает с него артефакты, но также к нему обращается Jenkins , который публикует двоичные файлы на нем, как последний шаг успешного задания сборки.
Это наш создатель рабочих мест . Он публикует свои выходные данные в Nexus и создает свои выходные данные, если код, который он извлек с помощью Git, успешно собирается.
Это держатель удаленного хранилища кода . Дженкинс получил доступ к нему, чтобы загрузить самую последнюю версию кода, который мы хотим построить, и он заполняется всеми разработчиками, когда они делятся своим кодом и когда они хотят построить на сервере Continous Integration. В нашем случае git server — это просто файловая система, доступ к которой осуществляется через ssh .
http://yuml.me/edit/7e75fab5 |
мерзавец
Первое, что нужно сделать, это настроить git
для управления исходным кодом ( SCM ).
Как вы можете догадаться, мы могли бы использовать любое другое подобное программное обеспечение для выполнения этой работы, от SVN до Mercurial, но я предпочитаю git
поскольку это один из самых популярных вариантов, а также потому, что это официально поддерживаемый инструмент для непосредственного взаимодействия с конфигурацией Fabric8.
У нас нет больших требований для git
. Нам просто нужна файловая система для хранения нашего общего кода и транспортная служба, которая позволяет получить доступ к этому коду.
Для простоты я решил использовать SSH в качестве транспортного протокола .
Это означает, что в окне, в котором будет храниться код, нам нужен только запущенный демон sshd
, некоторый действительный пользователь и папка, к которой он может получить доступ.
Что-то типа:
1
2
3
4
5
|
yum install -y sshd git service sshd start adduser fuse mkdir -p /home/fuse/fuse_scripts .git chmod a+rwx /home/fuse/fuse_scripts .git # or a better stratey based on guid |
Хотя единственный конкретный шаг для git
— это инициализация git
репозитория
1
|
git init --bare /home/fuse/fuse_scripts .git |
нексус
Nexus OSS — менеджер хранилища, который можно использовать для хранения артефактов Maven.
Он реализован как веб-приложение на Java. По этой причине установка Nexus особенно проста .
Благодаря встроенному экземпляру Jetty, который расширяет его возможности, нужно всего лишь извлечь архив дистрибутива и запустить двоичный файл:
1
2
3
|
wget http: //www .sonatype.org /downloads/nexus-latest-bundle . tar .gz /tmp/nexus-latest-bundle . tar .gz tar -xzvf /tmp/nexus-latest-bundle . tar .gz -C /opt/nexus /opt/nexus/nexus- * /bin/nexus |
После запуска Nexus будет доступен по умолчанию на этой конечной точке: http: // your_ip / 8081 / nexus с admin
качестве пользователя и admin123
качестве пароля.
Дженкинс
Дженкинс — это планировщик работы, который мы собираемся использовать для создания нашего проекта. Мы хотим настроить Jenkins таким образом, чтобы он мог напрямую подключаться к нашему git
репо для загрузки исходного кода проекта. Для этого нам понадобится дополнительный плагин Git Plugin . Нам, очевидно, также нужны java
и maven
установленные на коробке. Поскольку конфигурация Jenkins состоит из различных этапов, включающих взаимодействие с несколькими административными страницами, я лишь дам несколько советов о важных этапах, которые необходимо выполнить. По этой причине я настоятельно рекомендую вам проверить мой полностью автоматизированный скрипт, который делает все в полной автоматизации . Как и Nexus, Jenkins реализован как веб-приложение на Java. Поскольку мне нравится использовать RHEL- совместимый дистрибутив, такой как Centos или Fedora , я устанавливаю Jenkins в упрощенном виде . Вместо того, чтобы извлекать архив вручную, как мы это делали для Nexus, я просто определяю новый репозиторий yum и позволяю yum выполнять установку и настройку как сервис для меня:
1
2
3
4
|
wget http: //pkg .jenkins-ci.org /redhat/jenkins .repo -O /etc/yum .repos.d /jenkins .repo rpm -- import http: //pkg .jenkins-ci.org /redhat/jenkins-ci .org.key yum install jenkins service jenkins start |
После запуска Jenkins вы найдете его веб-интерфейс, доступный здесь: http: // your_ip: 8080 /
По умолчанию он настроен в однопользовательском режиме, и этого достаточно для нашей демонстрации. Вы можете проверить http: // your_ip: 8080 / configure, чтобы проверить, хорошо ли выглядят значения для JDK, Maven и git. Обычно они автоматически выбираются, если у вас уже установлено программное обеспечение до Jenkins. Затем вам необходимо установить Git Plugin : http: // your_ip: 8080 / pluginManager
Как только вы все настроите и после перезапуска экземпляра Jenkins, мы сможем увидеть новую опцию в форме, которая позволяет нам создавать задания сборки Maven. Под разделом: Управление исходным кодом теперь есть опция git . Это просто вопрос предоставления координат вашего SSH-сервера, например:
1
|
ssh : //fuse @172.17.0.5 /home/fuse/fuse_scripts .git |
А в разделе « Сборка» в разделе « Цели и параметры» нам необходимо явно указать Maven, что мы хотим запустить фазу deploy
, предоставив IP-адрес Nexus insance:
1
|
clean deploy -DskipTests -Dip.nexus=172.17.0.3 |
Последний шаг настройки — указать другой файл настроек maven в расширенных свойствах maven , который хранится вместе с исходным кодом:
https://github.com/paoloantinori/fuse_ci/blob/master/my_settings.xml
И это содержит имя пользователя и пароль для представления в Nexus, при отправке артефактов туда.
Настройка завершена, но нам нужен дополнительный шаг, чтобы Jenkins работал с Git .
Поскольку мы используем SSH в качестве транспортного протокола, при первом подключении к SSH-серверу нас попросят подтвердить, что сервер, к которому мы подключаемся, безопасен и что его отпечаток — тот, который мы ожидали , Эта операция вызова заблокирует задание на сборку, поскольку пакетное задание и никто не подтвердит учетные данные SSH.
Чтобы избежать всего этого, уловка заключается в том, чтобы подключиться к jenkins
Jenkins через SSH, стать пользователем, который используется для запуска процесса Jenkins, в моем случае — jenkins
, и оттуда вручную подключиться к серверу ssh git для выполнения операции идентификации. в интерактивном режиме, так что это больше не потребуется в будущем:
1
2
3
4
|
ssh fuse@IP_GIT_SERVER The authenticity of host '[172.17.0.2]:22 ([172.17.0.2]:22)' can't be established. DSA key fingerprint is db:43:17:6b:11:be:0d:12:76:96:5c:8f:52:f9:8b:96. Are you sure you want to continue connecting ( yes /no )? |
Альтернативный подход, который я использую в своем образе док-станции Jenkins, состоит в том, чтобы полностью отключить идентификацию отпечатка пальца SSH , подход, который может быть слишком небезопасным для вас:
1
2
3
|
mkdir -p /var/lib/jenkins/ . ssh ; printf "Host * \nUserKnownHostsFile /dev/null \nStrictHostKeyChecking no" >> /var/lib/jenkins/ . ssh /config ; chown -R jenkins:jenkins /var/lib/jenkins/ . ssh |
Если все настроено правильно, Jenkins сможет автоматически загрузить наш проект, собрать его и опубликовать на Nexus.
Но…
Перед тем, как сделать это, нам нужен разработчик, который отправит наш код в git, иначе не будет никакого исходного файла для сборки! Для этого вам просто нужно клонировать мое репо, настроить дополнительное удаленное репо (наш частный сервер git) и нажать:
1
2
3
|
git remote add upstream ssh : //fuse @$IP_GIT /home/fuse/fuse_scripts .git git push upstream master |
На этом этапе вы можете запустить задание сборки на Jenkins. Если вы запускаете его впервые, Maven загрузит все зависимости, так что это может занять некоторое время . если все пройдет успешно, вы получите подтверждение того, что ваши артефакты были опубликованы в Nexus.
JBoss Fuse
Теперь, когда наш сервер Nexus заполнен артефактами maven, созданными из нашей базы кода, нам просто нужно указать нашему экземпляру Fuse использовать Nexus в качестве удаленного репозитория Maven. Обучает нас, как это сделать: в оболочке karaf
нам нужно изменить значение свойства,
1
|
fabric:profile-edit --pid io.fabric8.agent /org .ops4j.pax.url.mvn.repositories=\"http: //172 .17.0.3:8081 /nexus/content/repositories/snapshots/ @snapshots@ id =sample-snapshots\" default |
И теперь мы можем убедиться, что интеграция завершена с помощью этой команды:
1
|
cat mvn:sample /karaf_scripts/1 .0.0-SNAPSHOT /karaf/create_containers |
Если все в порядке, вы увидите вывод, похожий на этот:
01
02
03
04
05
06
07
08
09
10
11
12
|
# create broker profile fabric:mq-create --profile $BROKER_PROFILE_NAME $BROKER_PROFILE_NAME # create applicative profiles fabric:profile-create --parents feature-camel MyProfile # create broker fabric:container-create-child --jvm-opts "$BROKER_01_JVM" --resolver localip --profile $BROKER_PROFILE_NAME root broker # create worker fabric:container-create-child --jvm-opts "$CONTAINER_01_JVM" --resolver localip root worker1 # assign profiles fabric:container-add-profile worker1 MyProfile |
Это означает, что karaf
сценарием karaf
предоставляющим координаты Maven, работала хорошо, и теперь вы можете использовать shell:source
, osgi:install
или любую другую команду, которая требует артефактов, опубликованных на Nexus.
Вывод
Как уже много раз упоминалось, это всего лишь возможный рабочий процесс и пример взаимодействия между этими платформами.
Ваша команда может следовать различным процедурам или использовать разные инструменты.
Возможно, вы уже внедрили более продвинутые потоки на основе нового плагина Fabric8 Maven .
В любом случае я приглашаю всех, кто интересуется этой темой, оставить комментарий или ссылку на другой подход и помочь всем, кто поделится нашим опытом .
Ссылка: | Непрерывная интеграция с JBoss Fuse, Jenkins и Nexus от нашего партнера JCG Паоло Антинори в блоге Someday Never Comes . |