Files
architector/deployment/ci/runner-deployment.yaml
2026-08-17 13:36:22 +04:00

131 lines
5.9 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Раннер Gitea Actions внутри k3s.
#
# ВАЖНО (правки после первого неудачного запуска):
# - образ gitea/act_runner устарел, проект переехал в gitea/runner —
# используем его.
# - вместо связки "act_runner + отдельный docker:dind сайдкар с ручным
# command/wait-loop" (там был баг: путь /opt/act/run.sh в текущих сборках
# уже не существует) берём вариант "-dind" — это один образ, где раннер и
# docker-демон запущены вместе через s6 и сами разбираются с порядком
# старта. Меньше кастомной логики — меньше способов сломать.
#
# Добавлено относительно оригинала:
# - hostPath-том на тот же путь, что смонтирован в front-чарте
# (global.front.buildPath, сейчас /md0/services/architector/build) —
# чтобы шаг "собрать и выложить фронт" мог прямо записать build/ на диск ноды.
# ВАЖНО: это работает надёжно только если k3s однонодовый (раннер и
# front-под физически на одной машине). Если нод несколько — нужно
# закрепить оба пода на одной ноде через nodeSelector/affinity.
#
# ВАЖНО #2: смонтировать hostPath в сам под раннера — не значит, что джоб-
# контейнеры (которые создаёт встроенный docker-демон) его увидят. По
# умолчанию раннер v3.x запрещает ЛЮБЫЕ volume/bind-mount в джоб-контейнеры
# (container.valid_volumes: [] в его конфиге), это управляется только через
# YAML-конфиг (CONFIG_FILE), env-переменных для этого больше нет.
# См. https://docs.gitea.com/runner/configuration/#container
#
# Перед применением:
# 1. Впиши токен регистрации раннера в runner-secret.token (base64) —
# токен берётся в Gitea: Site Administration → Actions → Runners →
# Create new Runner (или в настройках конкретного репозитория/организации).
# 2. Проверь GITEA_INSTANCE_URL — адрес твоего Gitea, доступный изнутри кластера.
# 3. kubectl apply -f namespace.yaml -f runner-rbac.yaml -f runner-deployment.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: act-runner-config
namespace: ci
data:
config.yaml: |
container:
# автоматически подключаем /front-build в КАЖДЫЙ джоб-контейнер —
# безвредно для джоб, которые его не используют (build-backend,
# deploy-backend), и решает проблему для build-front.
options: --volume /front-build:/front-build
valid_volumes:
- /front-build
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: act-runner-vol
namespace: ci
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Secret
metadata:
name: runner-secret
namespace: ci
type: Opaque
data:
# base64 от токена регистрации, например: echo -n "<токен>" | base64
token: VGM5ZzROeXpoNVM1TmxIWlVrMHlZZTdRVXh3Y1NuMzN5WG1va1ZFYQ==
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: act-runner
namespace: ci
labels:
app: act-runner
spec:
replicas: 1
# RollingUpdate (дефолт) пытается поднять новый под, пока старый ещё жив,
# а с ReadWriteOnce PVC (/data) второй под не сможет примонтировать тот же
# том — зависает в Pending, пока старый не убьют. Recreate сначала гасит
# старый под, потом поднимает новый — без затыка.
strategy:
type: Recreate
selector:
matchLabels:
app: act-runner
template:
metadata:
labels:
app: act-runner
spec:
restartPolicy: Always
volumes:
- name: runner-data
persistentVolumeClaim:
claimName: act-runner-vol
- name: front-build
hostPath:
path: /md0/services/architector/build
type: DirectoryOrCreate
- name: runner-config
configMap:
name: act-runner-config
containers:
- name: runner
# -dind = раннер + docker-демон в одном образе (управляются s6).
# Можно закрепить конкретную версию вместо latest, если хочется
# стабильности между пересозданиями пода, например latest-dind -> 0.6-dind.
image: gitea/runner:latest-dind
securityContext:
privileged: true # нужно докер-демону внутри контейнера
env:
- name: GITEA_INSTANCE_URL
value: http://gitea.git.svc.cluster.local:3000 # поправь под свой адрес Gitea
- name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom:
secretKeyRef:
name: runner-secret
key: token
- name: CONFIG_FILE
value: /config.yaml
volumeMounts:
- name: runner-data
mountPath: /data
- name: front-build
mountPath: /front-build
- name: runner-config
mountPath: /config.yaml
subPath: config.yaml