ci/cd first pipe

This commit is contained in:
Kayashov.SM
2026-08-29 00:00:12 +04:00
parent a1beeb949e
commit fc2d7fc2d1
4 changed files with 169 additions and 0 deletions
+62
View File
@@ -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
+28
View File
@@ -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"]
+64
View File
@@ -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
+15
View File
@@ -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