131 lines
5.9 KiB
YAML
131 lines
5.9 KiB
YAML
# Раннер 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
|