fixing hook extension

This commit is contained in:
Nikola Jokic 2026-02-05 13:27:57 +01:00
parent e69120e570
commit d6ab193085
No known key found for this signature in database
GPG Key ID: 419BB425B0E501B0
7 changed files with 141 additions and 21 deletions

View File

@ -31,7 +31,7 @@ The name of the GitHub secret used for authentication.
{{- if not (empty .Values.auth.secretName) -}}
{{- .Values.auth.secretName -}}
{{- else -}}
{{- include "autoscaling-runner-set.name" . }}-github-secret
{{- printf "%s-github-secret" (include "autoscaling-runner-set.name" .) -}}
{{- end -}}
{{- end }}
@ -114,4 +114,22 @@ It defaults to ghcr.io/actions/actions-runner:latest if not specified.
{{- fail "runner.container.command must be a list/array" -}}
{{- end -}}
{{- toJson $command -}}
{{- end }}
{{/*
Hook extension ConfigMap name for kubernetes runner mode.
If runner.kubernetesMode.extension.metadata.name is set, use it.
Otherwise, default to a name derived from the scale set name.
*/}}
{{- define "runner-mode-kubernetes.extension-name" -}}
{{- $runner := (.Values.runner | default dict) -}}
{{- $kubeMode := (index $runner "kubernetesMode" | default dict) -}}
{{- $extension := (index $kubeMode "extension" | default dict) -}}
{{- $meta := (index $extension "metadata" | default dict) -}}
{{- $name := (index $meta "name" | default "") -}}
{{- if not (kindIs "string" $name) -}}
{{- fail "runner.kubernetesMode.extension.metadata.name must be a string" -}}
{{- end -}}
{{- default (printf "%s-hook-extension" (include "autoscaling-runner-set.name" .) | trunc 63 | trimSuffix "-") $name -}}
{{- end }}

View File

@ -101,7 +101,7 @@ volumeMounts:
{{- if $hasExtension }}
- name: hook-extension
configMap:
name: {{ if not (empty $extensionRef) }}{{ $extensionRef | quote }}{{ else }}{{ include "kube-mode-extension.name" . | quote }}{{ end }}
name: {{ if not (empty $extensionRef) }}{{ $extensionRef | quote }}{{ else }}{{ include "runner-mode-kubernetes.extension-name" . | quote }}{{ end }}
{{- end }}
{{- end }}

View File

@ -14,7 +14,6 @@
{{- $extensionMeta := dict -}}
{{- $extensionName := "" -}}
{{- $extensionNamespace := "" -}}
{{- $extensionYaml := "" -}}
{{- if kindIs "map" $extension -}}
{{- $extensionMeta = (index $extension "metadata" | default dict) -}}
@ -22,16 +21,12 @@
{{- fail "runner.kubernetesMode.extension.metadata must be an object" -}}
{{- end -}}
{{- $extensionName = (index $extensionMeta "name" | default "") -}}
{{- $extensionNamespace = (index $extensionMeta "namespace" | default "") -}}
{{- $extensionYaml = (index $extension "yaml" | default "") -}}
{{- end -}}
{{- if not (kindIs "string" $extensionName) -}}
{{- fail "runner.kubernetesMode.extension.metadata.name must be a string" -}}
{{- end -}}
{{- if not (kindIs "string" $extensionNamespace) -}}
{{- fail "runner.kubernetesMode.extension.metadata.namespace must be a string" -}}
{{- end -}}
{{- if not (kindIs "string" $extensionYaml) -}}
{{- fail "runner.kubernetesMode.extension.yaml must be a string" -}}
{{- end -}}
@ -40,8 +35,8 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ default (printf "%s-hook-extension" (include "autoscaling-runner-set.name" .) | trunc 63 | trimSuffix "-") $extensionName | quote }}
namespace: {{ default (include "autoscaling-runner-set.namespace" .) $extensionNamespace | quote }}
name: {{ default (include "runner-mode-kubernetes.extension-name" .) $extensionName | quote }}
namespace: {{ include "autoscaling-runner-set.namespace" . | quote }}
labels:
{{- include "kube-mode-extension.labels" . | nindent 4 }}
{{- $annotations := (include "apply-non-reserved-gha-labels-and-annotations" (.Values.resource.all.metadata.annotations | default (dict))) | fromYaml -}}

View File

