Files
devops-infra-helm-charts-gcp/helm-templates/jenkins-grn/unittests/jenkins-controller-statefulset-test.yaml
T
2026-08-26 03:39:42 +05:30

829 lines
26 KiB
YAML

suite: Jenkins Controller
release:
name: my-release
namespace: my-namespace
templates:
- jenkins-controller-statefulset.yaml
- config.yaml
- config-init-scripts.yaml
- auto-reload-config.yaml
tests:
- it: default values
template: jenkins-controller-statefulset.yaml
asserts:
- isKind:
of: StatefulSet
- equal:
path: apiVersion
value: apps/v1beta1
- equal:
path: metadata.name
value: my-release-jenkins
- equal:
path: metadata.namespace
value: my-namespace
- matchRegex:
path: metadata.labels["helm.sh/chart"]
pattern: ^jenkins-
- isNull:
path: metadata.annotations
- equal:
path: spec.replicas
value: 1
- equal:
path: spec.selector
value:
matchLabels:
app.kubernetes.io/component: jenkins-controller
app.kubernetes.io/instance: my-release
- matchSnapshot:
path: spec
- it: test different values
template: jenkins-controller-statefulset.yaml
capabilities:
apiVersions:
- scheduling.k8s.io/v1beta1
set:
controller:
statefulSetAnnotations:
my-annotation: value
schedulerName: my-scheduler
nodeSelector:
nodeLabel: value
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
affinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app.kubernetes.io/component: jenkins-controller
terminationGracePeriodSeconds: 120
priorityClassName: important
runAsUser: 2000
fsGroup: 4000
securityContextCapabilities:
drop:
- NET_RAW
hostNetworking: true
terminationMessagePath: /tmp/termination-log-diff
terminationMessagePolicy: FallbackToLogsOnError
hostAliases:
- ip: 192.168.50.50
hostnames:
- something.local
updateStrategy:
type: OnDelete
serviceAccount.name: my-serviceaccount
asserts:
- equal:
path: metadata.annotations
value:
my-annotation: value
- equal:
path: spec.template.spec.schedulerName
value: my-scheduler
- equal:
path: spec.template.spec.nodeSelector
value:
nodeLabel: value
- equal:
path: spec.template.spec.tolerations
value:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
- equal:
path: spec.template.spec.affinity
value:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone
- equal:
path: spec.template.spec.topologySpreadConstraints
value:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app.kubernetes.io/component: jenkins-controller
- equal:
path: spec.template.spec.terminationGracePeriodSeconds
value: 120
- equal:
path: spec.template.spec.priorityClassName
value: important
- equal:
path: spec.template.spec.securityContext
value:
runAsUser: 2000
fsGroup: 4000
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
- equal:
path: spec.template.spec.serviceAccountName
value: my-serviceaccount
- equal:
path: spec.template.spec.hostNetwork
value: true
- equal:
path: spec.template.spec.containers[0].terminationMessagePath
value: /tmp/termination-log-diff
- equal:
path: spec.template.spec.containers[0].terminationMessagePolicy
value: FallbackToLogsOnError
- equal:
path: spec.template.spec.dnsPolicy
value: ClusterFirstWithHostNet
- equal:
path: spec.template.spec.hostAliases
value:
- ip: 192.168.50.50
hostnames:
- something.local
- equal:
path: spec.updateStrategy.type
value: OnDelete
- it: configure image tag
template: jenkins-controller-statefulset.yaml
set:
controller.image.tag: slim
controller.image.pullPolicy: IfNotPresent
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: docker.io/jenkins/jenkins:slim
- equal:
path: spec.template.spec.containers[0].imagePullPolicy
value: IfNotPresent
- it: configure image tag label
template: jenkins-controller-statefulset.yaml
set:
controller.image.tagLabel: alpine
asserts:
- matchSnapshot:
path: spec.template.spec.containers[0].image
- it: configure empty image tag label
template: jenkins-controller-statefulset.yaml
set:
controller.image.tagLabel:
asserts:
- matchSnapshot:
path: spec.template.spec.containers[0].image
- it: custom image
template: jenkins-controller-statefulset.yaml
set:
controller:
image:
repository: registry/image
tag: my-tag
javaOpts: -Dio.jenkins.plugins.kubernetes.disableNoDelayProvisioning=true
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: docker.io/registry/image:my-tag
- contains:
path: spec.template.spec.containers[0].env
content:
name: JAVA_OPTS
value: >-
-Dcasc.reload.token=$(POD_NAME) -Dio.jenkins.plugins.kubernetes.disableNoDelayProvisioning=true
- it: disable helm.sh label
template: jenkins-controller-statefulset.yaml
set:
renderHelmLabels: false
asserts:
- equal:
path: metadata.labels
value:
app.kubernetes.io/component: jenkins-controller
app.kubernetes.io/instance: my-release
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: jenkins
- it: java & jenkins opts with quotes
template: jenkins-controller-statefulset.yaml
set:
controller:
javaOpts: >-
-Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self';"
jenkinsOpts: >-
-Dtest="custom: 'true'"
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: JAVA_OPTS
value: >-
-Dcasc.reload.token=$(POD_NAME) -Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self';"
- contains:
path: spec.template.spec.containers[0].env
content:
name: JENKINS_OPTS
value: >-
--webroot=/var/jenkins_cache/war -Dtest="custom: 'true'"
- it: test empty controller.podSecurityContextOverride
template: jenkins-controller-statefulset.yaml
set:
controller:
podSecurityContextOverride: {}
asserts:
- equal:
path: spec.template.spec.securityContext
value: {}
- it: test controller.podSecurityContextOverride
template: jenkins-controller-statefulset.yaml
set:
controller:
podSecurityContextOverride: &expected
runAsNonRoot: true
runAsUser: 4444
supplementalGroups: [5555]
asserts:
- equal:
path: spec.template.spec.securityContext
value: *expected
- it: test controller.sidecars.additionalSidecarContainers
template: jenkins-controller-statefulset.yaml
set:
controller:
sidecars:
additionalSidecarContainers:
- name: otel-collector
image: opentelemetry-collector:0.93.0
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
asserts:
- equal:
path: spec.template.spec.containers[2]
value:
name: otel-collector
image: opentelemetry-collector:0.93.0
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
- it: test controller.sidecars.configAutoReload.logging.configuration.override (Part 1)
template: jenkins-controller-statefulset.yaml
set:
controller.sidecars.configAutoReload.enabled: true
controller.sidecars.configAutoReload.logging.configuration.override: true
asserts:
- equal:
path: spec.template.spec.volumes[0]
value:
name: auto-reload-config
configMap:
name: my-release-jenkins-auto-reload-config
- equal:
path: spec.template.spec.initContainers[0].env[5]
value:
name: LOG_CONFIG
value: /var/jenkins_home/auto-reload/auto-reload-config.yaml
- equal:
path: spec.template.spec.containers[1].env[7]
value:
name: LOG_CONFIG
value: /var/jenkins_home/auto-reload/auto-reload-config.yaml
- it: test controller.sidecars.configAutoReload.logging.configuration.override (Part 2)
template: auto-reload-config.yaml
set:
controller.sidecars.configAutoReload.enabled: true
controller.sidecars.configAutoReload.logging.configuration.override: true
asserts:
- isKind:
of: ConfigMap
- it: test 2 additional secrets
template: jenkins-controller-statefulset.yaml
set:
controller.additionalSecrets:
- name: something
value: secret
- name: anotherthing
value: anothersecret
asserts:
- equal:
path: spec.template.spec.containers[0].volumeMounts[4]
value:
mountPath: /run/secrets/additional
name: jenkins-secrets
readOnly: true
- equal:
path: spec.template.spec.volumes[3]
value:
name: jenkins-secrets
projected:
sources:
- secret:
name: my-release-jenkins-additional-secrets
- secret:
name: my-release-jenkins
items:
- key: jenkins-admin-user
path: chart-admin-username
- key: jenkins-admin-password
path: chart-admin-password
- it: test existing secret without additionalExistingSecrets
template: jenkins-controller-statefulset.yaml
set:
controller.existingSecret: my-exisiting-credentials
asserts:
- equal:
path: spec.template.spec.containers[0].volumeMounts[4]
value:
mountPath: /run/secrets/additional
name: jenkins-secrets
readOnly: true
- equal:
path: spec.template.spec.volumes[3]
value:
name: jenkins-secrets
projected:
sources:
- secret:
name: my-release-jenkins
items:
- key: jenkins-admin-user
path: chart-admin-username
- key: jenkins-admin-password
path: chart-admin-password
- secret:
name: my-exisiting-credentials
- it: test existing secret with additionalExistingSecrets
template: jenkins-controller-statefulset.yaml
set:
controller.existingSecret: my-exisiting-credentials
controller.additionalExistingSecrets:
- name: my-exisiting-credentials
keyName: github-username
- name: my-exisiting-credentials
keyName: github-password
asserts:
- equal:
path: spec.template.spec.containers[0].volumeMounts[4]
value:
mountPath: /run/secrets/additional
name: jenkins-secrets
readOnly: true
- equal:
path: spec.template.spec.volumes[3]
value:
name: jenkins-secrets
projected:
sources:
- secret:
items:
- key: github-username
path: my-exisiting-credentials-github-username
name: my-exisiting-credentials
- secret:
items:
- key: github-password
path: my-exisiting-credentials-github-password
name: my-exisiting-credentials
- secret:
name: my-release-jenkins
items:
- key: jenkins-admin-user
path: chart-admin-username
- key: jenkins-admin-password
path: chart-admin-password
- secret:
name: my-exisiting-credentials
- it: test templated environment variables
template: jenkins-controller-statefulset.yaml
set:
testValue: some-value
controller.initContainerEnv:
- name: "TEST_ENV_VAR_INIT"
value: "test-env-var-init"
- name: "TEST_ENV_VAR_INIT_TEMPLATED"
value: "{{ .Values.testValue }}"
controller.sidecars.configAutoReload.env:
- name: "TEST_ENV_VAR_CONFIG"
value: "test-env-var-config"
- name: "TEST_ENV_VAR_CONFIG_TEMPLATED"
value: "{{ .Values.testValue }}"
controller.containerEnv:
- name: "TEST_ENV_VAR_CONTAINER"
value: "test-env-var-container"
- name: "TEST_ENV_VAR__CONTAINER_TEMPLATED"
value: "{{ .Values.testValue }}"
controller.initContainerEnvFrom:
- configMapRef:
name: special-config
controller.sidecars.configAutoReload.envFrom:
- configMapRef:
name: special-config-auto-reload
controller.containerEnvFrom:
- configMapRef:
name: special-config
asserts:
- contains:
path: spec.template.spec.initContainers[0].env
content:
name: "TEST_ENV_VAR_CONFIG"
value: "test-env-var-config"
- contains:
path: spec.template.spec.initContainers[0].env
content:
name: "TEST_ENV_VAR_CONFIG_TEMPLATED"
value: "some-value"
- contains:
path: spec.template.spec.initContainers[1].env
content:
name: "TEST_ENV_VAR_INIT"
value: "test-env-var-init"
- contains:
path: spec.template.spec.initContainers[1].env
content:
name: "TEST_ENV_VAR_INIT_TEMPLATED"
value: "some-value"
- contains:
path: spec.template.spec.containers[1].env
content:
name: "TEST_ENV_VAR_CONFIG"
value: "test-env-var-config"
- contains:
path: spec.template.spec.containers[1].env
content:
name: "TEST_ENV_VAR_CONFIG_TEMPLATED"
value: "some-value"
- contains:
path: spec.template.spec.containers[0].env
content:
name: "TEST_ENV_VAR_CONTAINER"
value: "test-env-var-container"
- contains:
path: spec.template.spec.containers[0].env
content:
name: "TEST_ENV_VAR__CONTAINER_TEMPLATED"
value: "some-value"
- contains:
path: spec.template.spec.initContainers[0].envFrom
content:
configMapRef:
name: special-config-auto-reload
- contains:
path: spec.template.spec.initContainers[1].envFrom
content:
configMapRef:
name: special-config
- contains:
path: spec.template.spec.containers[0].envFrom
content:
configMapRef:
name: special-config
- contains:
path: spec.template.spec.containers[1].envFrom
content:
configMapRef:
name: special-config-auto-reload
- it: test sleep time for config-reload
template: jenkins-controller-statefulset.yaml
set:
controller.sidecars.configAutoReload.sleepTime: 60
asserts:
- contains:
# METHOD remains LIST on the config-reload init container
path: spec.template.spec.initContainers[0].env
content:
name: "METHOD"
value: "LIST"
- contains:
path: spec.template.spec.containers[1].env
content:
name: "METHOD"
value: "SLEEP"
- contains:
path: spec.template.spec.containers[1].env
content:
name: "SLEEP_TIME"
value: "60"
- it: test METHOD env var for config-reload
template: jenkins-controller-statefulset.yaml
set:
controller.sidecars.configAutoReload.env:
- name: "METHOD"
value: "SLEEP"
asserts:
- contains:
# METHOD remains LIST on the config-reload init container
path: spec.template.spec.initContainers[0].env
content:
name: "METHOD"
value: "LIST"
- notContains:
# only one METHOD on the config-reload init container
path: spec.template.spec.initContainers[0].env
content:
name: "METHOD"
value: "SLEEP"
- contains:
path: spec.template.spec.containers[1].env
content:
name: "METHOD"
value: "SLEEP"
- it: test scheme for config-reload
template: jenkins-controller-statefulset.yaml
set:
controller.sidecars.configAutoReload.scheme: "https"
asserts:
- matchSnapshot:
path: spec
- it: test skip tls verify for config-reload
template: jenkins-controller-statefulset.yaml
set:
controller.sidecars.configAutoReload.skipTlsVerify: true
asserts:
- contains:
path: spec.template.spec.containers[1].env
content:
name: "REQ_SKIP_TLS_VERIFY"
value: "true"
- it: overrides container args
template: jenkins-controller-statefulset.yaml
set:
controller.overrideArgs:
- --httpPort=8080
- --requestHeaderSize=32768
asserts:
- equal:
path: spec.template.spec.containers[0].args
value:
- --httpPort=8080
- --requestHeaderSize=32768
- it: allows templating in container args overrides
template: jenkins-controller-statefulset.yaml
set:
controller.overrideArgs:
- --httpPort={{.Values.controller.targetPort}}
- --requestHeaderSize=32768
asserts:
- equal:
path: spec.template.spec.containers[0].args
value:
- --httpPort=8080
- --requestHeaderSize=32768
- it: render pod annotations
template: jenkins-controller-statefulset.yaml
set:
controller:
podAnnotations:
templated-annotations: "{{ .Release.Name }}"
fixed-annotation: some-fixed-annotation
asserts:
- matchSnapshot:
path: spec.template.metadata.annotations
- it: test true shareProcessNamespace
template: jenkins-controller-statefulset.yaml
set:
controller:
shareProcessNamespace: true
asserts:
- equal:
path: spec.template.spec.shareProcessNamespace
value: true
- it: test false shareProcessNamespace
template: jenkins-controller-statefulset.yaml
set:
controller:
shareProcessNamespace: false
asserts:
- isNull:
path: spec.template.spec.shareProcessNamespace
- it: test false enableServiceLinks
template: jenkins-controller-statefulset.yaml
set:
controller:
enableServiceLinks: false
asserts:
- equal:
path: spec.template.spec.enableServiceLinks
value: false
- it: test true enableServiceLinks
template: jenkins-controller-statefulset.yaml
set:
controller:
enableServiceLinks: true
asserts:
- isNull:
path: spec.template.spec.enableServiceLinks
- it: test disableSecretMount
template: jenkins-controller-statefulset.yaml
set:
controller:
httpsKeyStore:
enable: true
disableSecretMount: true
password: some-secret-password
path: /some/path
jenkinsHttpsJksSecretName: some-secret-name
fileName: some-file-name
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: "JENKINS_HTTPS_KEYSTORE_PASSWORD"
value: some-secret-password
- notContains:
path: spec.template.spec.containers[0].volumeMounts
content:
mountPath: /some/path
name: jenkins-https-keystore
- notContains:
path: spec.template.spec.initContainers[1].volumeMounts
content:
mountPath: /some/path
name: jenkins-https-keystore
- notContains:
path: spec.template.spec.volumes
content:
name: jenkins-https-keystore
secret:
secretName: some-secret-name
items:
- key: jenkins-jks-file
path: some-file-name
- it: test not disableSecretMount
template: jenkins-controller-statefulset.yaml
set:
controller:
httpsKeyStore:
enable: true
disableSecretMount: false
jenkinsHttpsJksSecretName: some-secret-name
path: /some/path
fileName: some-file-name
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: "JENKINS_HTTPS_KEYSTORE_PASSWORD"
valueFrom:
secretKeyRef:
name: some-secret-name
key: "https-jks-password"
- contains:
path: spec.template.spec.containers[0].volumeMounts
content:
mountPath: /some/path
name: jenkins-https-keystore
- contains:
path: spec.template.spec.initContainers[1].volumeMounts
content:
mountPath: /some/path
name: jenkins-https-keystore
- contains:
path: spec.template.spec.volumes
content:
name: jenkins-https-keystore
secret:
secretName: some-secret-name
items:
- key: jenkins-jks-file
path: some-file-name
- it: test override with jenkinsHttpsJksPasswordSecretName and jenkinsHttpsJksPasswordSecretKey
template: jenkins-controller-statefulset.yaml
set:
controller:
httpsKeyStore:
enable: true
disableSecretMount: false
jenkinsHttpsJksPasswordSecretName: "some-jks-name"
jenkinsHttpsJksPasswordSecretKey: "some-jks-password"
jenkinsHttpsJksSecretName: some-secret-name
path: /some/path
fileName: some-file-name
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: "JENKINS_HTTPS_KEYSTORE_PASSWORD"
valueFrom:
secretKeyRef:
name: "some-jks-name"
key: "some-jks-password"
- it: test jenkinsHttpsJksSecretKey override
template: jenkins-controller-statefulset.yaml
set:
controller:
httpsKeyStore:
enable: true
disableSecretMount: false
jenkinsHttpsJksSecretName: some-secret-name
path: /some/path
fileName: some-file-name
jenkinsHttpsJksSecretKey: "some.jks"
asserts:
- contains:
path: spec.template.spec.volumes
content:
name: jenkins-https-keystore
secret:
secretName: some-secret-name
items:
- key: "some.jks"
path: some-file-name
- it:
template: jenkins-controller-statefulset.yaml
set:
controller:
installPlugins: false
asserts:
- notContains:
path: spec.template.spec.volumes
content:
name: plugins
emptyDir: {}
- notContains:
path: spec.template.spec.initContainers[1].volumeMounts
content:
name: plugins
- it:
template: jenkins-controller-statefulset.yaml
set:
controller:
JCasC:
configUrls:
- https://acme.org/jenkins.yaml
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: "CASC_JENKINS_CONFIG"
value: "/var/jenkins_home/casc_configs,https://acme.org/jenkins.yaml"
- it:
template: jenkins-controller-statefulset.yaml
set:
controller:
JCasC:
configUrls:
- https://acme.org/jenkins.yaml
- https://foobar.org/jenkins.yaml
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: "CASC_JENKINS_CONFIG"
value: "/var/jenkins_home/casc_configs,https://acme.org/jenkins.yaml,https://foobar.org/jenkins.yaml"
- it:
template: jenkins-controller-statefulset.yaml
set:
controller:
JCasC:
configUrls: []
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: "CASC_JENKINS_CONFIG"
value: "/var/jenkins_home/casc_configs"
- it: test checksum for config-init-script
template: jenkins-controller-statefulset.yaml
set:
controller:
initScripts:
test: |-
This is a test script
asserts:
- isSubset:
path: spec.template.metadata.annotations
content:
checksum/config-init-scripts: 2ee2c03a600a50a55cf62cbed3f1d558d5322eda7544b4047beeb4df66e8ec11