Статьи

Разработка, тестирование и развертывание автономных приложений на CloudBees

CloudBees — это облачная платформа, предоставляющая репозиторий, сервис CI (Jenkins) и сервер для ваших приложений. Итак, все, что вам нужно для разработки, тестирования и развертывания. Есть много вариантов, например, хранилище может быть Git или SVN, для сервера вы можете выбрать Jetty, Tomcat, Glassfish, JBoss, Wildfly и т. Д. Также можно запускать автономные приложения, которые снабжены номером порта, так что вы можете запустить собственный сервер. И это тот случай, который мы рассмотрим здесь.

Spray.io — это фреймворк Scala для веб-приложений. Он позволяет вам создавать автономные веб-приложения (запускающие собственный сервер, спрей-баллончик) или несколько ограниченные .war-приложения (спрей-сервлет), которые вы можете развернуть на сервере JEE, например Glassfish, JBoss и т. Д. Мы собираемся использовать автономный Вот.

Вы можете клонировать приложение из GitHub . Давайте кратко рассмотрим это сейчас.

Приложение

ботинок

Boot файл — Scala App , поэтому он похож на класс java с методом main. Это работает. Он создает субъект Service , который обрабатывает все HTTP-запросы. Он также считывает номер порта из системного свойства app.port и связывает службу с хостом и портом. app.port предоставляется CloudBees, если вы хотите запустить приложение локально, вам нужно установить его, например, с помощью командной строки jvm -Dapp.port=8080 .

обслуживание

Service имеет черту MyService , которая обрабатывает маршрутизацию только на пустой путь. Да, приложение не очень сложное!

Buildfile

Файл build.gradle немного интереснее. Давайте начнем с его конца.

  • mainClassName имеет значение Scala App. Это класс, который будет запускаться, когда вы запускаете его локально из командной строки при gradlew run .
  • applicationDefaultJvmArgs имеет значение -Dapp.port=8080 и также необходимо для локального запуска из Gradle. Таким образом мы устанавливаем порт, к которому будет привязан Service .
  • jar.archiveName — это параметр, используемый для установки сгенерированного имени .jar. Без этого это зависит от имени каталога проекта.

Вы можете запустить приложение, gradlew run (убедитесь, что файл gradlew является исполняемым). Когда он работает, вы можете указать в браузере http: // localhost: 8080, и вы должны увидеть «Скажите привет распылению на аэрозольном баллончике!» Ничего особенного, извини.

Существует также задача «cb», определенная для gradle. Если вы gradlew cb , он создает zip-файл со всеми зависимостями .jars и szjug-sprayapp-1.0.jar в своем корне. Этот макет необходим для автономных приложений CloudBees.

Развертывание в CloudBees

Сначала вам нужно создать учетную запись на CloudBees . Если у вас есть, скачайте CloudBees SDK, чтобы вы могли запускать команды из командной строки. На Mac я предпочитаю brew install , но вы можете выбрать свой путь.

После установки выполните команду bees . При первом запуске он запрашивает ваш логин / пароль, поэтому вам не нужно указывать его каждый раз, когда вы хотите использовать bees .

Сборка .zip мы развернем в облаке. Перейдите в каталог приложения ( szjug-sprayapp ) и gradlew cb команду gradlew cb . Эта команда не только создает файл .zip, но и печатает список .jars, полезный для передачи команде пчел как classpath.

Разверните приложение, выполнив следующую команду из szjug-sprayapp :

1
bees app:deploy -a spray-can -t java -R class=pl.szjug.sprayapp.Boot -R classpath=spray-can-1.3.1.jar:spray-routing-1.3.1.jar:spray-testkit-1.3.1.jar:akka-actor_2.10-2.3.2.jar:spray-io-1.3.1.jar:spray-http-1.3.1.jar:spray-util-1.3.1.jar:scala-library-2.10.3.jar:spray-httpx-1.3.1.jar:shapeless_2.10-1.2.4.jar:akka-testkit_2.10-2.3.0.jar:config-1.2.0.jar:parboiled-scala_2.10-1.1.6.jar:mimepull-1.9.4.jar:parboiled-core-1.1.6.jar:szjug-sprayapp-1.0.jar build/distributions/szjug-sprayapp-1.0.zip

А вот сокращенная версия для удобства чтения:

1
bees app:deploy -a spray-can -t java -R class=pl.szjug.sprayapp.Boot -R classpath=...:szjug-sprayapp-1.0.jar build/distributions/szjug-sprayapp-1.0.zip

