ci: CICD-сборка (Gitea Actions: bootJar → docker → helm-publish) + helm-чарт
Build Media Mirror Worker / Build and publish (release) Successful in 3m30s

- workflow на release published: bootJar, build-docker (media-mirror/*), helm-publish (9.9.9 → tag)
- helm: Chart.yaml placeholder 9.9.9, values, templates (deployment/service/configmap/secret)
- env: DB, S3, Jellyfin через secret
This commit is contained in:
Hermes Agent
2026-08-10 17:36:19 +03:00
parent 5ad865715e
commit 6056f370f9
7 changed files with 278 additions and 0 deletions
+35
View File
@@ -0,0 +1,35 @@
name: 'Build Media Mirror Worker'
on:
release:
types: [published]
jobs:
deploy-dev:
name: 'Build and publish'
runs-on: ubuntu-latest
steps:
- name: 'Checkout'
uses: https://github.com/actions/checkout@v4
- name: 'Config gradle repository replace'
uses: https://git.binom.pw/otp/devops/config-gradle@main
- name: 'Build bootJar'
uses: https://git.binom.pw/subochev/devops/build-gradle@main
with:
target: bootJar
- name: Build Docker Image
uses: https://git.binom.pw/subochev/devops/build-docker@main
with:
image_name: "media-mirror/worker"
tags: latest ${{ gitea.ref_name }}
context: './'
- name: 'Publishing Helm'
uses: https://git.binom.pw/subochev/devops/helm-publish@main
with:
chart_directory: 'helm'
helm_version: ${{ gitea.ref_name }}
helm_version_placeholder: '9.9.9'
+6
View File
@@ -0,0 +1,6 @@
apiVersion: v2
name: media-mirror-worker
description: Воркер конвертации зеркал — очередь Postgres, ffmpeg, S3
type: application
version: "9.9.9"
appVersion: "9.9.9"
+38
View File
@@ -0,0 +1,38 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-main-config
data:
application.yaml: |
app:
poll-interval: {{ $.Values.app.pollInterval | quote }}
stale-timeout: {{ $.Values.app.staleTimeout | quote }}
jellyfin:
url: {{ $.Values.app.jellyfin.url | quote }}
api-key: ${JELLYFIN_API_KEY}
s3:
url: {{ $.Values.app.s3.url | quote }}
access-key: ${S3_ACCESS_KEY}
secret-key: ${S3_SECRET_KEY}
bucket: {{ $.Values.app.s3.bucket }}
region: {{ $.Values.app.s3.region }}
prefix: {{ $.Values.app.s3.prefix }}
spring:
datasource:
url: jdbc:postgresql://{{ $.Values.db.host }}:{{ $.Values.db.port }}/{{ $.Values.db.name }}
username: ${DB_USER}
password: ${DB_PASSWORD}
hikari:
maximum-pool-size: {{ $.Values.db.maxConnections }}
flyway:
enabled: true
locations: classpath:db/migration
management:
server:
port: {{ $.Values.managementPort }}
endpoints:
web:
exposure:
include: env, health, info
+127
View File
@@ -0,0 +1,127 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ $.Release.Name }}-{{ $.Chart.Name }}"
labels:
{{- if $.Values.labels }}
{{- toYaml $.Values.labels | nindent 4 }}
{{- end }}
app.kubernetes.io/name: {{ $.Chart.Name }}
app.kubernetes.io/instance: {{ $.Release.Name }}
app.kubernetes.io/version: {{ $.Chart.AppVersion | quote }}
spec:
{{- if not $.Values.autoscaling.enabled }}
{{ if $.Values.replicaCount }}
replicas: {{ $.Values.replicaCount }}
{{ else }}
replicas: 1
{{ end }}
{{- end }}
selector:
matchLabels:
app.kubernetes.io/name: {{ $.Chart.Name }}
app.kubernetes.io/instance: {{ $.Release.Name }}
template:
metadata:
annotations:
metric.binom.pw/enabled: '{{ $.Values.metrics }}'
{{ if ($.Values.metrics) }}
metric.binom.pw/url: ":{{ $.Values.managementPort }}/actuator/prometheus"
{{ end }}
{{- with $.Values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
app.kubernetes.io/name: {{ $.Chart.Name }}
app.kubernetes.io/instance: {{ $.Release.Name }}
spec:
{{- with $.Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
- name: application-properties-volume
configMap:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-main-config
items:
- key: application.yaml
path: application.yaml
securityContext:
{{- toYaml $.Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ $.Chart.Name }}
securityContext:
{{- toYaml $.Values.securityContext | nindent 12 }}
image: "{{ $.Values.image.name }}:{{ default $.Chart.AppVersion $.Values.image.tag }}"
imagePullPolicy: {{ $.Values.image.pullPolicy }}
env:
- name: SPRING_CONFIG_ADDITIONAL_LOCATION
value: "file:/opt/app/config/application.yaml"
- name: DB_USER
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-secret
key: dbUser
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-secret
key: dbPassword
- name: DB_URL
value: "jdbc:postgresql://{{ $.Values.db.host }}:{{ $.Values.db.port }}/{{ $.Values.db.name }}"
- name: S3_ACCESS_KEY
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-secret
key: app.s3.accessKey
- name: S3_SECRET_KEY
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-secret
key: app.s3.secretKey
- name: JELLYFIN_API_KEY
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-secret
key: app.jellyfin.apiKey
volumeMounts:
- mountPath: '/opt/app/config'
name: application-properties-volume
readOnly: true
ports:
- name: http
containerPort: {{ $.Values.port }}
protocol: TCP
- name: management
containerPort: {{ $.Values.managementPort }}
protocol: TCP
livenessProbe:
httpGet:
path: '/actuator/health/liveness'
port: management
initialDelaySeconds: 20
periodSeconds: 10
readinessProbe:
httpGet:
path: '/actuator/health/readiness'
port: management
initialDelaySeconds: 25
periodSeconds: 10
{{- if $.Values.resources }}
resources:
{{- toYaml $.Values.resources | nindent 12 }}
{{- else }}
resources: { }
{{ end }}
{{- with $.Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $.Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $.Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
+11
View File
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ $.Release.Name }}-{{ $.Chart.Name }}-secret
type: Opaque
data:
dbUser: {{ (required "DB user не установлен" $.Values.db.user) | b64enc | quote }}
dbPassword: {{ (required "DB password не установлен" $.Values.db.password) | b64enc | quote }}
accessKey: {{ (required "Accesskey не установлен" $.Values.app.s3.accessKey) | b64enc | quote }}
secretKey: {{ (required "Secretkey не установлен" $.Values.app.s3.secretKey) | b64enc | quote }}
apiKey: {{ (required "Apikey не установлен" $.Values.app.jellyfin.apiKey) | b64enc | quote }}
+21
View File
@@ -0,0 +1,21 @@
apiVersion: v1
kind: Service
metadata:
name: "{{ $.Release.Name }}-{{ $.Chart.Name }}"
labels:
{{- if $.Values.labels }}
{{- toYaml $.Values.labels | nindent 4 }}
{{- end }}
app.kubernetes.io/name: {{ $.Chart.Name }}
app.kubernetes.io/instance: {{ $.Release.Name }}
spec:
ports:
- port: {{ $.Values.port }}
protocol: TCP
name: http
- port: {{ $.Values.managementPort }}
protocol: TCP
name: management
selector:
app.kubernetes.io/name: {{ $.Chart.Name }}
app.kubernetes.io/instance: {{ $.Release.Name }}
+40
View File
@@ -0,0 +1,40 @@
replicaCount: 1
autoscaling:
enabled: false
labels: []
metrics: true
managementPort: 9090
port: 8081
imagePullSecrets: null
image:
name: 'media-mirror/worker'
pullPolicy: IfNotPresent
db:
host: null
port: 5432
name: glasses
user: null
password: null
maxConnections: 10
app:
pollInterval: "PT2S"
staleTimeout: "PT30M"
jellyfin:
url: null
apiKey: null
s3:
url: null
accessKey: null
secretKey: null
bucket: media
region: us-east-1
prefix: mirror
securityContext:
privileged: false