В этой статье мы узнаем, как мы можем использовать 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: javajdk: 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: javajdk: 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: javajdk: 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:slimVOLUME /tmpADD target/freelancer-kit-0.0.1-SNAPSHOT.jar app.jarRUN sh -c 'touch /app.jar'ENV JAVA_OPTS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8787,suspend=n"EXPOSE 8080 8787ENTRYPOINT [ "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: requiredlanguage: javajdk: 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, являются их собственными. |