Рубрики
Без рубрики

Добавьте CI/CD в приложение Spring Boot с помощью Jenkins X и Kubernetes

В этом посте показано, как реализовать непрерывную интеграцию и развертывание (CI/CD) с помощью Jenkins X и Kubernetes в облаке Google. С тегами jenkins, kubernetes, java, весенняя загрузка.

За последние пять лет разработки программного обеспечения многое произошло. То, что значит создавать, развертывать и управлять программным обеспечением, кардинально изменилось. Произошел переход от локального размещения программного обеспечения к общедоступному облаку и переход от виртуальных машин (виртуальных машин) к контейнерам. Контейнеры дешевле запускать, чем виртуальные машины, потому что они требуют меньше ресурсов и выполняются как отдельные процессы. Переход на контейнеры снизил затраты, но создал проблему масштабирования контейнеров.

Kubernetes был впервые открыт с открытым исходным кодом 6 июня 2014 года. Google использовал контейнеры в течение многих лет и использовал инструмент под названием Borg для управления контейнерами в масштабе. Kubernetes – это версия Borg с открытым исходным кодом, которая стала стандартом де-факто за последние четыре года.

Этому пути к тому, чтобы стать стандартом, в значительной степени способствовали все крупные игроки, запрыгнувшие на борт. Red Hat, IBM, Amazon, Microsoft, Oracle и Pivotal – каждый крупный поставщик общедоступных облачных услуг поддерживает Kubernetes.

Это отлично подходит для разработчиков, поскольку обеспечивает единый способ упаковки приложений (в контейнере Docker) и их развертывания в любом кластере Kubernetes.

Высокопроизводительная разработка с использованием CI/CD, Kubernetes и Jenkins X

Высокопроизводительные команды почти всегда являются необходимым условием успеха в области технологий, а непрерывная интеграция, непрерывное развертывание (CI/CD), небольшие итерации и быстрая обратная связь являются строительными блоками. CI/CD может быть сложно настроить для вашего облачного родного приложения. Автоматизируя все, разработчики могут тратить свое драгоценное время на создание реальной ценности для бизнеса.

Как вы становитесь высокопроизводительной командой, используя контейнеры, непрерывную доставку и Kubernetes? Вот тут-то и появляется Дженкинс Х .

“Идея Jenkins X состоит в том, чтобы предоставить всем разработчикам своего собственного дворецкого—мореплавателя Невила, который поможет вам плавать по морям непрерывной доставки”. – Джеймс Стрейкен

Jenkins X поможет вам автоматизировать ваш CI/CD в Kubernetes – и вам даже не придется изучать Docker или Kubernetes!

Что Делает Дженкинс Икс?

Jenkins X автоматизирует установку, настройку и обновление Jenkins и других приложений (Helm, Scaffold, Nexus и др.) в Kubernetes. Он автоматизирует CI/CD ваших приложений с помощью изображений Docker, диаграмм управления и конвейеров. Он использует GitOps для управления продвижением между средами и предоставляет множество отзывов, комментируя запросы на вытягивание по мере их поступления на стадию и производство.

Начните работу с Jenkins X

Чтобы установить Jenkins X, вам сначала необходимо установить двоичный файл jx на вашем компьютере или у облачного провайдера. Вы можете получить 300 долларов в кредитах для Google Cloud, поэтому я решил начать с этого.

Установите Jenkins X в Google Cloud и создайте кластер

Перейдите к cloud.google.com и войдите в систему. Если у вас нет учетной записи, подпишитесь на бесплатную пробную версию. Перейдите в консоль (в правом верхнем углу есть ссылка) и активируйте Google Cloud shell. Скопируйте и вставьте следующие команды в оболочку.

curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.79/jx-linux-amd64.tar.gz | tar xzv
sudo mv jx /usr/local/bin

ПРИМЕЧАНИЕ: Облачная оболочка Google завершает любые изменения, внесенные за пределами вашего домашнего каталога, через час , поэтому вам, возможно, придется повторить команды. Хорошая новость в том, что они будут в вашей истории, поэтому вам нужно только нажать стрелку вверх и войти. Вы также можете исключить команду sudo mv выше и добавить следующее в свой .башрк вместо этого.

