Нагадую про інструменти для побудови 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 застосунку. Тепер кожна нова фіча автоматично перевіриться, збереться й доставиться в продакшн, поки ти п'єш каву.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