Validate Helm Charts / Install-test ${{ fromJSON(needs.detect-changed-charts.outputs.install-charts) }} (pull_request) Successful in 3m11s
Publish Helm Chart with patched Application Version / publish-helm-chart (push) Successful in 6s
Publish Calibre Web Automated Helm Chart / Publish Calibre Web Automated Helm Chart (push) Successful in 7s
Publish Helm Chart with patched Application Version / publish-helm-chart (push) Successful in 6s
Publish Minecraft-Server Helm Chart / Publish Minecraft-Server Helm Chart (push) Successful in 6s
Publish Helm Chart with patched Application Version / publish-helm-chart (push) Successful in 6s
Publish SearXNG Helm Chart / Publish SearXNG Helm Chart (push) Successful in 6s
Publish Helm Chart with patched Application Version / publish-helm-chart (push) Successful in 6s
Publish Urlaubsverwaltung Helm Chart / Publish Urlaubsverwaltung Helm Chart (push) Successful in 7s
Validate Helm Charts / Detect changed charts (pull_request) Successful in 3s
Validate Helm Charts / Resource quantities (pull_request) Successful in 8s
Validate Helm Charts / Build ${{ fromJSON(needs.detect-changed-charts.outputs.charts) }} (pull_request) Successful in 6s
Validate Helm Charts / Trivy config ${{ fromJSON(needs.detect-changed-charts.outputs.scan-charts) }} (pull_request) Successful in 19s
calibre-web-automated 7.0.0, minecraft-server 6.0.0 and urlaubsverwaltung
10.0.0 each majors: an installation that renders today with an empty itemPath
stops rendering. searxng 1.0.6 is documentation only - its valkey reference is
correctly optional and stays gated by {{- if }}.
Every message names the values path. values.yaml now says per key why it is
required, reusing the wording the charts' NOTES.txt already carry. The
hand-rolled "cwaSecretRef IS UNSET" block in calibre-web-automated's NOTES.txt
is gone: after the guard the render aborts first and that block is
unreachable. minecraft-server's note stays true and now points at the guard.
No "required" array in the schemas, and README guideline 12 now says why. The
plan called for one; measuring it showed it could never fire: the key ships as
null, so it is present at validation time, and JSON Schema's required tests
presence, not null-ness. Making it fire means either dropping the null default
or narrowing the type to "string", and both turn helm lint --strict red on the
chart's own defaults. The schema therefore describes the key as required and
required() enforces it. The README bullet on how null reaches the schema was
also wrong in the case it was being applied to - a null chart default is not
coalesced away - and now distinguishes the three cases.
searxng: the claim "charts in this repo have no dependencies (README,
guideline 13)" in the valkey template, in values.yaml and twice in _helpers.tpl
has been false since #214 and cited the wrong guideline; dependencies are
admissible and are guideline 14. The same sentence survives in other charts'
helpers and needs its own round.
136 lines
5.9 KiB
YAML
136 lines
5.9 KiB
YAML
# Scale the whole chart down without uninstalling it: scaleDown: true renders
|
|
# every Deployment/StatefulSet with replicas: 0 (and suspends CronJobs) and
|
|
# takes precedence over any per-workload replicas value. PVCs, Secrets and
|
|
# Services stay in place; scaleDown: false brings the workloads back up.
|
|
scaleDown: false
|
|
|
|
secrets:
|
|
# REQUIRED - op:// item path carrying "jdbc-url", "username" and "password".
|
|
# This chart deploys NO database; all state lives in the external one, and
|
|
# three datasource environment variables read these keys unconditionally.
|
|
# Without the value the render aborts - required() in
|
|
# urlaubsverwaltung-db.secret.yaml is the whole enforcement, and
|
|
# values.schema.json cannot help here (README, guideline 12).
|
|
databaseSecretRef: null
|
|
# REQUIRED - op:// item path carrying "client-id", "client-secret",
|
|
# "issuer-name", "issuer-uri", "jwt-issuer-uri" and "redirect-uri". This chart
|
|
# offers no login path besides OIDC, and the identity provider is required at
|
|
# boot, not at login: the application resolves <issuer-uri>/.well-known/
|
|
# openid-configuration while building its security beans, before the HTTP port
|
|
# opens, and exits when it cannot. Without the value the render aborts -
|
|
# required() in urlaubsverwaltung-oidc.secret.yaml is the whole enforcement,
|
|
# and values.schema.json cannot help here (README, guideline 12).
|
|
oidcSecretRef: null
|
|
|
|
ingress:
|
|
enabled: true
|
|
clusterIssuer: null
|
|
domain: null
|
|
className: nginx
|
|
# Extra annotations for the Ingress; merged with the cert-manager
|
|
# cluster-issuer annotation the chart always sets.
|
|
annotations: {}
|
|
|
|
urlaubsverwaltung:
|
|
# Replica count for this workload; 0 is allowed and scales it down.
|
|
# The chart-global scaleDown flag takes precedence.
|
|
replicas: 1
|
|
# The official image is built with Cloud Native Buildpacks and runs as the
|
|
# non-root cnb user (uid 1002, gid 1001). /tmp is a writable emptyDir for
|
|
# the JVM's temp/work files.
|
|
securityContext:
|
|
pod:
|
|
runAsNonRoot: true
|
|
runAsUser: 1002
|
|
runAsGroup: 1001
|
|
# RuntimeDefault applies the container runtime's default seccomp filter,
|
|
# which blocks the syscalls a normal workload never makes. It sits in the
|
|
# pod context on purpose: from here it covers every container in the pod
|
|
# including init containers, while a container-level seccompProfile would
|
|
# have to be repeated for each one (and silently missed on the next one
|
|
# added). A container that genuinely needs a different filter can still
|
|
# override it under securityContext.container, which wins over this value.
|
|
seccompProfile:
|
|
type: RuntimeDefault
|
|
container:
|
|
allowPrivilegeEscalation: false
|
|
readOnlyRootFilesystem: true
|
|
runAsNonRoot: true
|
|
capabilities:
|
|
drop:
|
|
- ALL
|
|
# HEALTH INDICATORS — TWO SETTINGS THE CHART FIXES IN THE TEMPLATE
|
|
#
|
|
# The chart sets these two as plain environment variables, not as values,
|
|
# because urlaubsverwaltung.env below already overrides anything:
|
|
#
|
|
# MANAGEMENT_ENDPOINT_HEALTH_GROUP_READINESS_INCLUDE=readinessState,db
|
|
# puts the datasource into the readiness group, so a database outage
|
|
# takes the pod out of Ready instead of leaving it serving errors (#218).
|
|
# The liveness group stays untouched on purpose — an outage must keep
|
|
# traffic away, not restart the pod in a loop.
|
|
# MANAGEMENT_HEALTH_MAIL_ENABLED=false
|
|
# removes the mail indicator, which otherwise pins the aggregate
|
|
# /actuator/health at 503 DOWN forever, because the chart's mail wiring
|
|
# points at localhost:1025 where nothing listens (#217).
|
|
#
|
|
# THE CONSEQUENCE TO KNOW BEFORE IT BITES: whoever later configures real mail
|
|
# delivery (SPRING_MAIL_HOST/SPRING_MAIL_PORT via urlaubsverwaltung.env) MUST
|
|
# switch the indicator back on in the same change:
|
|
#
|
|
# env:
|
|
# - name: MANAGEMENT_HEALTH_MAIL_ENABLED
|
|
# value: "true"
|
|
#
|
|
# Left at false, /actuator/health keeps answering 200 while the configured
|
|
# mail server is unreachable and no notification mail is delivered. The
|
|
# setting trades a permanently false alarm for silence, and silence is only
|
|
# correct as long as there is nothing to report about.
|
|
#
|
|
# That override repeats a name the chart already sets, and env is additive, so
|
|
# it renders the variable twice. At INSTALL time both entries reach the pod and
|
|
# the later one — yours — wins in the container. Added to an ALREADY INSTALLED
|
|
# release it is lost instead: Kubernetes merges env by name, the pair collapses
|
|
# to the chart's own entry, and helm still reports a successful upgrade. The
|
|
# override does not fail loudly, it fails silently. See the "env IS ADDITIVE
|
|
# ONLY" section of NOTES.txt — the switch has to go in at install time, and
|
|
# after any such change the result belongs verified on the live Deployment.
|
|
livenessProbe:
|
|
httpGet:
|
|
port: 8080
|
|
path: /actuator/health/liveness
|
|
periodSeconds: 10
|
|
failureThreshold: 3
|
|
successThreshold: 1
|
|
timeoutSeconds: 5
|
|
readinessProbe:
|
|
httpGet:
|
|
port: 8080
|
|
path: /actuator/health/readiness
|
|
periodSeconds: 5
|
|
failureThreshold: 3
|
|
successThreshold: 1
|
|
timeoutSeconds: 5
|
|
# The startup probe gates liveness/readiness. Spring Boot startup
|
|
# (JVM + Liquibase migrations) gets a budget of 10s * 30 = 300s.
|
|
startupProbe:
|
|
httpGet:
|
|
port: 8080
|
|
path: /actuator/health/liveness
|
|
periodSeconds: 10
|
|
failureThreshold: 30
|
|
timeoutSeconds: 5
|
|
# Extra environment variables, appended to the ones the chart always sets.
|
|
# Values are rendered through tpl; value, secretKeyRef and configMapKeyRef
|
|
# forms are supported.
|
|
env: []
|
|
resources:
|
|
# Limits are optional: memory and ephemeral-storage limits default to
|
|
# limitFactor x the request, an explicitly set limit always wins, and a
|
|
# CPU limit is only set when configured explicitly under "limits".
|
|
limitFactor: 3
|
|
requests:
|
|
cpu: 0.1
|
|
memory: 768Mi
|
|
ephemeralStorage: 10Mi
|