ci/cd first pipe
This commit is contained in:
@@ -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
@@ -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"]
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user