87 lines
3.8 KiB
YAML
87 lines
3.8 KiB
YAML
# ARC Runner Scale Set: lux-build
|
|
#
|
|
# Provisions ephemeral amd64 build runners for luxfi/* GitHub workflows
|
|
# that target `runs-on: lux-build`. Cluster: do-sfo3-lux-k8s, namespace:
|
|
# arc-system. Node pool: lux-runners-amd64 (DOKS managed, autoscales
|
|
# 1->4 amd64 droplets on demand; taint dedicated=ci-runner:NoSchedule).
|
|
#
|
|
# Why: org separation per CLAUDE.md — luxfi/* workflows MUST use
|
|
# lux-build (this pool), hanzoai/* workflows MUST use
|
|
# hanzo-build-linux-amd64 (separate cluster). Cross-org runs-on
|
|
# queues silently and times out at 24h.
|
|
#
|
|
# Install:
|
|
# helm pull oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set --version 0.14.0 --destination /tmp
|
|
# helm --kube-context=do-sfo3-lux-k8s -n arc-system install lux-build \
|
|
# /tmp/gha-runner-scale-set-0.14.0.tgz \
|
|
# -f infra/k8s/arc/values-build-amd64.yaml
|
|
#
|
|
# Note: 2026-06-02 — pool was missing on do-sfo3-lux-k8s; v1.28.19
|
|
# build sat queued for 28+ minutes until this pool was reinstalled.
|
|
# Pinning the values file here so future install/uninstall cycles
|
|
# always reproduce the same shape.
|
|
#
|
|
# Recurrence, and why the selector changed:
|
|
#
|
|
# The pool went missing AGAIN. `doctl kubernetes cluster node-pool list
|
|
# lux-k8s` returns exactly one pool — lux-nodes — so every ephemeral runner
|
|
# pod on this cluster has been unschedulable. Measured: all five lux scale
|
|
# sets (lux-build 9, lux-build-amd64 10, lux-docs-build 1, plus
|
|
# lux-build-linux-amd64 and lux-apps-build at 0) sitting on
|
|
# 0/10 nodes are available: 10 node(s) didn't match Pod's node
|
|
# affinity/selector … 1 max node group size reached
|
|
# for 13h. Consequence: luxfi/cloud queued four Docker builds for 5-10h and
|
|
# lux.cloud served a bundle six commits stale, still calling the retired
|
|
# /v1/chain/C/rpc — so the console reported a live trillion-LUX treasury as
|
|
# 0 LUX and every Lux chain's height as an em-dash.
|
|
#
|
|
# The selector was also WRONG independently of the missing pool: `arch:
|
|
# amd64` is not a label any DOKS node carries. Verified both directions —
|
|
# `kubectl get nodes -l arch=amd64` returns "No resources found" while
|
|
# `-l kubernetes.io/arch=amd64` returns all 10. It is now the pair hanzo's
|
|
# ARC values already use (hanzo/universe:infra/k8s/arc/*.values.yaml):
|
|
# the DOKS pool name plus the well-known arch label.
|
|
#
|
|
# Pinning the POOL NAME is deliberate and load-bearing. Selecting on arch
|
|
# alone would let 2-CPU/4Gi runner pods (8-CPU/16Gi limits) schedule onto
|
|
# lux-nodes, which hosts mainnet luxd-0..4 and the whole lux surface at
|
|
# 68-94% memory-requested. CI must never compete with a validator for a
|
|
# node. With the pool named, this chart is fail-CLOSED: until the pool
|
|
# exists the runners stay Pending — visibly broken — rather than quietly
|
|
# landing on the validator pool.
|
|
#
|
|
# The one owner-gated step to unblock (creates billable droplets):
|
|
# doctl kubernetes cluster node-pool create lux-k8s \
|
|
# --name lux-runners-amd64 --size s-8vcpu-16gb-amd \
|
|
# --auto-scale --min-nodes 1 --max-nodes 4 \
|
|
# --label arch=amd64 --taint dedicated=ci-runner:NoSchedule
|
|
# The --label is what the arch selector below matches; the taint is what
|
|
# the toleration below clears. Nothing else needs to change.
|
|
githubConfigUrl: https://github.com/luxfi
|
|
githubConfigSecret: arc-github-secret
|
|
minRunners: 0
|
|
maxRunners: 10
|
|
containerMode:
|
|
type: dind
|
|
template:
|
|
spec:
|
|
nodeSelector:
|
|
doks.digitalocean.com/node-pool: lux-runners-amd64
|
|
kubernetes.io/arch: amd64
|
|
tolerations:
|
|
- key: dedicated
|
|
operator: Equal
|
|
value: ci-runner
|
|
effect: NoSchedule
|
|
containers:
|
|
- name: runner
|
|
image: ghcr.io/actions/actions-runner:latest
|
|
command: ["/home/runner/run.sh"]
|
|
resources:
|
|
requests:
|
|
cpu: "2"
|
|
memory: 4Gi
|
|
limits:
|
|
cpu: "8"
|
|
memory: 16Gi
|