export PATH=$PATH:.

Создайте кластер на GCE (движок Google Kubernetes), используя следующую команду. Возможно, вам придется включить GKE для вашей учетной записи.

jx create cluster gke --skip-login

Подтвердите, что вы хотите установить шлем если вам будет предложено загрузить его. Вам будет предложено выбрать облачную зону Google. Я бы посоветовал выбрать один из них поближе к вашему местоположению. Я выбрал сша-запад 1-а так как я живу недалеко от Денвера, штат Колорадо. Для типа машины Google Cloud я выбрал n1-стандартный-2 , и использовал значения по умолчанию для минимального (3) и максимального (5) числа узлов.

Для имени GitHub введите свое собственное (например, mraible ) и адрес электронной почты, который вы зарегистрировали на GitHub (например, matt.raible@okta.com ). Я пытался использовать разработчик okta (организация GitHub), и я не смог заставить ее работать.

ПРИМЕЧАНИЕ: Интеграция с GitHub завершится неудачей, если в вашей учетной записи включена двухфакторная аутентификация. Вам нужно будет отключить его на GitHub, если вы хотите, чтобы процесс завершился успешно.:-/

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

Вам будет предложено создать маркер API GitHub. Нажмите на предоставленный URL-адрес и назовите его “Дженкинс Икс”. Скопируйте и вставьте значение токена обратно в консоль.

Возьмите кофе, напиток для взрослых или сделайте несколько отжиманий, пока ваша установка заканчивается. Это может занять несколько минут.

Следующим шагом будет копирование маркера API из Jenkins на вашу консоль. Следуйте инструкциям, приведенным в вашей консоли.

Когда вы закончите с этим, запустите консоль jx и нажмите на ссылку, чтобы войти в свой экземпляр Jenkins. Нажмите Администрирование и обновите Jenkins, а также все его плагины (Менеджер плагинов > прокрутите вниз и выберите все). Если вам не удастся выполнить этот шаг, вы не сможете перейти от запроса на вытягивание с GitHub к процессу Jenkins XCI для него.

Создайте приложение для весенней загрузки

Когда я впервые начал использовать Jenkins X, я попытался импортировать существующий проект. Несмотря на то, что мое приложение использовало Spring Boot, в нем не было pom.xml в корневом каталоге, поэтому Дженкинс X подумал, что это Node.js приложение. По этой причине я предлагаю сначала создать пустое приложение для загрузки Spring, чтобы подтвердить правильность настройки Jenkins X.

Создайте приложение Spring Boot с голыми костями из облачной оболочки:

jx create spring -d web -d actuator

Эта команда использует Spring Initializr , поэтому вам будет предложено несколько вариантов. Ниже приведены ответы, которые я использовал:

Ява Язык
Ява Группа
okta-весна-jx-пример Артефакт

совет: Выбор короткого имени для имени вашего артефакта избавит вас от боли. У Дженкинса X есть ограничение в 53 символа для названий выпусков, и разработчик okta/пример okta-spring-boot-дженкинс приведет к превышению его на два символа.

Выберите все значения по умолчанию для имени пользователя git, инициализации git и сообщения о фиксации. Вы можете выбрать организацию для использования, если вы не хотите использовать свой личный кабинет. Выполните следующую команду, чтобы просмотреть конвейер CI/CD вашего приложения.

jx get activity -f okta-spring-jx-example -w

Запустите консоль jx , щелкните полученную ссылку и перейдите к своему проекту, если вы хотите получить более наглядное представление.

Этот процесс выполнит несколько задач:

  1. Создайте релиз для вашего проекта.
  2. Создайте запрос на извлечение для вашего проекта промежуточной среды.
  3. Автоматически разверните его в промежуточной среде, чтобы вы могли увидеть его в действии.
Merge status checks all passed so the promotion worked!
Application is available at: http://okta-spring-jx-example.jx-staging.35.230.106.169.nip.io

