Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Определяем стадии пайплайна
stages:
- test
- build
- deploy

# Переменные окружения
variables:
DOCKER_REGISTRY: docker.io
DOCKER_IMAGE: vladimirchavkin/spring-todo
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"

# Кэширование зависимостей Maven для ускорения сборки
cache:
paths:
- .m2/repository/

# Сервисы для тестов (PostgreSQL и Redis через Testcontainers)
services:
- name: postgres:16
alias: postgres
- name: redis:latest
alias: redis

# Job для запуска тестов на PR в dev ветку
test_job:
stage: test
image: maven:3.8.6-openjdk-17
services:
- postgres:16
- redis:latest
variables:
SPRING_DATASOURCE_URL: "jdbc:postgresql://postgres:5432/todo_db"
SPRING_DATASOURCE_USERNAME: "postgres"
SPRING_DATASOURCE_PASSWORD: ""
SPRING_REDIS_HOST: "redis"
SPRING_REDIS_PORT: "6379"
script:
- mvn clean test
only:
refs:
- dev
except:
- master

# Job для проверки сборки приложения на PR в dev
build_check_job:
stage: build
image: maven:3.8.6-openjdk-17
script:
- mvn clean package -DskipTests
only:
refs:
- dev
except:
- master

# Job для сборки и пуша Docker образа при merge в master
docker_build_push:
stage: deploy
image: docker:24.0.5
services:
- docker:24.0.5-dind
variables:
DOCKER_TLS_CERTDIR: ""
DOCKER_HOST: tcp://docker:2375
before_script:
- docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD $DOCKER_REGISTRY
script:
- mvn clean package -DskipTests
- docker build -t $DOCKER_IMAGE:$CI_COMMIT_SHA .
- docker push $DOCKER_IMAGE:$CI_COMMIT_SHA
- docker tag $DOCKER_IMAGE:$CI_COMMIT_SHA $DOCKER_IMAGE:latest
- docker push $DOCKER_IMAGE:latest
only:
refs:
- master

changes:
- Dockerfile
- src/**/*
- pom.xml
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM openjdk:21
WORKDIR /app
COPY ./target/SpringToDo-0.0.1-SNAPSHOT.jar ./app.jar
EXPOSE 8088
CMD ["java","-jar","app.jar"]
63 changes: 63 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
pipeline {
agent any

tools {
maven 'maven'
jdk 'jdk21'
}

environment {
DOCKER_IMAGE = 'vladimirchavkin/spring-todo' // Замените на ваш Docker Hub repo
DOCKER_TAG = "${env.BUILD_NUMBER}" // Тег — номер build'а
}

stages {
stage('Checkout') {
steps {
checkout scm // Получаем код из Git
}
}

stage('Build') {
steps {
sh 'mvn clean install -DskipTests' // Проверка сборки без тестов
echo 'Сборка прошла успешно!'
}
}

stage('Test') { // Опционально: прогон тестов
when {
expression { return true } // Включите для всех, или only for PRs: branch pattern 'PR-*'
}
steps {
sh 'mvn test' // Если тесты сломаются, pipeline fail
echo 'Тесты прошли успешно!'
}
}

stage('Build and Push Docker') {
when {
branch 'master' // Только для master
}
steps {
script {
docker.build("${DOCKER_IMAGE}:${DOCKER_TAG}", ".") // Собираем image
withDockerRegistry([credentialsId: 'docker-hub-credentials', url: 'https://index.docker.io/v1/']) {
dockerImage.push() // Пушим в Docker Hub
dockerImage.push('latest') // Опционально: тег latest
}
}
echo 'Docker image собран и загружен в Docker Hub!'
}
}
}

post {
always {
echo 'Pipeline завершен.'
}
failure {
echo 'Pipeline провалился! Проверьте логи.'
}
}
}
5 changes: 5 additions & 0 deletions docker/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
POSTGRES_VERSION=15
POSTGRES_DB=spring-todo
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
REDIS_VERSION=latest
71 changes: 71 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
version: '3.8'

services:
app:
build:
context: ../
dockerfile: Dockerfile
ports:
- "8088:8088"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/springtodo
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=postgres
- SPRING_FLYWAY_URL=jdbc:postgresql://db:5432/springtodo
- SPRING_FLYWAY_USER=postgres
- SPRING_FLYWAY_PASSWORD=postgres
- SPRING_DATA_REDIS_HOST=redis
- SPRING_DATA_REDIS_PORT=6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8088/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
- default

db:
image: postgres:16
environment:
- POSTGRES_DB=springtodo
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
networks:
- default

redis:
image: redis:7
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- default

networks:
default:
driver: bridge

volumes:
postgres_data:
redis_data:
1 change: 1 addition & 0 deletions docker/postgres/sql/postgres-init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CREATE DATABASE springtodo;
30 changes: 30 additions & 0 deletions k8s/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: springtodo-k8s-deployment
labels:
app: todo-k8s
spec:
replicas: 2
selector:
matchLabels:
app: todo-k8s
template:
metadata:
labels:
app: todo-k8s
spec:
containers:
- name: todo-k8s-container
image: todo-k8s:latest
ports:
- containerPort: 8088
resources:
requests:
memory: "2000Mi"
cpu: "1000m"
limits:
memory: "3000Mi"
cpu: "2000m"
---
# В одном файле можно описать несколько ресурсов
11 changes: 11 additions & 0 deletions k8s/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Service
metadata:
name: springtodo-k8s-service
spec:
type: LoadBalancer
ports:
- port: 80 # Порт сервиса
targetPort: 8088 # Порт пода
selector:
app: todo-k8s # Селектор: находит поды по метке
Loading