В этой статье мы узнаем, как мы можем использовать Travis CI для непрерывной интеграции и непрерывного развертывания (CI / CD) приложения SpringBoot . Мы узнаем, как выполнять задачи сборки maven, выполнять проверку покрытия тестов с помощью плагина JaCoCo, проверки качества кода с помощью SonarCloud , создавать образ Docker, передавать его в DockerHub и, наконец, развертывать его в Heroku .
Исходный код этой статьи находится по адресу https://github.com/sivaprasadreddy/freelancer-kit.
На прошлой неделе я говорил с моим другом о том, как легко было создать приложение Java и развернуть его с помощью SpringBoot. Во время обсуждения выяснилось, сколько стоит создать приложение Java и развернуть его где-нибудь (в облаке). Итак, я подумал о том, чтобы больше узнать о бесплатных сервисах, которые мы можем использовать для автоматизации всех действий по разработке проекта с минимальными затратами или вообще без затрат.
Несколько лет назад я использовал CloudBees и CloudFoundry для создания и развертывания своих любимых проектов, которые предлагали бесплатный хостинг, но они больше не предоставляют бесплатные услуги.
В прошлом я использовал Travis CI для своих Java-проектов только для предварительного тестирования, но, просмотрев их документацию, я понял, что они предоставляют гораздо больше возможностей.
Поэтому я подумал о проверке, могу ли я использовать Travis CI для своих проектов, чтобы выполнять все обычные задачи, такие как:
- Оформить последний код
- Скомпилируйте и запустите модульные и интеграционные тесты
- Запустите покрытие кода JaCoCo и завершите сборку, если желаемый процент не достигнут
- Запустите проверки качества кода SonarQube
- По желанию можно создать образ Docker и опубликовать его в Docker Hub.
- Разверните приложение на каком-нибудь бесплатном облачном хостинге, таком как Heroku или OpenShift
Изучив их документацию, я понял, что мы можем выполнять все эти задачи, используя некоторые бесплатные онлайн-сервисы и интеграцию с ними Travis-CI.
- GitHub для хранилища кода
- SonarCloud для бесплатного сервиса SonarQube
- Docker Hub для публикации изображений Docker
- Heroku для развертывания приложения
Давайте посмотрим, как мы можем выполнить все вышеупомянутые задачи, используя Travis-CI для проекта SpringBoot .
Шаг 1: Создать проект SpringBoot
Создайте проект SpringBoot, используя http://start.spring.io или из вашей IDE. Я использую инструмент сборки Maven, вы также можете использовать Gradle, если хотите. Теперь зафиксируйте проект в своем хранилище github.
Шаг 2: Создайте файл .travis.yml
Чтобы включить интеграцию Travis-CI, нам нужно создать файл .travis.yml в корневой папке проекта.
Поскольку мы создаем Java-проект на основе Maven, создайте файл .travis.yml со следующим содержимым:
.travis.yml
1
2
|
language: java jdk: oraclejdk8 |
Эта минимальная конфигурация достаточна для того, чтобы Travis-CI распознал наш Java-проект на основе Maven и собрал его. Если в корневой папке нашего проекта есть файл build.gradle, Travis будет рассматривать его как проект Gradle, или, если есть pom.xml, он будет обрабатывать его как проект Maven. Если есть и build.gradle, и pom.xml, то скрипт сборки Gradle будет иметь приоритет.
По умолчанию Трэвис запускает mvn test -B для сборки проекта. Если Трэвис найдет упаковщик mvnw, он будет использоваться как ./mvnw test -B .
Но если вы хотите запустить другую команду или хотите запустить несколько команд, мы можем использовать скрипт-блок для ее настройки.
Теперь подтвердите и отправьте файл .travis.yml в GitHub.
Шаг 3. Включите Travis-CI для репозитория GitHub.
Перейдите на https://travis-ci.org/ и войдите в GitHub .
Теперь нажмите Add New Repository (+ символ).
Включите Трэвис для хранилища. После включения Travis нажмите на этот репозиторий, и вы можете запустить сборку, выбрав Дополнительные параметры -> Запуск сборки .
Теперь вы можете видеть, что сборка запущена, тесты выполнены, и на ваш электронный адрес будет отправлено уведомление о статусе сборки.
Шаг 4: Добавьте проверку покрытия кода JaCoCo
Добавьте плагин Maven JaCoCo в pom.xml с такими параметрами, как желаемый процент покрытия кода, игнорируемые пакеты / классы и т. Д.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
< plugin > < groupId >org.jacoco</ groupId > < artifactId >jacoco-maven-plugin</ artifactId > < version >0.7.9</ version > < configuration > < excludes > < exclude >in/sivalabs/freelancerkit/entities/*</ exclude > < exclude >in/sivalabs/freelancerkit/*Application</ exclude > </ excludes > </ configuration > < executions > < execution > < id >default-prepare-agent</ id > < goals > < goal >prepare-agent</ goal > </ goals > </ execution > < execution > < id >default-prepare-agent-integration</ id > < goals > < goal >prepare-agent-integration</ goal > </ goals > </ execution > < execution > < id >default-report</ id > < phase >verify</ phase > < goals > < goal >report</ goal > </ goals > </ execution > < execution > < id >default-report-integration</ id > < goals > < goal >report-integration</ goal > </ goals > </ execution > < execution > < id >default-check</ id > < goals > < goal >check</ goal > </ goals > < configuration > < rules > <!-- implementation is needed only for Maven 2 --> < rule implementation = "org.jacoco.maven.RuleConfiguration" > < element >BUNDLE</ element > < limits > <!-- implementation is needed only for Maven 2 --> < limit implementation = "org.jacoco.report.check.Limit" > < counter >COMPLEXITY</ counter > < value >COVEREDRATIO</ value > < minimum >0.60</ minimum > </ limit > </ limits > </ rule > </ rules > </ configuration > </ execution > </ executions > </ plugin > |
Шаг 5: Запустите модульные и интеграционные тесты
Как я упоминал ранее, по умолчанию Travis запускает mvn test -B, который будет запускать только юнит-тесты .
Мы хотим запускать модульные тесты и интеграционные тесты отдельно, используя maven-failsafe-plugin. Мы будем следовать соглашению, называя модульные тесты * Test.java / * Tests.java, а интеграционные тесты — * IT.java .
Добавьте maven-failsafe-plugin, как указано ниже:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
< plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-failsafe-plugin</ artifactId > < configuration > < includes > < include >**/*IT.java</ include > </ includes > </ configuration > < executions > < execution > < id >failsafe-integration-tests</ id > < phase >integration-test</ phase > < goals > < goal >integration-test</ goal > </ goals > </ execution > </ executions > </ plugin > |
При настройке maven-failsafe-plugin для проекта SpringBoot я столкнулся с этой проблемой https://github.com/spring-projects/spring-boot/issues/6254 .
Чтобы исправить эту проблему, я добавил конфигурацию классификатора в spring-boot-maven-plugin следующим образом:
1
2
3
4
5
6
7
|
< plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > < configuration > < classifier >exec</ classifier > </ configuration > </ plugin > |
Теперь мы собираемся использовать блок скрипта, чтобы указать нашу собственную цель maven для выполнения вместо цели по умолчанию.
.travis.yml
1
2
3
4
5
|
language: java jdk: oraclejdk8 script: - . /mvnw clean install -B |
Шаг 6: Проверка качества кода SonarQube с использованием SonarCloud
SonarCloud , который построен на SonarQube , предлагает бесплатные проверки качества кода для проектов с открытым исходным кодом.
Войдите в GitHub и перейдите в раздел «Моя учетная запись -> Безопасность», сгенерируйте новый токен для своего проекта и сохраните его где-нибудь. Теперь нажмите на вкладку « Организации » и создайте организацию с уникальным ключом.
Travis-CI предоставляет возможность шифровать конфиденциальные данные ( https://docs.travis-ci.com/user/encryption-keys/ ), чтобы мы могли зашифровать любые ключи, пароль и настроить их в файле .travis.yml.
> sudo gem установить Трэвис
Из корневой папки проекта выполните следующую команду для шифрования данных:
travis encrypt SOMEVAR = ”secretvalue”
Это будет генерировать вывод как
безопасный: «…. зашифрованные данные…. »
Мы можем добавить все секреты как глобальные переменные среды следующим образом:
1
2
3
|
env : global: - secure: "....encrypted data....." |
Теперь давайте зашифруем токен SonarCloud следующим образом:
travis encrypt SONAR_TOKEN = «мой-сонар-токен-здесь»
Наконец, давайте добавим поддержку SonarCloud в качестве дополнения ( https://docs.travis-ci.com/user/sonarcloud/ ) следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
language: java jdk: oraclejdk8 env : global: - secure: "....encrypted sonar token here....." addons: sonarcloud: organization: "sivaprasadreddy-github" token: secure: $SONAR_TOKEN script: - . /mvnw clean install -B - . /mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar |
Обратите внимание, что мы использовали $ SONAR_TOKEN для ссылки на зашифрованную переменную токена и добавили еще одну команду для запуска в блоке сценария для запуска sonar: sonar goal.
Шаг 7. Создание образа Docker и публикация в DockerHub.
Сборки Travis CI могут запускать и создавать образы Docker, а также могут отправлять изображения в хранилища Docker. Для получения дополнительной информации читайте https://docs.travis-ci.com/user/docker/
Создайте Dockerfile в корневой папке проекта для нашего приложения SpringBoot следующим образом:
1
2
3
4
5
6
7
|
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD target/freelancer-kit-0.0.1-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS= "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8787,suspend=n" EXPOSE 8080 8787 ENTRYPOINT [ "sh" , "-c" , "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker -jar /app.jar" ] |
Чтобы использовать Docker, добавьте следующие настройки в .travis.yml:
1
2
3
4
|
sudo : required services: - docker |
Теперь мы можем запускать команды Docker в нашей сборке.
Как только сборка будет успешной, мы можем захотеть создать образ Docker и отправить его в Docker Hub. Мы можем использовать секцию after_success для выполнения этого действия.
Нам нужно войти в DockerHub перед отправкой образа, мы собираемся настроить учетные данные DockerHub, зашифровав их.
travis encrypt DOCKER_USER = «dockerhub-username»
зашифровать travis DOCKER_PASS = «dockerhub-пароль»
Добавьте эти 2 секрета в раздел env.global .travis.yml.
Теперь мы можем добавить наши команды docker для создания образа и публикации в dockerhub в разделе after_success следующим образом:
1
2
3
4
5
6
7
|
after_success: - docker login -u $DOCKER_USER -p $DOCKER_PASS - export TAG=` if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest" ; else echo $TRAVIS_BRANCH; fi ` - export IMAGE_NAME=sivaprasadreddy /freelancerkit - docker build -t $IMAGE_NAME:$COMMIT . - docker tag $IMAGE_NAME:$COMMIT $IMAGE_NAME:$TAG - docker push $IMAGE_NAME |
Шаг 8: развернуть в Heroku
Travis CI предоставляет возможности для развертывания на широком спектре платформ, включая Heroku, OpenShift, AWS, Azure и т. Д. Travis CI может автоматически развертывать ваше приложение Heroku после успешной сборки.
Мы собираемся развернуть наше приложение SpringBoot на Heroku, используя Travis https://docs.travis-ci.com/user/deployment/heroku/ . Перед развертыванием нашего приложения в Heroku сначала необходимо войти на https://www.heroku.com/ и создать приложение из Dashboard.
Теперь создайте Procfile в корневой папке проекта следующим образом:
1
|
web java -Dserver.port=$PORT -Dspring.profiles.active=heroku $JAVA_OPTS -jar target /freelancer-kit-0 .0.1-SNAPSHOT- exec .jar |
Сначала нам нужно получить ключ API Heroku и добавить его в качестве зашифрованного секрета.
зашифровать travis HEROKU_API_KEY = «ваш-героку-api-ключ-здесь»
Мы можем выполнить развертывание в Heroku из Travis, добавив раздел развертывания следующим образом:
1
2
3
4
|
deploy: provider: heroku api_key: $HEROKU_API_KEY app: freelancerkit |
Теперь полный файл .travis.yml будет выглядеть следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
sudo : required language: java jdk: oraclejdk8 services: - docker env : global: - secure: "encrypted-sonar-token" - secure: "encrypted-dockerhub-username" - secure: "encrypted-dockerhub-password" - secure: "encrypted-heroku-api-key" - COMMIT=${TRAVIS_COMMIT::7} addons: sonarcloud: organization: "sivaprasadreddy-github" token: secure: $SONAR_TOKEN script: - . /mvnw clean install -B - . /mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar after_success: - docker login -u $DOCKER_USER -p $DOCKER_PASS - export TAG=` if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest" ; else echo $TRAVIS_BRANCH&amp;amp;amp;amp;amp;lt;span data-mce- type = "bookmark" style= "display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class= "mce_SELRES_start" &amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt; /span &amp;amp;amp;amp;amp;gt;; fi ` - export IMAGE_NAME=sivaprasadreddy /freelancer-kit - docker build -t $IMAGE_NAME:$COMMIT . - docker tag $IMAGE_NAME:$COMMIT $IMAGE_NAME:$TAG - docker push $IMAGE_NAME deploy: provider: heroku api_key: $HEROKU_API_KEY app: freelancer-kit |
Как только сборка будет успешной и развернута на Heroku, вы сможете получить доступ к приложению по адресу https: // <app> .herokuapp.com /.
Я только что рассмотрел наиболее часто выполняемые задачи только в приложениях Java, но Travis-CI может выполнять намного больше. Ознакомьтесь с документацией TravisCI по адресу https://docs.travis-ci.com/ .
Опубликовано на Java Code Geeks с разрешения Сивы Редди, партнера нашей программы JCG . См. Оригинальную статью здесь: CI / CD для приложений SpringBoot, использующих Travis-CI
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |