From a36036aa1a66db8aa89d8b7ec5730b2b22e9e5f6 Mon Sep 17 00:00:00 2001 From: Andrew Stoltz Date: Sun, 17 May 2026 22:26:28 -0500 Subject: [PATCH] feat(github-runner): add Marquee + TtsReader per-repo runners Closes the Marquee 1.2.0 publish queue (PR #7 on Marquee, scheme aligned with FC.Common canonical csproj-baked Version) and the TtsReader audio-404 FcAlert CI queue (PR #18 on TtsReader merged from this session). Mirrors the Sprint 29 Cx-1 per-repo Deployment pattern from PR #5 verbatim. Marquee + TtsReader weren't in the Sprint 29 Cx-1 top-8 cost-driven set but have operator-relevant CI queued. Long-tail repos (Common shared sublibs / Distribution / DNS / Knowledge / LlmBridge / Media / Presentations / RemoteDesktop / SegmentDisplay / Signage.Contracts / SignalControl / etc.) still deferred to Q-CI-58 Sprint 31+ batch as planned. --- apps/github-runner/github-runner.yaml | 260 ++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) diff --git a/apps/github-runner/github-runner.yaml b/apps/github-runner/github-runner.yaml index 09a6e75..f7acdf1 100644 --- a/apps/github-runner/github-runner.yaml +++ b/apps/github-runner/github-runner.yaml @@ -1438,6 +1438,266 @@ spec: - name: tmp emptyDir: {} restartPolicy: Always +--- +# Runner for FlowerCore.Marquee. Added 2026-05-21 (Sprint 30 add-on) to drain +# the 1.2.0 version-scheme alignment PR #7 publish queue. Mirrors the Sprint 29 +# Cx-1 per-repo Deployment pattern (PR #5) verbatim. Two replicas use per-pod +# emptyDir caches, so backlog can drain without sharing a ReadWriteOnce PVC. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: github-runner-marquee + namespace: github-runner + labels: + app.kubernetes.io/name: github-runner-marquee + app.kubernetes.io/component: runner + app.kubernetes.io/part-of: flowercore + app.kubernetes.io/managed-by: argocd + flowercore.io/created-by: argocd + flowercore.io/runner-repo: marquee + flowercore.io/github-repo: FlowerCore.Marquee +spec: + replicas: 2 + selector: + matchLabels: + app.kubernetes.io/name: github-runner-marquee + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: github-runner-marquee + app.kubernetes.io/component: runner + app.kubernetes.io/part-of: flowercore + flowercore.io/created-by: argocd + flowercore.io/runner-repo: marquee + flowercore.io/github-repo: FlowerCore.Marquee + spec: + serviceAccountName: github-runner + securityContext: + runAsNonRoot: true + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + initContainers: + - name: setup-runner-home + image: busybox:1.36 + command: + - sh + - -c + - | + set -e + mkdir -p /home/runner/.dotnet /home/runner/.nuget/packages /home/runner/.nuget/NuGet + chown -R 1001:1001 /home/runner/.dotnet /home/runner/.nuget + chmod -R 755 /home/runner/.dotnet /home/runner/.nuget + securityContext: + runAsUser: 0 + runAsNonRoot: false + volumeMounts: + - name: runner-home + mountPath: /home/runner + containers: + - name: runner + image: myoung34/github-runner:latest + imagePullPolicy: Always + env: + - name: REPO_URL + value: "https://github.com/astoltz/FlowerCore.Marquee" + - name: RUNNER_NAME_PREFIX + value: "rke2-linux-marquee" + - name: RUNNER_WORKDIR + value: "/tmp/runner/work" + - name: EPHEMERAL + value: "true" + - name: LABELS + value: "self-hosted,linux,fc-build-linux" + - name: HOME + value: "/home/runner" + - name: DOTNET_INSTALL_DIR + value: "/home/runner/.dotnet" + - name: DOTNET_CLI_TELEMETRY_OPTOUT + value: "1" + - name: DOTNET_NOLOGO + value: "1" + - name: DOTNET_GENERATE_ASPNET_CERTIFICATE + value: "false" + - name: DOTNET_CLI_HOME + value: "/home/runner" + - name: NUGET_PACKAGES + value: "/home/runner/.nuget/packages" + - name: XDG_CACHE_HOME + value: "/home/runner/.cache" + - name: RUNNER_TOOL_CACHE + value: "/home/runner/_tool" + - name: ACCESS_TOKEN + valueFrom: + secretKeyRef: + name: github-runner-token + key: credential + - name: RUN_AS_ROOT + value: "false" + resources: + requests: + cpu: "500m" + memory: "1Gi" + limits: + cpu: "2000m" + memory: "4Gi" + volumeMounts: + - name: runner-home + mountPath: /home/runner + - name: nuget-cache + mountPath: /home/runner/.nuget/packages + - name: tmp + mountPath: /tmp + livenessProbe: + exec: + command: + - /bin/sh + - -c + - "pgrep -f Runner.Listener > /dev/null" + initialDelaySeconds: 30 + periodSeconds: 30 + failureThreshold: 3 + volumes: + - name: runner-home + emptyDir: {} + - name: nuget-cache + emptyDir: + sizeLimit: 2Gi + - name: tmp + emptyDir: {} + restartPolicy: Always +--- +# Runner for FlowerCore.TtsReader. Added 2026-05-21 (Sprint 30 add-on) to drain +# the audio 404 FcAlert surface PR #18 CI queue. Mirrors the Sprint 29 Cx-1 +# per-repo Deployment pattern (PR #5) verbatim. Two replicas use per-pod +# emptyDir caches, so backlog can drain without sharing a ReadWriteOnce PVC. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: github-runner-tts-reader + namespace: github-runner + labels: + app.kubernetes.io/name: github-runner-tts-reader + app.kubernetes.io/component: runner + app.kubernetes.io/part-of: flowercore + app.kubernetes.io/managed-by: argocd + flowercore.io/created-by: argocd + flowercore.io/runner-repo: tts-reader + flowercore.io/github-repo: FlowerCore.TtsReader +spec: + replicas: 2 + selector: + matchLabels: + app.kubernetes.io/name: github-runner-tts-reader + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: github-runner-tts-reader + app.kubernetes.io/component: runner + app.kubernetes.io/part-of: flowercore + flowercore.io/created-by: argocd + flowercore.io/runner-repo: tts-reader + flowercore.io/github-repo: FlowerCore.TtsReader + spec: + serviceAccountName: github-runner + securityContext: + runAsNonRoot: true + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + initContainers: + - name: setup-runner-home + image: busybox:1.36 + command: + - sh + - -c + - | + set -e + mkdir -p /home/runner/.dotnet /home/runner/.nuget/packages /home/runner/.nuget/NuGet + chown -R 1001:1001 /home/runner/.dotnet /home/runner/.nuget + chmod -R 755 /home/runner/.dotnet /home/runner/.nuget + securityContext: + runAsUser: 0 + runAsNonRoot: false + volumeMounts: + - name: runner-home + mountPath: /home/runner + containers: + - name: runner + image: myoung34/github-runner:latest + imagePullPolicy: Always + env: + - name: REPO_URL + value: "https://github.com/astoltz/FlowerCore.TtsReader" + - name: RUNNER_NAME_PREFIX + value: "rke2-linux-tts-reader" + - name: RUNNER_WORKDIR + value: "/tmp/runner/work" + - name: EPHEMERAL + value: "true" + - name: LABELS + value: "self-hosted,linux,fc-build-linux" + - name: HOME + value: "/home/runner" + - name: DOTNET_INSTALL_DIR + value: "/home/runner/.dotnet" + - name: DOTNET_CLI_TELEMETRY_OPTOUT + value: "1" + - name: DOTNET_NOLOGO + value: "1" + - name: DOTNET_GENERATE_ASPNET_CERTIFICATE + value: "false" + - name: DOTNET_CLI_HOME + value: "/home/runner" + - name: NUGET_PACKAGES + value: "/home/runner/.nuget/packages" + - name: XDG_CACHE_HOME + value: "/home/runner/.cache" + - name: RUNNER_TOOL_CACHE + value: "/home/runner/_tool" + - name: ACCESS_TOKEN + valueFrom: + secretKeyRef: + name: github-runner-token + key: credential + - name: RUN_AS_ROOT + value: "false" + resources: + requests: + cpu: "500m" + memory: "1Gi" + limits: + cpu: "2000m" + memory: "4Gi" + volumeMounts: + - name: runner-home + mountPath: /home/runner + - name: nuget-cache + mountPath: /home/runner/.nuget/packages + - name: tmp + mountPath: /tmp + livenessProbe: + exec: + command: + - /bin/sh + - -c + - "pgrep -f Runner.Listener > /dev/null" + initialDelaySeconds: 30 + periodSeconds: 30 + failureThreshold: 3 + volumes: + - name: runner-home + emptyDir: {} + - name: nuget-cache + emptyDir: + sizeLimit: 2Gi + - name: tmp + emptyDir: {} + restartPolicy: Always # Long-tail runner pattern: # -- 2.49.1