Статьи

CI / CD для приложений SpringBoot, использующих Travis-CI

В этой статье мы узнаем, как мы можем использовать 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;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;amp;gt;&amp;amp;amp;amp;amp;amp;lt;/span&amp;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, являются их собственными.