записка: Поскольку Spring Boot по умолчанию не предоставляет страницу приветствия, вы получите 404, когда откроете URL-адрес выше.

Разверните приложение Spring Boot в рабочей среде с помощью Jenkins X

По умолчанию Jenkins X будет автоматически развертываться только на промежуточной стадии. Вы можете вручную продвигать от стадии к производству используя:

jx promote okta-spring-jx-example --version 0.0.1 --env production

Вы можете изменить свою производственную среду, чтобы использовать автоматическое развертывание, используя среду редактирования jx .

Теперь, когда вы знаете, как использовать Jenkins X с приложением Spring Boot с голыми костями, давайте посмотрим, как заставить его работать на более реальном примере.

Защитите свое приложение Spring Boot и добавьте угловой PWA

За последние несколько месяцев я написал серию постов в блоге о создании PWA (прогрессивного веб-приложения) с ионной/угловой и пружинной загрузкой.

  1. Защитите Свой PWA для отслеживания криптовалютных активов с помощью Okta
  2. Используйте Okta (вместо локального хранилища) для безопасного хранения данных Вашего пользователя
  3. Руководство автостопщика по тестированию API-интерфейсов Spring Boot и угловых компонентов с помощью WireMock, Jest, транспортира и Travis CI
  4. Разверните безопасную загрузку Spring Boot + Angular PWA как единый артефакт

Это последний пост в блоге в серии. Я считаю, что это отличный пример реального приложения, потому что в нем есть множество модульных и интеграционных тестов, включая сквозные тесты с транспортиром. Давайте посмотрим, как автоматизировать его путь к производству с помощью Jenkins X и Kubernetes!

Клонируйте проект Spring Boot, который вы только что создали с GitHub (не забудьте изменить {ваше имя пользователя} в URL-адресе):

git clone https://github.com/{yourUsername}/okta-spring-jx-example.git okta-jenkinsx

В соседнем каталоге, клонируйте созданный проект с Spring Boot + Angular как единый артефакт:

git clone https://github.com/oktadeveloper/okta-spring-boot-angular-auth-code-flow-example.git spring-boot-angular

В терминале перейдите к okta-jenkins и удалите файлы, которые больше не нужны:

cd okta-jenkinsx
rm -rf .mvn src mvnw* pom.xml

Результатом должна быть структура каталогов со следующими файлами:

$ tree .
.
├── charts
│ ├── okta-spring-jx-example
│ │ ├── Chart.yaml
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── templates
│ │ │ ├── deployment.yaml
│ │ │ ├── _helpers.tpl
│ │ │ ├── NOTES.txt
│ │ │ └── service.yaml
│ │ └── values.yaml
│ └── preview
│ ├── Chart.yaml
│ ├── Makefile
│ ├── requirements.yaml
│ └── values.yaml
├── Dockerfile
├── Jenkinsfile
└── skaffold.yaml

4 directories, 15 files

Скопируйте все файлы из spring-boot-angular в okta-дженкинс .