spray-can — это название приложения, -t java — тип приложения. -R — свойства CloudBees, такие как класс для запуска и путь к классу для использования. Файлы для classpath печатаются, когда Gradle запускает задачу cb , поэтому вам просто нужно скопировать и вставить.

Вот и все! Наше приложение работает на сервере CloudBees. Это доступно по URL из консоли CloudBees.

URL

Используйте сервисы CloudBees

Приложение развернуто на CloudBees, но это все? Как я уже упоминал, мы могли бы также использовать git-репозиторий и Jenkins. Давай сделаем это сейчас.

Репозиторий (Git)

Создайте новый git-репозиторий в своей учетной записи CloudBees. Выберите «Repos» слева, «Add Repository»… все это довольно просто.

2014-07-01_2342

Назовите это «szjug-app-repo» и помните, что это должен быть Git.

2014-07-01_2343

Затем добавьте этот репозиторий как удаленный в локальный репозиторий git. На странице репозиториев в консоли CloudBees есть очень полезная таблица о том, как это сделать.

Сначала добавьте git remote repository. Давайте cb это cb

1
git remote add cb ssh://[email protected]/pawelstawicki/szjug-app-repo.git

Затем вставьте туда свои коммиты:

1
git push cb master

Теперь у вас есть код на CloudBees.

CI build server (Дженкинс)

Пришло время настроить сборку приложения на CI-сервере. Перейдите в «Builds». Здесь живет Дженкинс. Создайте новую работу в свободном стиле.

2014-07-01_2357

2014-07-01_2359

Настройте свой git-репозиторий, чтобы Дженкинс всегда проверял свежую версию кода. Вам понадобится URL хранилища. Вы можете взять его со страницы «Repos».

2014-07-02_0001

Установите URL здесь:

2014-07-02_0010

Следующее, что нужно настроить — это задача Gradle. Добавьте следующий шаг сборки типа «Invoke gradle script». Выберите «Использовать Gradle Wrapper» — так вы можете использовать версию Gradle, поставляемую с проектом. Установите «cb» в качестве задачи для запуска.

gradlew

Ну, это все, что вам нужно для создания приложения. Но мы хотим развернуть его, не так ли? Добавьте действие после развертывания «Развернуть приложения». Введите идентификатор приложения (в нашем случае spray-can баллон, регион должен измениться автоматически). Таким образом, мы говорим Дженкинс, где развернуть. Также необходимо знать, что развертывать. Введите build/distributions/szjug-app-job-*.zip как «Файл приложения».

2014-07-02_0113

Поскольку вы развернули приложение ранее из командной строки, такие параметры, как тип приложения, основной класс, путь к классам и т. Д., Уже есть, и вам не нужно предоставлять его снова.

Также может быть полезно сохранить zip-файл из каждой сборки, чтобы мы могли его заархивировать. Просто добавьте действие «Архивировать артефакты» после сборки и установите тот же zip-файл.

2014-07-02_0039

Хорошо, это все для конфигурации сборки на Jenkins. Теперь вы можете нажать на ссылку «Build now», и сборка должна быть добавлена ​​в очередь. Когда он будет завершен, вы увидите журналы, состояние и т. Д. Но, что более важно, приложение должно быть развернуто и доступно для всего мира. Теперь вы можете что-то изменить в нем, нажать «Построить сейчас» и после его завершения проверить, применяются ли изменения.

тесты

Вероятно, вы также заметили, что есть тест прилагается. Вы можете запустить его с gradlew test . Это тест specs2 , с чертой MyService поэтому у нас есть доступ к myRoute и Specs2RouteTest так что у нас есть доступ к средствам тестирования spray.io.

@RunWith(classOf[JUnitRunner]) необходим для запуска тестов в Gradle.

Теперь, когда у нас есть тесты, мы хотели бы увидеть результаты тестов. Это еще один шаг после сборки в Jenkins. Нажмите «Добавить действие после сборки» -> «Опубликовать отчет о результатах теста JUnit».

Gradle не помещает результаты тестов там, где работает maven, поэтому вам нужно указать расположение файлов отчетов.

опубликовать результаты теста

Когда это будет сделано, следующая сборка должна показать результаты теста.

Триггерная сборка

Теперь у вас есть работа по сборке, позволяющая создавать, тестировать и развертывать приложение. Тем не менее, эта сборка будет работать только тогда, когда вы запустите ее вручную. Давайте запускать его каждый день, а после каждого изменения отправлять в хранилище.

спусковой крючок

Резюме

Итак, теперь у вас есть все необходимое для разработки приложения. Git-репозиторий, система непрерывной интеграции и инфраструктура для развертывания приложения (на самом деле, также постоянно).

Подумайте о своем собственном приложении, и … счастливы!