@ -41,6 +41,30 @@ tests:
subPath: extension
readOnly: true
- it: should mount helper-derived default hook extension name when inline extension has no metadata.name
set:
scaleset.name: "test"
auth.url: "https://github.com/org"
auth.githubToken: "gh_token12345"
controllerServiceAccount.name: "arc"
controllerServiceAccount.namespace: "arc-system"
runner:
mode: "kubernetes"
kubernetesMode:
hookPath: "/home/runner/k8s/index.js"
extension:
yaml: "foo: bar"
release:
name: "test-name"
namespace: "test-namespace"
asserts:
- contains:
path: spec.template.spec.volumes
content:
name: hook-extension
configMap:
name: test-name-hook-extension
- it: should mount hook extension ConfigMap when extensionRef is set
set:
scaleset.name: "test"

View File

@ -10,14 +10,14 @@ tests:
extension:
metadata:
name: "my-hook-extension"
namespace: "test-namespace"
namespace: "ignored-by-chart"
yaml: |
foo: bar
nested:
a: 1
release:
name: "test-name"
namespace: "ignored-by-test" # overridden by extension.metadata.namespace above
namespace: "test-namespace"
asserts:
- equal:
path: apiVersion
@ -38,6 +38,26 @@ tests:
nested:
a: 1
- it: should use helper-derived default name when extension metadata.name is empty
set:
runner:
mode: "kubernetes"
kubernetesMode:
extension:
metadata:
name: ""
yaml: "foo: bar"
release:
name: "test-name"
namespace: "test-namespace"
asserts:
- equal:
path: metadata.name
value: test-name-hook-extension
- equal:
path: metadata.namespace
value: test-namespace
- it: should not render when extension.yaml is empty
set:
runner:

View File

@ -0,0 +1,61 @@
suite: "Hook extension namespace alignment"
templates:
- autoscalingrunnserset.yaml
- hook_extension.yaml
tests:
- it: should render hook extension ConfigMap in the same namespace as AutoscalingRunnerSet (Release namespace)
set:
scaleset.name: "test"
auth.url: "https://github.com/org"
auth.githubToken: "gh_token12345"
controllerServiceAccount.name: "arc"
controllerServiceAccount.namespace: "arc-system"
runner:
mode: "kubernetes"
kubernetesMode:
extension:
metadata:
name: "my-hook-extension"
namespace: "wrong-ns"
yaml: "foo: bar"
release:
name: "test-name"
namespace: "release-ns"
asserts:
- equal:
path: metadata.namespace
value: "release-ns"
template: autoscalingrunnserset.yaml
- equal:
path: metadata.namespace
value: "release-ns"
template: hook_extension.yaml
- it: should render hook extension ConfigMap in the same namespace as AutoscalingRunnerSet (namespaceOverride)
set:
namespaceOverride: "override-ns"
scaleset.name: "test"
auth.url: "https://github.com/org"
auth.githubToken: "gh_token12345"
controllerServiceAccount.name: "arc"
controllerServiceAccount.namespace: "arc-system"
runner:
mode: "kubernetes"
kubernetesMode:
extension:
metadata:
name: "my-hook-extension"
namespace: "wrong-ns"
yaml: "foo: bar"
release:
name: "test-name"
namespace: "release-ns"
asserts:
- equal:
path: metadata.namespace
value: "override-ns"
template: autoscalingrunnserset.yaml
- equal:
path: metadata.namespace
value: "override-ns"
template: hook_extension.yaml

View File

@ -115,7 +115,7 @@ resource:
metadata:
labels: {}
annotations: {}
# Specifies metadata that will be applied to the no-permission ServiceAccount
# (created for non-kubernetes runner modes).
noPermissionServiceAccount:
@ -152,12 +152,12 @@ runner:
# - "" (default) - no additional configuration is applied
# - "kubernetes" - configuration for running jobs in Kubernetes mode is applied
# - "dind" - configuration for running jobs in Docker-in-Docker mode is
#
#
# For each mode, we provide configuration out of the box that works for most use
# cases. You can customize our configuration by modifying the fields below,
# or you can leave mode empty and provide your own complete configuration.
mode: ""
pod:
metadata:
labels: {}
@ -178,7 +178,7 @@ runner:
containers: []
initContainers: []
volumes: []
# container field is applied to the container named "runner". You cannot override the name of the runner container
container:
image: "ghcr.io/actions/actions-runner:latest"
@ -196,12 +196,14 @@ runner:
serviceAccountName: ""
hookPath: "/home/runner/k8s/index.js"
requireJobContainer: true
extensionRef: ""
extension:
metadata:
name: ""
namespace: ""
yaml: ""
# extensionRef: ""
# extension:
## metadata adds metadata to the config map configured for the hook extension
## NOTE: namespace field is ignored.
# metadata:
# labels: ""
# namespace: ""
# yaml: ""
## A self-signed CA certificate for communication with the GitHub server can be
## provided using a config map key selector. If `runnerMountPath` is set, for