cp -r ../spring-boot-angular/* .

При использовании Travis CI для тестирования этого приложения я запустил npm install как часть процесса. С Jenkins X все проще с одним контейнером (например, maven или узел js ), поэтому добавьте выполнение во внешний интерфейс-maven-плагин (в holdings-api/pom.xml ) для запуска установки npm (подсказка: вам нужно добавить выполнение с к существующему pom.xml).

Сейчас самое время открыть каталог okta-jenkinsx как проект в среде IDE, такой как IntelliJ IDEA, Eclipse, Netbeans или VS Code!:)


   com.github.eirslett
   frontend-maven-plugin
   ${frontend-maven-plugin.version}
   
       ../crypto-pwa
   
   
       
           install node and npm
           
               install-node-and-npm
           
           
               ${node.version}
           
       
       
           npm install
           
               npm
           
           generate-resources
           
               install --unsafe-perm
           
       
       ...
   


записка: Флаг --unsafe-perm необходим, потому что Дженкинс X запускает сборку от имени пользователя root . Я понял этот обходной путь из инструкций по устранению неполадок node-sass .

Добавьте привод и отключите HTTPS

Дженкинс X полагается на привод пружинной загрузки для проверки работоспособности. Это означает, что если вы не включите его в свой проект (или у вас /привод/работоспособность защищен), Jenkins X сообщит, что ваше приложение не запустилось.

Добавьте пускатель привода в качестве зависимости в holdings-api/pom.xml :


   org.springframework.boot
   spring-boot-starter-actuator


Вам также потребуется разрешить доступ к его конечной точке проверки работоспособности. Jenkins X развернет ваше приложение за сервером Nginx, поэтому вы также захотите отключить принудительное использование HTTPS, иначе вы не сможете получить доступ к своему приложению. Изменить холдинги-api/src/main/java/.../SecurityConfiguration.java разрешить /привод/работоспособность а для удаления требуется Secure() .

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

   @Override
   public void configure(WebSecurity web) throws Exception {
       web.ignoring().antMatchers("/**/*.{js,html,css}");
   }

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
               .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
           .and()
               .authorizeRequests()
               .antMatchers("/", "/home", "/api/user", "/actuator/health").permitAll()
               .anyRequest().authenticated();
   }
}

Настройте пути в файле Dockerfile и файле Дженкинса

Поскольку этот проект создается в подкаталоге, а не в корневом каталоге, обновите ./Dockerfile , чтобы просмотреть файлы в holdings-api .

FROM openjdk:8-jdk-slim
ENV PORT 8080
ENV CLASSPATH /opt/lib
EXPOSE 8080

# copy pom.xml and wildcards to avoid this command failing if there's no target/lib directory
COPY holdings-api/pom.xml holdings-api/target/lib* /opt/lib/

