JavaRush /Курси /Модуль 5. Spring /Лекція 160: Налаштування CI/CD пайплайну для автоматичної...

Лекція 160: Налаштування CI/CD пайплайну для автоматичної збірки й деплою

Модуль 5. Spring
Рівень 25 , Лекція 9
Відкрита

Нагадую про інструменти для побудови CI/CD пайплайнів:

  • Jenkins: дідусь CI/CD-інструментів, потужний і гнучкий у налаштуванні.
  • GitHub Actions: вбудовано в GitHub, зручно й швидко.
  • GitLab CI/CD: відмінний інструмент для пайплайнів, якщо ти використовуєш GitLab.
  • CircleCI: хмарне рішення, просте в налаштуванні.
  • Bitbucket Pipelines: інструмент для CI/CD в екосистемі Atlassian.

Для цієї лекції будемо використовувати GitLab CI/CD — він простий, наочний і класно інтегрується з Docker.


Підготовка до роботи

Крок 1: Створи репозиторій у GitLab

Для початку переконайся, що в тебе вже є репозиторій із твоїм Spring Boot застосунком. Якщо ні — створи новий репозиторій і завантаж туди весь проект.

Крок 2: Налаштування файлу .gitlab-ci.yml

GitLab CI/CD використовує файл .gitlab-ci.yml, щоб визначити, як запускати пайплайн. Цей файл має лежати в корені репозиторію.


Створення CI/CD пайплайну

Крок 1: Мінімальна конфігурація .gitlab-ci.yml

Почнемо з простого прикладу, який запускає Java-тести і збирає Spring Boot застосунок:


stages: # Визначаємо стадії пайплайну
  - test
  - build

test-job: # Задача для стадії тестування
  stage: test
  image: maven:3.8.6-jdk-11 # Використовуємо образ з Maven і JDK
  script:
    - mvn test # Запуск тестів

build-job: # Задача для стадії збірки
  stage: build
  image: maven:3.8.6-jdk-11
  script:
    - mvn package -DskipTests # Збірка jar-файлу
  artifacts:
    paths:
      - target/*.jar # Зберігаємо jar-файл як артефакт
  • stages: визначають послідовність виконання пайплайну. Спершу test, потім build.
  • image: вказує Docker-образ, який буде використовуватися для виконання задачі. В нашому випадку це Maven + JDK.
  • script: команди, які виконуються в межах задачі.

Крок 2: Додаємо Docker у пайплайн

Тепер додамо стадію, яка збирає Docker-образ і пушить його в Docker Hub.


stages:
  - test
  - build
  - dockerize

dockerize-job:
  stage: dockerize
  image: docker:latest # Використовуємо Docker-образ
  services:
    - docker:dind # Docker-in-Docker для керування контейнерами
  before_script: # Авторизація в Docker Hub
    - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  script:
    - docker build -t $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA . # Збірка образу
    - docker push $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA # Публікація образу

Зверни увагу:

  • services включає docker:dind, щоб GitLab Runner міг запускати Docker-команди.
  • before_script використовується для виконання попередніх дій, таких як логін в Docker Hub.
  • $CI_COMMIT_SHORT_SHA — змінна, що містить перші 8 символів хешу коміту. Це дає змогу унікально ідентифікувати образ.

Крок 3: Додаємо деплой в хмару

Припустимо, ми деплоїмо застосунок на сервер через SSH. Для цього додамо стадію deploy:


stages:
  - test
  - build
  - dockerize
  - deploy

deploy-job:
  stage: deploy
  image: ubuntu:latest
  before_script:
    - apt-get update && apt-get install -y ssh # Встановлюємо SSH-клієнт
  script:
    - ssh $DEPLOY_USER@$DEPLOY_HOST "docker pull $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA && docker stop my-spring-app || true && docker rm my-spring-app || true && docker run -d --name my-spring-app -p 8080:8080 $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA"

Що тут відбувається:

  • Підключаємося до сервера через SSH.
  • Тягнемо свіжий Docker-образ нашого застосунку.
  • Зупиняємо і видаляємо старий контейнер (якщо був запущений).
  • Запускаємо новий контейнер.

Змінні оточення

Для роботи пайплайну нам потрібно задати змінні оточення в GitLab:

  • $DOCKER_USERNAME — ім'я користувача Docker Hub.
  • $DOCKER_PASSWORD — пароль від Docker Hub.
  • $DEPLOY_USER — SSH-користувач для деплою.
  • $DEPLOY_HOST — хост, на який деплоїться застосунок.

Можеш їх налаштувати в розділі Settings → CI/CD → Variables твого GitLab проєкту.


Повний файл .gitlab-ci.yml

В підсумку маємо такий файл:


stages:
  - test
  - build
  - dockerize
  - deploy

test-job:
  stage: test
  image: maven:3.8.6-jdk-11
  script:
    - mvn test

build-job:
  stage: build
  image: maven:3.8.6-jdk-11
  script:
    - mvn package -DskipTests
  artifacts:
    paths:
      - target/*.jar

dockerize-job:
  stage: dockerize
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  script:
    - docker build -t $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA .
    - docker push $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA

deploy-job:
  stage: deploy
  image: ubuntu:latest
  before_script:
    - apt-get update && apt-get install -y ssh # Встановлюємо SSH-клієнт
  script:
    - ssh $DEPLOY_USER@$DEPLOY_HOST "docker pull $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA && docker stop my-spring-app || true && docker rm my-spring-app || true && docker run -d --name my-spring-app -p 8080:8080 $DOCKER_USERNAME/my-spring-app:$CI_COMMIT_SHORT_SHA"

Налагодження та типовi помилки

  • Docker-in-Docker проблеми Якщо бачиш помилки на кшталт cannot connect to the Docker daemon, переконайся, що сервіс docker:dind запущений і правильно налаштований.
  • SSH не працює Перевір, що SSH-ключ доданий на твій сервер, а змінні $DEPLOY_USER і $DEPLOY_HOST вказані коректно.
  • Проблеми з Docker Hub Якщо Docker Hub повертає помилку автентифікації, перевір, що $DOCKER_USERNAME і $DOCKER_PASSWORD задані правильно.

Все готово! Ти щойно створив бойовий CI/CD пайплайн для свого Spring Boot застосунку. Тепер кожна нова фіча автоматично перевіриться, збереться й доставиться в продакшн, поки ти п'єш каву.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