From fc2d7fc2d144d38ad3edefd98edc908a980a3aaa Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Sat, 29 Aug 2026 00:00:12 +0400 Subject: [PATCH] ci/cd first pipe --- .gitea/workflows/deploy.yml | 62 +++++++++++++++++++++++++++ Dockerfile | 28 ++++++++++++ k8s/schedule-service/deployment.yaml | 64 ++++++++++++++++++++++++++++ k8s/schedule-service/service.yaml | 15 +++++++ 4 files changed, 169 insertions(+) create mode 100644 .gitea/workflows/deploy.yml create mode 100644 Dockerfile create mode 100644 k8s/schedule-service/deployment.yaml create mode 100644 k8s/schedule-service/service.yaml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..8c1a6e8 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,62 @@ +name: build-and-deploy + +on: + push: + branches: [main] + +# ВАЖНО: значения ниже подставлены из твоего git remote (git.kayashov.keenetic.pro/kayashov73). +# Секреты нужно один раз завести в Settings → Actions → Secrets репозитория: +# REGISTRY_USER — логин в Gitea +# REGISTRY_TOKEN — personal access token с правами на пакеты (обычный пароль/встроенный +# токен раннера для push в registry не подходит, см. обсуждение ниже) +# KUBE_CONFIG — kubeconfig с доступом к твоему k3s, закодированный в base64 +# (base64 -w0 ~/.kube/config) + +env: + REGISTRY: git.kayashov.keenetic.pro + IMAGE: git.kayashov.keenetic.pro/kayashov73/schedule-service + NAMESPACE: media + +jobs: + build-and-deploy: + # Проверь, что этот лейбл совпадает с тем, под которым зарегистрирован твой раннер + # (Settings → Actions → Runners). Это самое вероятное место, где придётся поправить. + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Gitea Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: ${{ env.IMAGE }}:${{ github.sha }} + + - name: Install kubectl + run: | + curl -sSLO "https://dl.k8s.io/release/v1.30.0/bin/linux/amd64/kubectl" + chmod +x kubectl + mkdir -p ~/.kube + echo "${{ secrets.KUBE_CONFIG }}" | base64 -d > ~/.kube/config + + - name: Apply manifests + run: | + ./kubectl apply -f k8s/schedule-service/ + + - name: Roll out new image + run: | + ./kubectl set image deployment/schedule-service \ + schedule-service=${{ env.IMAGE }}:${{ github.sha }} \ + -n ${{ env.NAMESPACE }} + ./kubectl rollout status deployment/schedule-service -n ${{ env.NAMESPACE }} --timeout=180s diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..704bbb2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +# syntax=docker/dockerfile:1 + +# ---- сборка ---- +FROM maven:3.9-eclipse-temurin-17 AS build +WORKDIR /build + +# Сначала только pom.xml, чтобы слой с зависимостями кэшировался отдельно от исходников +# и не перекачивался заново при каждом изменении кода. +COPY pom.xml . +RUN --mount=type=cache,target=/root/.m2 mvn -B -q dependency:go-offline + +COPY src ./src +RUN --mount=type=cache,target=/root/.m2 mvn -B -q package -DskipTests + +# ---- рантайм ---- +FROM eclipse-temurin:17-jre-alpine +WORKDIR /app + +# Wildcard, чтобы не завязываться на конкретный номер версии из pom.xml. +COPY --from=build /build/target/schedule-service-*.jar app.jar + +# MaxRAMPercentage вместо фиксированного -Xmx — домашний сервер слабый (11 ГБ на всё), +# лучше явно ограничить долю выделенного контейнеру лимита памяти, чем полагаться на +# дефолт JVM (25% от memory limit пода, что может быть мало под старт Hibernate). +ENV JAVA_OPTS="-XX:MaxRAMPercentage=70.0" + +EXPOSE 8080 +ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"] diff --git a/k8s/schedule-service/deployment.yaml b/k8s/schedule-service/deployment.yaml new file mode 100644 index 0000000..f84e2e0 --- /dev/null +++ b/k8s/schedule-service/deployment.yaml @@ -0,0 +1,64 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: schedule-service + namespace: media + labels: + app: schedule-service +spec: + replicas: 1 + selector: + matchLabels: + app: schedule-service + template: + metadata: + labels: + app: schedule-service + spec: + containers: + - name: schedule-service + # Тег ниже — заглушка на самый первый apply, до того как CI впервые соберёт + # и запушит образ. Дальше CI сам подставляет реальный тег через `kubectl set image`. + image: git.kayashov.keenetic.pro/kayashov73/schedule-service:latest + ports: + - containerPort: 8080 + env: + # In-cluster DNS того же Postgres, который сейчас пробрасывается через + # port-forward для локального запуска (см. application.yml). + - name: SPRING_DATASOURCE_URL + value: jdbc:postgresql://postgres-postgresql.media.svc.cluster.local:5432/baykal + - name: SPRING_DATASOURCE_USERNAME + value: baykal + - name: SPRING_DATASOURCE_PASSWORD + valueFrom: + secretKeyRef: + name: schedule-service-secrets + key: db-password + # NodePort Baikal слушает на самом узле — тот же адрес работает что из пода, + # что с локальной машины, менять не нужно. + - name: CALDAV_BASE_URL + value: http://192.168.1.100:30019/dav.php/calendars/sergey/main + - name: CALDAV_USERNAME + value: sergey + - name: CALDAV_PASSWORD + valueFrom: + secretKeyRef: + name: schedule-service-secrets + key: caldav-password + resources: + requests: + cpu: 150m + memory: 384Mi + limits: + cpu: 750m + memory: 768Mi + livenessProbe: + tcpSocket: + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 15 + readinessProbe: + tcpSocket: + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 10 diff --git a/k8s/schedule-service/service.yaml b/k8s/schedule-service/service.yaml new file mode 100644 index 0000000..f6217d2 --- /dev/null +++ b/k8s/schedule-service/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: schedule-service + namespace: media +spec: + type: NodePort + selector: + app: schedule-service + ports: + - port: 8080 + targetPort: 8080 + # Проверь, что порт свободен: Baikal уже занимает 30019. + # kubectl get svc -A | grep NodePort — глянуть, что ещё занято. + nodePort: 30080