diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml index 26d1bdb1..13e5fb55 100644 --- a/.github/workflows/golangci-lint.yaml +++ b/.github/workflows/golangci-lint.yaml @@ -20,4 +20,4 @@ jobs: uses: golangci/golangci-lint-action@v3 with: only-new-issues: true - version: v1.49.0 + version: v1.51.1 diff --git a/charts/gha-runner-scale-set-controller/templates/_helpers.tpl b/charts/gha-runner-scale-set-controller/templates/_helpers.tpl index eb37c21f..a6b3135e 100644 --- a/charts/gha-runner-scale-set-controller/templates/_helpers.tpl +++ b/charts/gha-runner-scale-set-controller/templates/_helpers.tpl @@ -59,16 +59,16 @@ Create the name of the service account to use */}} {{- define "gha-runner-scale-set-controller.serviceAccountName" -}} {{- if eq .Values.serviceAccount.name "default"}} -{{- fail "serviceAccount.name cannot be set to 'default'" }} + {{- fail "serviceAccount.name cannot be set to 'default'" }} {{- end }} {{- if .Values.serviceAccount.create }} -{{- default (include "gha-runner-scale-set-controller.fullname" .) .Values.serviceAccount.name }} + {{- default (include "gha-runner-scale-set-controller.fullname" .) .Values.serviceAccount.name }} {{- else }} - {{- if not .Values.serviceAccount.name }} -{{- fail "serviceAccount.name must be set if serviceAccount.create is false" }} - {{- else }} -{{- .Values.serviceAccount.name }} - {{- end }} + {{- if not .Values.serviceAccount.name }} + {{- fail "serviceAccount.name must be set if serviceAccount.create is false" }} + {{- else }} + {{- .Values.serviceAccount.name }} + {{- end }} {{- end }} {{- end }} @@ -107,7 +107,7 @@ Create the name of the service account to use {{- define "gha-runner-scale-set-controller.imagePullSecretsNames" -}} {{- $names := list }} {{- range $k, $v := . }} -{{- $names = append $names $v.name }} + {{- $names = append $names $v.name }} {{- end }} {{- $names | join ","}} {{- end }} \ No newline at end of file diff --git a/charts/gha-runner-scale-set-controller/templates/leader_election_role.yaml b/charts/gha-runner-scale-set-controller/templates/leader_election_role.yaml index a64906d3..e23e0226 100644 --- a/charts/gha-runner-scale-set-controller/templates/leader_election_role.yaml +++ b/charts/gha-runner-scale-set-controller/templates/leader_election_role.yaml @@ -1,4 +1,4 @@ -{{- if gt (int (default 1 .Values.replicaCount)) 1 -}} +{{- if gt (int (default 1 .Values.replicaCount)) 1 }} # permissions to do leader election. apiVersion: rbac.authorization.k8s.io/v1 kind: Role diff --git a/charts/gha-runner-scale-set-controller/templates/leader_election_role_binding.yaml b/charts/gha-runner-scale-set-controller/templates/leader_election_role_binding.yaml index b33dda68..85effd27 100644 --- a/charts/gha-runner-scale-set-controller/templates/leader_election_role_binding.yaml +++ b/charts/gha-runner-scale-set-controller/templates/leader_election_role_binding.yaml @@ -1,4 +1,4 @@ -{{- if gt (int (default 1 .Values.replicaCount)) 1 -}} +{{- if gt (int (default 1 .Values.replicaCount)) 1 }} apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: diff --git a/charts/gha-runner-scale-set-controller/templates/serviceaccount.yaml b/charts/gha-runner-scale-set-controller/templates/serviceaccount.yaml index 090d3a44..5d3bbf3f 100644 --- a/charts/gha-runner-scale-set-controller/templates/serviceaccount.yaml +++ b/charts/gha-runner-scale-set-controller/templates/serviceaccount.yaml @@ -1,4 +1,4 @@ -{{- if .Values.serviceAccount.create -}} +{{- if .Values.serviceAccount.create }} apiVersion: v1 kind: ServiceAccount metadata: diff --git a/charts/gha-runner-scale-set/templates/_helpers.tpl b/charts/gha-runner-scale-set/templates/_helpers.tpl index 013ca73e..229e5d2a 100644 --- a/charts/gha-runner-scale-set/templates/_helpers.tpl +++ b/charts/gha-runner-scale-set/templates/_helpers.tpl @@ -75,19 +75,15 @@ app.kubernetes.io/instance: {{ .Release.Name }} {{- end }} {{- define "gha-runner-scale-set.dind-init-container" -}} -{{- range $i, $val := .Values.template.spec.containers -}} -{{- if eq $val.name "runner" -}} +{{- range $i, $val := .Values.template.spec.containers }} + {{- if eq $val.name "runner" }} image: {{ $val.image }} -{{- if $val.imagePullSecrets }} -imagePullSecrets: - {{ $val.imagePullSecrets | toYaml -}} -{{- end }} command: ["cp"] args: ["-r", "-v", "/home/runner/externals/.", "/home/runner/tmpDir/"] volumeMounts: - name: dind-externals mountPath: /home/runner/tmpDir -{{- end }} + {{- end }} {{- end }} {{- end }} @@ -124,7 +120,7 @@ volumeMounts: {{- $createWorkVolume := 1 }} {{- range $i, $volume := .Values.template.spec.volumes }} {{- if eq $volume.name "work" }} - {{- $createWorkVolume = 0 -}} + {{- $createWorkVolume = 0 }} - {{ $volume | toYaml | nindent 2 }} {{- end }} {{- end }} @@ -138,7 +134,7 @@ volumeMounts: {{- $createWorkVolume := 1 }} {{- range $i, $volume := .Values.template.spec.volumes }} {{- if eq $volume.name "work" }} - {{- $createWorkVolume = 0 -}} + {{- $createWorkVolume = 0 }} - {{ $volume | toYaml | nindent 2 }} {{- end }} {{- end }} @@ -160,25 +156,20 @@ volumeMounts: {{- end }} {{- define "gha-runner-scale-set.non-runner-containers" -}} - {{- range $i, $container := .Values.template.spec.containers -}} - {{- if ne $container.name "runner" -}} -- name: {{ $container.name }} - {{- range $key, $val := $container }} - {{- if ne $key "name" }} - {{ $key }}: {{ $val }} - {{- end }} - {{- end }} + {{- range $i, $container := .Values.template.spec.containers }} + {{- if ne $container.name "runner" }} +- {{ $container | toYaml | nindent 2 }} {{- end }} {{- end }} {{- end }} {{- define "gha-runner-scale-set.dind-runner-container" -}} {{- $tlsConfig := (default (dict) .Values.githubServerTLS) }} -{{- range $i, $container := .Values.template.spec.containers -}} - {{- if eq $container.name "runner" -}} +{{- range $i, $container := .Values.template.spec.containers }} + {{- if eq $container.name "runner" }} {{- range $key, $val := $container }} {{- if and (ne $key "env") (ne $key "volumeMounts") (ne $key "name") }} -{{ $key }}: {{ $val }} +{{ $key }}: {{ $val | toYaml | nindent 2 }} {{- end }} {{- end }} {{- $setDockerHost := 1 }} @@ -195,29 +186,24 @@ env: {{- with $container.env }} {{- range $i, $env := . }} {{- if eq $env.name "DOCKER_HOST" }} - {{- $setDockerHost = 0 -}} + {{- $setDockerHost = 0 }} {{- end }} {{- if eq $env.name "DOCKER_TLS_VERIFY" }} - {{- $setDockerTlsVerify = 0 -}} + {{- $setDockerTlsVerify = 0 }} {{- end }} {{- if eq $env.name "DOCKER_CERT_PATH" }} - {{- $setDockerCertPath = 0 -}} + {{- $setDockerCertPath = 0 }} {{- end }} {{- if eq $env.name "RUNNER_WAIT_FOR_DOCKER_IN_SECONDS" }} - {{- $setRunnerWaitDocker = 0 -}} + {{- $setRunnerWaitDocker = 0 }} {{- end }} {{- if eq $env.name "NODE_EXTRA_CA_CERTS" }} - {{- $setNodeExtraCaCerts = 0 -}} + {{- $setNodeExtraCaCerts = 0 }} {{- end }} {{- if eq $env.name "RUNNER_UPDATE_CA_CERTS" }} - {{- $setRunnerUpdateCaCerts = 0 -}} - {{- end }} - - name: {{ $env.name }} - {{- range $envKey, $envVal := $env }} - {{- if ne $envKey "name" }} - {{ $envKey }}: {{ $envVal | toYaml | nindent 8 }} - {{- end }} + {{- $setRunnerUpdateCaCerts = 0 }} {{- end }} + - {{ $env | toYaml | nindent 4 }} {{- end }} {{- end }} {{- if $setDockerHost }} @@ -254,20 +240,15 @@ volumeMounts: {{- with $container.volumeMounts }} {{- range $i, $volMount := . }} {{- if eq $volMount.name "work" }} - {{- $mountWork = 0 -}} + {{- $mountWork = 0 }} {{- end }} {{- if eq $volMount.name "dind-cert" }} - {{- $mountDindCert = 0 -}} + {{- $mountDindCert = 0 }} {{- end }} {{- if eq $volMount.name "github-server-tls-cert" }} - {{- $mountGitHubServerTLS = 0 -}} - {{- end }} - - name: {{ $volMount.name }} - {{- range $mountKey, $mountVal := $volMount }} - {{- if ne $mountKey "name" }} - {{ $mountKey }}: {{ $mountVal | toYaml | nindent 8 }} - {{- end }} + {{- $mountGitHubServerTLS = 0 }} {{- end }} + - {{ $volMount | toYaml | nindent 4 }} {{- end }} {{- end }} {{- if $mountWork }} @@ -290,11 +271,11 @@ volumeMounts: {{- define "gha-runner-scale-set.kubernetes-mode-runner-container" -}} {{- $tlsConfig := (default (dict) .Values.githubServerTLS) }} -{{- range $i, $container := .Values.template.spec.containers -}} - {{- if eq $container.name "runner" -}} +{{- range $i, $container := .Values.template.spec.containers }} + {{- if eq $container.name "runner" }} {{- range $key, $val := $container }} {{- if and (ne $key "env") (ne $key "volumeMounts") (ne $key "name") }} -{{ $key }}: {{ $val }} +{{ $key }}: {{ $val | toYaml | nindent 2 }} {{- end }} {{- end }} {{- $setContainerHooks := 1 }} @@ -310,26 +291,21 @@ env: {{- with $container.env }} {{- range $i, $env := . }} {{- if eq $env.name "ACTIONS_RUNNER_CONTAINER_HOOKS" }} - {{- $setContainerHooks = 0 -}} + {{- $setContainerHooks = 0 }} {{- end }} {{- if eq $env.name "ACTIONS_RUNNER_POD_NAME" }} - {{- $setPodName = 0 -}} + {{- $setPodName = 0 }} {{- end }} {{- if eq $env.name "ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER" }} - {{- $setRequireJobContainer = 0 -}} + {{- $setRequireJobContainer = 0 }} {{- end }} {{- if eq $env.name "NODE_EXTRA_CA_CERTS" }} - {{- $setNodeExtraCaCerts = 0 -}} + {{- $setNodeExtraCaCerts = 0 }} {{- end }} {{- if eq $env.name "RUNNER_UPDATE_CA_CERTS" }} - {{- $setRunnerUpdateCaCerts = 0 -}} - {{- end }} - - name: {{ $env.name }} - {{- range $envKey, $envVal := $env }} - {{- if ne $envKey "name" }} - {{ $envKey }}: {{ $envVal | toYaml | nindent 8 }} - {{- end }} + {{- $setRunnerUpdateCaCerts = 0 }} {{- end }} + - {{ $env | toYaml | nindent 4 }} {{- end }} {{- end }} {{- if $setContainerHooks }} @@ -363,17 +339,12 @@ volumeMounts: {{- with $container.volumeMounts }} {{- range $i, $volMount := . }} {{- if eq $volMount.name "work" }} - {{- $mountWork = 0 -}} + {{- $mountWork = 0 }} {{- end }} {{- if eq $volMount.name "github-server-tls-cert" }} - {{- $mountGitHubServerTLS = 0 -}} - {{- end }} - - name: {{ $volMount.name }} - {{- range $mountKey, $mountVal := $volMount }} - {{- if ne $mountKey "name" }} - {{ $mountKey }}: {{ $mountVal | toYaml | nindent 8 }} - {{- end }} + {{- $mountGitHubServerTLS = 0 }} {{- end }} + - {{ $volMount | toYaml | nindent 4 }} {{- end }} {{- end }} {{- if $mountWork }} @@ -391,14 +362,14 @@ volumeMounts: {{- define "gha-runner-scale-set.default-mode-runner-containers" -}} {{- $tlsConfig := (default (dict) .Values.githubServerTLS) }} -{{- range $i, $container := .Values.template.spec.containers -}} -{{- if ne $container.name "runner" -}} +{{- range $i, $container := .Values.template.spec.containers }} +{{- if ne $container.name "runner" }} - {{ $container | toYaml | nindent 2 }} {{- else }} - name: {{ $container.name }} {{- range $key, $val := $container }} {{- if and (ne $key "env") (ne $key "volumeMounts") (ne $key "name") }} - {{ $key }}: {{ $val }} + {{ $key }}: {{ $val | toYaml | nindent 4 }} {{- end }} {{- end }} {{- $setNodeExtraCaCerts := 0 }} @@ -411,17 +382,12 @@ volumeMounts: {{- with $container.env }} {{- range $i, $env := . }} {{- if eq $env.name "NODE_EXTRA_CA_CERTS" }} - {{- $setNodeExtraCaCerts = 0 -}} + {{- $setNodeExtraCaCerts = 0 }} {{- end }} {{- if eq $env.name "RUNNER_UPDATE_CA_CERTS" }} - {{- $setRunnerUpdateCaCerts = 0 -}} - {{- end }} - - name: {{ $env.name }} - {{- range $envKey, $envVal := $env }} - {{- if ne $envKey "name" }} - {{ $envKey }}: {{ $envVal | toYaml | nindent 10 }} - {{- end }} + {{- $setRunnerUpdateCaCerts = 0 }} {{- end }} + - {{ $env | toYaml | nindent 6 }} {{- end }} {{- end }} {{- if $setNodeExtraCaCerts }} @@ -440,14 +406,9 @@ volumeMounts: {{- with $container.volumeMounts }} {{- range $i, $volMount := . }} {{- if eq $volMount.name "github-server-tls-cert" }} - {{- $mountGitHubServerTLS = 0 -}} - {{- end }} - - name: {{ $volMount.name }} - {{- range $mountKey, $mountVal := $volMount }} - {{- if ne $mountKey "name" }} - {{ $mountKey }}: {{ $mountVal | toYaml | nindent 10 }} - {{- end }} + {{- $mountGitHubServerTLS = 0 }} {{- end }} + - {{ $volMount | toYaml | nindent 6 }} {{- end }} {{- end }} {{- if $mountGitHubServerTLS }} diff --git a/charts/gha-runner-scale-set/templates/autoscalingrunnerset.yaml b/charts/gha-runner-scale-set/templates/autoscalingrunnerset.yaml index e974be48..e272291b 100644 --- a/charts/gha-runner-scale-set/templates/autoscalingrunnerset.yaml +++ b/charts/gha-runner-scale-set/templates/autoscalingrunnerset.yaml @@ -36,17 +36,21 @@ spec: {{- if .Values.proxy.http }} http: url: {{ .Values.proxy.http.url }} + {{- if .Values.proxy.http.credentialSecretRef }} credentialSecretRef: {{ .Values.proxy.http.credentialSecretRef }} - {{ end }} + {{- end }} + {{- end }} {{- if .Values.proxy.https }} https: url: {{ .Values.proxy.https.url }} + {{- if .Values.proxy.https.credentialSecretRef }} credentialSecretRef: {{ .Values.proxy.https.credentialSecretRef }} - {{ end }} + {{- end }} + {{- end }} {{- if and .Values.proxy.noProxy (kindIs "slice" .Values.proxy.noProxy) }} noProxy: {{ .Values.proxy.noProxy | toYaml | nindent 6}} - {{ end }} - {{ end }} + {{- end }} + {{- end }} {{- if and (or (kindIs "int64" .Values.minRunners) (kindIs "float64" .Values.minRunners)) (or (kindIs "int64" .Values.maxRunners) (kindIs "float64" .Values.maxRunners)) }} {{- if gt .Values.minRunners .Values.maxRunners }} diff --git a/charts/gha-runner-scale-set/tests/template_test.go b/charts/gha-runner-scale-set/tests/template_test.go index 24a08326..c5960ad3 100644 --- a/charts/gha-runner-scale-set/tests/template_test.go +++ b/charts/gha-runner-scale-set/tests/template_test.go @@ -1520,3 +1520,171 @@ func TestTemplate_CreateManagerRoleBinding(t *testing.T) { assert.Equal(t, "arc", managerRoleBinding.Subjects[0].Name) assert.Equal(t, "arc-system", managerRoleBinding.Subjects[0].Namespace) } + +func TestTemplateRenderedAutoScalingRunnerSet_ExtraContainers(t *testing.T) { + t.Parallel() + + // Path to the helm chart we will test + helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") + require.NoError(t, err) + + testValuesPath, err := filepath.Abs("../tests/values_extra_containers.yaml") + require.NoError(t, err) + + releaseName := "test-runners" + namespaceName := "test-" + strings.ToLower(random.UniqueId()) + + options := &helm.Options{ + SetValues: map[string]string{ + "controllerServiceAccount.name": "arc", + "controllerServiceAccount.namespace": "arc-system", + }, + ValuesFiles: []string{testValuesPath}, + KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), + } + + output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/autoscalingrunnerset.yaml"}, "--debug") + + var ars v1alpha1.AutoscalingRunnerSet + helm.UnmarshalK8SYaml(t, output, &ars) + + assert.Len(t, ars.Spec.Template.Spec.Containers, 2, "There should be 2 containers") + assert.Equal(t, "runner", ars.Spec.Template.Spec.Containers[0].Name, "Container name should be runner") + assert.Equal(t, "other", ars.Spec.Template.Spec.Containers[1].Name, "Container name should be other") + assert.Equal(t, "250m", ars.Spec.Template.Spec.Containers[0].Resources.Limits.Cpu().String(), "CPU Limit should be set") + assert.Equal(t, "64Mi", ars.Spec.Template.Spec.Containers[0].Resources.Limits.Memory().String(), "Memory Limit should be set") + assert.Equal(t, "250m", ars.Spec.Template.Spec.Containers[1].Resources.Limits.Cpu().String(), "CPU Limit should be set") + assert.Equal(t, "64Mi", ars.Spec.Template.Spec.Containers[1].Resources.Limits.Memory().String(), "Memory Limit should be set") + assert.Equal(t, "SOME_ENV", ars.Spec.Template.Spec.Containers[0].Env[0].Name, "SOME_ENV should be set") + assert.Equal(t, "SOME_VALUE", ars.Spec.Template.Spec.Containers[0].Env[0].Value, "SOME_ENV should be set to `SOME_VALUE`") + assert.Equal(t, "MY_NODE_NAME", ars.Spec.Template.Spec.Containers[0].Env[1].Name, "MY_NODE_NAME should be set") + assert.Equal(t, "spec.nodeName", ars.Spec.Template.Spec.Containers[0].Env[1].ValueFrom.FieldRef.FieldPath, "MY_NODE_NAME should be set to `spec.nodeName`") + assert.Equal(t, "work", ars.Spec.Template.Spec.Containers[0].VolumeMounts[0].Name, "VolumeMount name should be work") + assert.Equal(t, "/work", ars.Spec.Template.Spec.Containers[0].VolumeMounts[0].MountPath, "VolumeMount mountPath should be /work") + assert.Equal(t, "others", ars.Spec.Template.Spec.Containers[0].VolumeMounts[1].Name, "VolumeMount name should be others") + assert.Equal(t, "/others", ars.Spec.Template.Spec.Containers[0].VolumeMounts[1].MountPath, "VolumeMount mountPath should be /others") + assert.Equal(t, "work", ars.Spec.Template.Spec.Volumes[0].Name, "Volume name should be work") + assert.Equal(t, corev1.DNSNone, ars.Spec.Template.Spec.DNSPolicy, "DNS Policy should be None") + assert.Equal(t, "192.0.2.1", ars.Spec.Template.Spec.DNSConfig.Nameservers[0], "DNS Nameserver should be set") +} + +func TestTemplateRenderedAutoScalingRunnerSet_ExtraPodSpec(t *testing.T) { + t.Parallel() + + // Path to the helm chart we will test + helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") + require.NoError(t, err) + + testValuesPath, err := filepath.Abs("../tests/values_extra_pod_spec.yaml") + require.NoError(t, err) + + releaseName := "test-runners" + namespaceName := "test-" + strings.ToLower(random.UniqueId()) + + options := &helm.Options{ + SetValues: map[string]string{ + "controllerServiceAccount.name": "arc", + "controllerServiceAccount.namespace": "arc-system", + }, + ValuesFiles: []string{testValuesPath}, + KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), + } + + output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/autoscalingrunnerset.yaml"}) + + var ars v1alpha1.AutoscalingRunnerSet + helm.UnmarshalK8SYaml(t, output, &ars) + + assert.Len(t, ars.Spec.Template.Spec.Containers, 1, "There should be 1 containers") + assert.Equal(t, "runner", ars.Spec.Template.Spec.Containers[0].Name, "Container name should be runner") + assert.Equal(t, corev1.DNSNone, ars.Spec.Template.Spec.DNSPolicy, "DNS Policy should be None") + assert.Equal(t, "192.0.2.1", ars.Spec.Template.Spec.DNSConfig.Nameservers[0], "DNS Nameserver should be set") +} + +func TestTemplateRenderedAutoScalingRunnerSet_DinDMergePodSpec(t *testing.T) { + t.Parallel() + + // Path to the helm chart we will test + helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") + require.NoError(t, err) + + testValuesPath, err := filepath.Abs("../tests/values_dind_merge_spec.yaml") + require.NoError(t, err) + + releaseName := "test-runners" + namespaceName := "test-" + strings.ToLower(random.UniqueId()) + + options := &helm.Options{ + SetValues: map[string]string{ + "controllerServiceAccount.name": "arc", + "controllerServiceAccount.namespace": "arc-system", + }, + ValuesFiles: []string{testValuesPath}, + KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), + } + + output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/autoscalingrunnerset.yaml"}, "--debug") + + var ars v1alpha1.AutoscalingRunnerSet + helm.UnmarshalK8SYaml(t, output, &ars) + + assert.Len(t, ars.Spec.Template.Spec.Containers, 2, "There should be 2 containers") + assert.Equal(t, "runner", ars.Spec.Template.Spec.Containers[0].Name, "Container name should be runner") + assert.Equal(t, "250m", ars.Spec.Template.Spec.Containers[0].Resources.Limits.Cpu().String(), "CPU Limit should be set") + assert.Equal(t, "64Mi", ars.Spec.Template.Spec.Containers[0].Resources.Limits.Memory().String(), "Memory Limit should be set") + assert.Equal(t, "DOCKER_HOST", ars.Spec.Template.Spec.Containers[0].Env[0].Name, "DOCKER_HOST should be set") + assert.Equal(t, "tcp://localhost:9999", ars.Spec.Template.Spec.Containers[0].Env[0].Value, "DOCKER_HOST should be set to `tcp://localhost:9999`") + assert.Equal(t, "MY_NODE_NAME", ars.Spec.Template.Spec.Containers[0].Env[1].Name, "MY_NODE_NAME should be set") + assert.Equal(t, "spec.nodeName", ars.Spec.Template.Spec.Containers[0].Env[1].ValueFrom.FieldRef.FieldPath, "MY_NODE_NAME should be set to `spec.nodeName`") + assert.Equal(t, "DOCKER_TLS_VERIFY", ars.Spec.Template.Spec.Containers[0].Env[2].Name, "DOCKER_TLS_VERIFY should be set") + assert.Equal(t, "1", ars.Spec.Template.Spec.Containers[0].Env[2].Value, "DOCKER_TLS_VERIFY should be set to `1`") + assert.Equal(t, "DOCKER_CERT_PATH", ars.Spec.Template.Spec.Containers[0].Env[3].Name, "DOCKER_CERT_PATH should be set") + assert.Equal(t, "/certs/client", ars.Spec.Template.Spec.Containers[0].Env[3].Value, "DOCKER_CERT_PATH should be set to `/certs/client`") + assert.Equal(t, "work", ars.Spec.Template.Spec.Containers[0].VolumeMounts[0].Name, "VolumeMount name should be work") + assert.Equal(t, "/work", ars.Spec.Template.Spec.Containers[0].VolumeMounts[0].MountPath, "VolumeMount mountPath should be /work") + assert.Equal(t, "others", ars.Spec.Template.Spec.Containers[0].VolumeMounts[1].Name, "VolumeMount name should be others") + assert.Equal(t, "/others", ars.Spec.Template.Spec.Containers[0].VolumeMounts[1].MountPath, "VolumeMount mountPath should be /others") +} + +func TestTemplateRenderedAutoScalingRunnerSet_KubeModeMergePodSpec(t *testing.T) { + t.Parallel() + + // Path to the helm chart we will test + helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") + require.NoError(t, err) + + testValuesPath, err := filepath.Abs("../tests/values_k8s_merge_spec.yaml") + require.NoError(t, err) + + releaseName := "test-runners" + namespaceName := "test-" + strings.ToLower(random.UniqueId()) + + options := &helm.Options{ + SetValues: map[string]string{ + "controllerServiceAccount.name": "arc", + "controllerServiceAccount.namespace": "arc-system", + }, + ValuesFiles: []string{testValuesPath}, + KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), + } + + output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/autoscalingrunnerset.yaml"}, "--debug") + + var ars v1alpha1.AutoscalingRunnerSet + helm.UnmarshalK8SYaml(t, output, &ars) + + assert.Len(t, ars.Spec.Template.Spec.Containers, 1, "There should be 1 containers") + assert.Equal(t, "runner", ars.Spec.Template.Spec.Containers[0].Name, "Container name should be runner") + assert.Equal(t, "250m", ars.Spec.Template.Spec.Containers[0].Resources.Limits.Cpu().String(), "CPU Limit should be set") + assert.Equal(t, "64Mi", ars.Spec.Template.Spec.Containers[0].Resources.Limits.Memory().String(), "Memory Limit should be set") + assert.Equal(t, "ACTIONS_RUNNER_CONTAINER_HOOKS", ars.Spec.Template.Spec.Containers[0].Env[0].Name, "ACTIONS_RUNNER_CONTAINER_HOOKS should be set") + assert.Equal(t, "/k8s/index.js", ars.Spec.Template.Spec.Containers[0].Env[0].Value, "ACTIONS_RUNNER_CONTAINER_HOOKS should be set to `/k8s/index.js`") + assert.Equal(t, "MY_NODE_NAME", ars.Spec.Template.Spec.Containers[0].Env[1].Name, "MY_NODE_NAME should be set") + assert.Equal(t, "spec.nodeName", ars.Spec.Template.Spec.Containers[0].Env[1].ValueFrom.FieldRef.FieldPath, "MY_NODE_NAME should be set to `spec.nodeName`") + assert.Equal(t, "ACTIONS_RUNNER_POD_NAME", ars.Spec.Template.Spec.Containers[0].Env[2].Name, "ACTIONS_RUNNER_POD_NAME should be set") + assert.Equal(t, "ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER", ars.Spec.Template.Spec.Containers[0].Env[3].Name, "ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER should be set") + assert.Equal(t, "work", ars.Spec.Template.Spec.Containers[0].VolumeMounts[0].Name, "VolumeMount name should be work") + assert.Equal(t, "/work", ars.Spec.Template.Spec.Containers[0].VolumeMounts[0].MountPath, "VolumeMount mountPath should be /work") + assert.Equal(t, "others", ars.Spec.Template.Spec.Containers[0].VolumeMounts[1].Name, "VolumeMount name should be others") + assert.Equal(t, "/others", ars.Spec.Template.Spec.Containers[0].VolumeMounts[1].MountPath, "VolumeMount mountPath should be /others") +} diff --git a/charts/gha-runner-scale-set/tests/values_dind_merge_spec.yaml b/charts/gha-runner-scale-set/tests/values_dind_merge_spec.yaml new file mode 100644 index 00000000..21b9a56b --- /dev/null +++ b/charts/gha-runner-scale-set/tests/values_dind_merge_spec.yaml @@ -0,0 +1,31 @@ +githubConfigUrl: https://github.com/actions/actions-runner-controller +githubConfigSecret: + github_token: test +template: + spec: + containers: + - name: runner + image: runner-image:latest + env: + - name: DOCKER_HOST + value: tcp://localhost:9999 + - name: MY_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: work + mountPath: /work + - name: others + mountPath: /others + resources: + limits: + memory: "64Mi" + cpu: "250m" + volumes: + - name: work + hostPath: + path: /data + type: Directory +containerMode: + type: dind \ No newline at end of file diff --git a/charts/gha-runner-scale-set/tests/values_extra_containers.yaml b/charts/gha-runner-scale-set/tests/values_extra_containers.yaml new file mode 100644 index 00000000..61c72fe6 --- /dev/null +++ b/charts/gha-runner-scale-set/tests/values_extra_containers.yaml @@ -0,0 +1,46 @@ +githubConfigUrl: https://github.com/actions/actions-runner-controller +githubConfigSecret: + github_token: test +template: + spec: + containers: + - name: runner + image: runner-image:latest + env: + - name: SOME_ENV + value: SOME_VALUE + - name: MY_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: work + mountPath: /work + - name: others + mountPath: /others + resources: + limits: + memory: "64Mi" + cpu: "250m" + - name: other + image: other-image:latest + volumeMounts: + - name: work + mountPath: /work + - name: others + mountPath: /others + resources: + limits: + memory: "64Mi" + cpu: "250m" + volumes: + - name: work + hostPath: + path: /data + type: Directory + dnsPolicy: "None" + dnsConfig: + nameservers: + - 192.0.2.1 +containerMode: + type: none \ No newline at end of file diff --git a/charts/gha-runner-scale-set/tests/values_extra_pod_spec.yaml b/charts/gha-runner-scale-set/tests/values_extra_pod_spec.yaml new file mode 100644 index 00000000..39ac799c --- /dev/null +++ b/charts/gha-runner-scale-set/tests/values_extra_pod_spec.yaml @@ -0,0 +1,12 @@ +githubConfigUrl: https://github.com/actions/actions-runner-controller +githubConfigSecret: + github_token: test +template: + spec: + containers: + - name: runner + image: runner-image:latest + dnsPolicy: "None" + dnsConfig: + nameservers: + - 192.0.2.1 \ No newline at end of file diff --git a/charts/gha-runner-scale-set/tests/values_k8s_merge_spec.yaml b/charts/gha-runner-scale-set/tests/values_k8s_merge_spec.yaml new file mode 100644 index 00000000..c62cf0e5 --- /dev/null +++ b/charts/gha-runner-scale-set/tests/values_k8s_merge_spec.yaml @@ -0,0 +1,31 @@ +githubConfigUrl: https://github.com/actions/actions-runner-controller +githubConfigSecret: + github_token: test +template: + spec: + containers: + - name: runner + image: runner-image:latest + env: + - name: ACTIONS_RUNNER_CONTAINER_HOOKS + value: /k8s/index.js + - name: MY_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: work + mountPath: /work + - name: others + mountPath: /others + resources: + limits: + memory: "64Mi" + cpu: "250m" + volumes: + - name: work + hostPath: + path: /data + type: Directory +containerMode: + type: kubernetes \ No newline at end of file