# NOTE we assume there's only 1 jar in the target dir
# but at least this means we don't have to guess the name
# we could do with a better way to know the name - or to always create an app.jar or something
COPY holdings-api/target/*.jar /opt/app.jar
WORKDIR /opt
CMD ["java", "-jar", "app.jar"]

Вам также потребуется обновить файл Дженкинса таким образом, он выполняет любые mvn команды в holdings-api каталог. Добавьте также профиль -Prod . Например:

// in the 'CI Build and push snapshot' stage
steps {
 container('maven') {
   dir ('./holdings-api') {
     sh "mvn versions:set -DnewVersion=$PREVIEW_VERSION"
     sh "mvn install -Pprod"
   }
 }
 ...
}
// in the 'Build Release' stage
dir ('./holdings-api') {
  sh "mvn versions:set -DnewVersion=\$(cat ../VERSION)"
}
...
dir ('./holdings-api') {
  sh "mvn clean deploy -Pprod"
}

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

Почему Окта?

Короче говоря, мы делаем управление идентификацией намного проще, безопаснее и масштабируемее, чем то, к чему вы, вероятно, привыкли. Okta – это облачный сервис, который позволяет разработчикам создавать, редактировать и безопасно хранить учетные записи пользователей и данные учетных записей пользователей, а также подключать их к одному или нескольким приложениям. Наш API позволяет вам:

Вы проданы? Зарегистрируйтесь для навсегда бесплатной учетной записи разработчика , и когда вы закончите, вернитесь, чтобы мы могли узнать больше о CI/CD с Spring Boot и Jenkins X!

Создайте веб-приложение в Okta для своего приложения Spring Boot

После завершения процесса настройки войдите в свою учетную запись и перейдите в раздел Приложения > Добавить приложение . Нажмите Веб и Далее . На следующей странице введите следующие значения и нажмите Сделано (вам нужно будет нажать Готово, затем Изменить, чтобы изменить URI перенаправления выхода из системы).

  • Имя приложения: Дженкинс X
  • Базовые URL-адреса: http://localhost:8080
  • URI перенаправления входа в систему: http://localhost:8080/login
  • URI перенаправления выхода из системы: http://localhost:8080

Откройте holdings-api/src/main/ресурсы/application.yml и вставьте в него значения из вашей организации/приложения.

okta:
 client:
   orgUrl: https://{yourOktaDomain}
   token: XXX
security:
   oauth2:
     client:
       access-token-uri: https://{yourOktaDomain}/oauth2/default/v1/token
       user-authorization-uri: https://{yourOktaDomain}/oauth2/default/v1/authorize
       client-id: {yourClientId}
       client-secret: {yourClientSecret}
     resource:
       user-info-uri: https://{yourOktaDomain}/oauth2/default/v1/userinfo

Вы заметите, что значение токена равно XXX . Это потому, что я предпочитаю читать его из переменной среды, а не проверять в системе управления версиями. Вы, вероятно, захотите сделать это и для вашего клиентского секрета, но я делаю только одно свойство для краткости. Чтобы создать маркер API:

  1. Перейдите к API > Токены и нажмите Создать токен
  2. Дайте вашему токену имя (например, “Дженкинс X”), затем установите его значение в качестве переменной среды OKTA_CLIENT_TOKEN .

Вам нужно будет добавить атрибут holdings в профили пользователей вашей организации, чтобы хранить ваши запасы криптовалюты в Okta. Перейдите к Пользователи > Редактор профилей . Нажмите Профиль для первого профиля в таблице. Вы можете идентифицировать его по логотипу Okta. Нажмите Добавить атрибут и используйте следующие значения:

  • Отображаемое имя: Холдинги
  • Имя переменной: запасы
  • Описание: Криптовалютные Холдинги

После выполнения этих действий вы сможете перейти к http://localhost:8080 и войдите в систему после выполнения следующих команд:

cd holdings-api
./mvnw -Pprod package
java -jar target/*.jar

Хранение секретов в Jenkins X

Локальное хранение переменных среды довольно просто. Но как вы это делаете в Jenkins X? Смотрите не дальше, чем его функция учетных данных . Вот как его использовать:

  1. Запустите консоль jx в облачной оболочке Google, чтобы получить URL-адрес Jenkins X
  2. Нажмите на ссылку, войдите в систему и нажмите Администрирование вверху
  3. Нажмите на Учетные данные > (глобальный) > Добавить учетные данные (слева)
  4. Выберите Секретный текст из раскрывающегося списка и введите OKTA_CLIENT_TOKEN для идентификатора
  5. Скопируйте/вставьте свой токен API Okta в поле Секрет

Пока вы там, добавьте еще несколько секретов: OKTA_APP_ID , ИМЯ ПОЛЬЗОВАТЕЛЯ E2E_ и ПАРОЛЬ E2E_PASSWORD . Первый – это идентификатор Дженкинса X Созданное вами приложение OIDC. Вы можете получить его значение, перейдя в свое приложение на Okta и скопировав значение с URL-адреса. E2E-* секреты должны быть учетными данными, которые вы хотите использовать для выполнения сквозных (транспортировочных) тестов. Возможно, вы захотите создать для этого нового пользователя.

Вы можете получить доступ к этим значениям в своем файле Jenkins , добавив их в среду раздел вверху.

environment {
  ORG = 'mraible'
  APP_NAME = 'okta-spring-jx-example'
  CHARTMUSEUM_CREDS = credentials('jenkins-x-chartmuseum')
  OKTA_CLIENT_TOKEN = credentials('OKTA_CLIENT_TOKEN')
  OKTA_APP_ID = credentials('OKTA_APP_ID')
  E2E_USERNAME = credentials('E2E_USERNAME')
  E2E_PASSWORD = credentials('E2E_PASSWORD')
}

Передача переменных среды в контейнеры Docker

Чтобы перенести переменную среды OKTA_CLIENT_TOKEN в контейнер Docker, найдите:

sh "make preview"

И измените его на:

sh "make OKTA_CLIENT_TOKEN=\$OKTA_CLIENT_TOKEN preview"

На этом этапе вы можете создать ветку, зафиксировать свои изменения и убедиться, что все работает в Jenkins X.

cd ..
git checkout -b add-secure-app
git add .
git commit -m "Add Bootiful PWA"
git push origin add-secure-app

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

Если тесты пройдут для вашего запроса на извлечение, вы должны увидеть немного зелени и комментарий от Jenkins X о том, что ваше приложение доступно в среде предварительного просмотра.

Если вы нажмете на ссылку здесь и попытаетесь войти в систему, вы, скорее всего, получите сообщение от Okta о том, что URI перенаправления не был внесен в белый список.

Автоматизировать добавление URI перенаправления в Okta

Когда вы создаете приложения в Okta и запускаете их локально, легко узнать, какими будут URI перенаправления для вашего приложения. Для этого конкретного приложения они будут http://localhost:8080/login для входа в систему и http://localhost:8080 для выхода из системы. Когда вы переходите к производству, URL-адреса, как правило, также хорошо известны. Однако в случае с Jenkins X URL-адреса являются динамическими и создаются “на лету” на основе вашего номера запроса на извлечение.

Чтобы это работало с Okta, вы можете создать класс Java, который взаимодействует с API Okta и динамически добавляет URI. Создать холдинги-api/src/тест/java/.../cli/AppRedirectUriManager.java и заполните его следующим кодом.

package com.okta.developer.cli;

import com.okta.sdk.client.Client;
import com.okta.sdk.lang.Collections;
import com.okta.sdk.resource.application.OpenIdConnectApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

@SpringBootApplication
public class AppRedirectUriManager implements ApplicationRunner {
   private static final Logger log = LoggerFactory.getLogger(AppRedirectUriManager.class);

   private final Client client;

   @Value("${appId}")
   private String appId;

   @Value("${redirectUri}")
   private String redirectUri;

   @Value("${operation:add}")
   private String operation;

   public AppRedirectUriManager(Client client) {
       this.client = client;
   }

   public static void main(String[] args) {
       SpringApplication.run(AppRedirectUriManager.class, args);
   }

   @Override
   public void run(ApplicationArguments args) {
       log.info("Adjusting Okta settings: {appId: {}, redirectUri: {}, operation: {}}", appId, redirectUri, operation);
       OpenIdConnectApplication app = (OpenIdConnectApplication) client.getApplication(appId);

       String loginRedirectUri = redirectUri + "/login";

       // update redirect URIs
       List redirectUris = app.getSettings().getOAuthClient().getRedirectUris();
       // use a set so values are unique
       Set updatedRedirectUris = new LinkedHashSet<>(redirectUris);
       if (operation.equalsIgnoreCase("add")) {
           updatedRedirectUris.add(loginRedirectUri);
       } else if (operation.equalsIgnoreCase("remove")) {
           updatedRedirectUris.remove(loginRedirectUri);
       }

       // todo: update logout redirect URIs with redirectUri (not currently available in Java SDK)
       // https://github.com/okta/openapi/issues/132
       app.getSettings().getOAuthClient().setRedirectUris(Collections.toList(updatedRedirectUris));
       app.update();
       System.exit(0);
   }
}

Этот класс использует поддержку командной строки (интерфейс командной строки) Spring Boot, что позволяет вызывать его с помощью плагина Exec Maven . Чтобы добавить поддержку для запуска его из Maven, внесите следующие изменения в holdings-api/pom.xml .


    ...
   1.6.0
   default
   override-me





   spring-boot:run
   holdings-app-${project.version}
   
       
       
           org.codehaus.mojo
           exec-maven-plugin
           ${exec-maven-plugin.version}
           
               
                   add-redirect
                   
                       java
                   
               
           
           
               com.okta.developer.cli.AppRedirectUriManager
               test
               
                   appId ${appId} redirectUri ${redirectUri}
               
           
       
   


Затем обновите файл Дженкинса , чтобы добавить блок, который запускает mvn exec:java после создания образа.

dir ('./charts/preview') {
  container('maven') {
    sh "make preview"
    sh "make OKTA_CLIENT_TOKEN=\$OKTA_CLIENT_TOKEN preview"
    sh "jx preview --app $APP_NAME --dir ../.."
  }
}

// Add redirect URI in Okta
dir ('./holdings-api') {
  container('maven') {
    sh '''
      yum install -y jq
      previewURL=$(jx get preview -o json|jq -r ".items[].spec | select (.previewGitInfo.name==\\"$CHANGE_ID\\") | .previewGitInfo.applicationURL")
      mvn exec:java@add-redirect -DappId=$OKTA_APP_ID -DredirectUri=$previewURL
    '''
  }
}

Зафиксируйте и внесите изменения, и ваше приложение должно быть обновлено с помощью URI перенаправления для http://{yourpreviewurl}/вход в систему . Вам нужно будет вручную добавить URL-адрес перенаправления выхода для http://{yourpreviewurl} , так как в настоящее время он не поддерживается Java SDK Okta .

Чтобы продвинуть ваш проходящий запрос на извлечение в промежуточную среду, объедините его, и главная ветвь будет переведена в промежуточную среду. К сожалению, вы не сможете войти в систему. Это связано с тем, что ни один процесс не регистрирует URI перенаправления промежуточного сайта в вашем приложении Okta. Если вы добавите URL-адреса вручную, все должно работать.

Запуск тестов транспортира в Jenkins X

Понять, как проводить сквозные тесты в Jenkins X, было для меня сложнее всего. Я начал с добавления нового профиля Maven, который позволил бы мне выполнять тесты с помощью Maven, а не npm.

записка: Чтобы этот профиль работал, вам нужно будет добавить http://localhost:8000/login в качестве URL-адреса перенаправления входа в ваше приложение и http://localhost:8000


   e2e
   
       
       
       8000
   
   
       
           
               org.springframework.boot
               spring-boot-maven-plugin
               
                   
                       pre-integration-test
                       
                           start
                       
                       
                           
                               --server.port=${http.port}
                           
                       
                   
                   
                       post-integration-test
                       
                           stop
                       
                   
               
           
           
               com.github.eirslett
               frontend-maven-plugin
               ${frontend-maven-plugin.version}
               
                   ../crypto-pwa
               
               
                   
                       webdriver update
                       
                           npm
                       
                       pre-integration-test
                       
                           run e2e-update
                       
                   
                   
                       ionic e2e
                       
                           npm
                       
                       integration-test
                       
                           
                               ${http.port}
                               true
                           
                           run e2e-test
                       
                   
               
           
       
   


СОВЕТ: Вы можете заметить, что мне пришлось указать два разных выполнения для e2e-обновления и e2e-теста . Я обнаружил, что запуск npm e2e не работает с плагином frontend-maven, потому что он просто вызывает другие команды npm run . Похоже, вам нужно напрямую вызывать двоичный файл при использовании плагина frontend-maven.

Вместо использования переменной среды TRAVIS вы заметите, что я использую здесь переменную CI . Это изменение требует обновления crypto-pwa/test/protractor.conf.js чтобы соответствовать.

baseUrl: (process.env.CI) ? 'http://localhost:' + process.env.PORT : 'http://localhost:8100',

Внесите эти изменения, и вы сможете запустить ./mvn verify -P prod,e2e для локального выполнения сквозных тестов. Обратите внимание, что вам нужно будет иметь E2_ИМЯ_ПОЛЬЗОВАТЕЛЯ и ПАРОЛЬ E2E_PASSWORD определяется как переменные среды.

Когда я впервые попробовал это в Jenkins X, я обнаружил, что у агента jenkins-maven не был установлен Chrome. Мне было сложно установить, и я обнаружил, что jenkins-nodejs имеет предустановленные Chrome и Xvfb . Когда я впервые попробовал это, я столкнулся со следующей ошибкой:

[21:51:08] E/launcher - unknown error: DevToolsActivePort file doesn't exist

Эта ошибка вызвана Проблема Chrome в Linux . Я понял, что обходной путь состоит в том, чтобы указать --отключить-dev-shm-использование в Параметрах chrome для транспортира. Я также добавил несколько дополнительных флагов, которые, по-видимому, рекомендуются. Мне особенно нравится -- безголовый при локальном запуске, чтобы браузер не выскакивал и не мешал мне. Если я хочу видеть процесс в режиме реального времени, я могу быстро удалить эту опцию.

Если вы хотите, чтобы тесты транспортира вашего проекта выполнялись на Jenkins X, вам нужно будет изменить crypto-pwa/test/protractor.conf.js чтобы указать следующие Параметры хрома :

capabilities: {
  'browserName': 'chrome',
  'chromeOptions': {
    'args': ['--headless', ''--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage']
  }
},

Затем добавьте новый этап Запуск тестов e2e в файл Дженкинса , который находится между этапами “Сборка CI” и “Выпуск сборки”. Если это поможет, вы можете увидеть окончательный Дженкинсвилл.

stage('Run e2e tests') {
 agent {
   label "jenkins-nodejs"
 }
 steps {
   container('nodejs') {
     sh '''
       yum install -y jq
       previewURL=$(jx get preview -o json|jq -r ".items[].spec | select (.previewGitInfo.name==\\"$CHANGE_ID\\") | .previewGitInfo.applicationURL")
       cd crypto-pwa && npm install --unsafe-perm && npm run e2e-update
       Xvfb :99 &
       sleep 60s
       DISPLAY=:99 npm run e2e-test -- --baseUrl=$previewURL
     '''
   }
 }
}

После внесения всех этих изменений создайте новую ветвь, внесите изменения и создайте запрос на извлечение на GitHub.

git checkout -b enable-e2e-tests
git add .
git commit -m "Add stage for end-to-end tests"
git push origin enable-e2e-tests

Мне действительно пришлось внести несколько дополнительных изменений, чтобы пройти все тесты транспортира:

  1. В crypto-pwa/e2e/spec/login.e2e-spec.ts я не смог получить должен показывать кнопку входа для прохождения теста, поэтому я проигнорировал его, изменив его(...) |/к выходу(...) .
  2. В этом же файле я изменил тайм-ауты 2000 мс на 5000 мс и тайм-ауты 5000 мс на 30000 мс.
  3. В crypto-pwa/test/protractor.conf.js , я изменился интервал тайм-аута по умолчанию для 600000 .

Тесты, скорее всего, завершатся неудачей при первом запуске, поскольку URI перенаправления выхода из системы не настроен для новой среды предварительного просмотра. Обновите URL-адреса перенаправления выхода из приложения Okta, чтобы они соответствовали URI среды предварительного просмотра вашего PR, повторите тесты запроса на вытягивание, и все должно пройти!

Вы можете найти исходный код для завершенного приложения в этом примере на GitHub .

Узнайте Больше О Дженкинсе X, Кубернетесе и Пружинный ботинок

Чтобы узнать больше о Spring Boot, Jenkins X и Kubernetes, ознакомьтесь со следующими ресурсами:

Если вы используете свои производственные приложения на Kubernetes, я бы рекомендовал изучить Jenkins X. Это позволяет выполнять CI/CD в одной и той же среде, быстро выполнять итерации и быстрее предоставлять бизнес—ценность вашим клиентам.

Дженкинс X также включает в себя модули разработки функцию, которая может автоматически развертываться при сохранении при разработке на вашем ноутбуке. Я не уверен, что DevPods будут хорошо работать для приложений JavaScript, которым необходим этап переноса для производства. Я бы предпочел, чтобы webpack и синхронизация браузера обновляли мой локальный браузер за считанные секунды, а не ждали минут, пока образ Docker будет создан и развернут в Kubernetes.

Чтобы получить отличный обзор и демонстрацию Jenkins X, посмотрите James Strachan’s |/Jenkins X: Непрерывная доставка для Kubernetes с июня 2018 года Виртуальный КУВШИН встреча.

Если у вас есть какие-либо вопросы, пожалуйста, добавьте комментарий ниже, нажмите меня в Твиттере или отправьте вопрос на наши Форумы разработчиков . Чтобы получать уведомления о будущих публикациях в блоге и мудрости разработчиков, вы можете следить за всей моей командой в Twitter .

Оригинал: “https://dev.to/oktadev/add-cicd-to-your-spring-boot-app-with-jenkins-x-and-kubernetes-1jld”