Validate Helm Charts / Detect changed charts (pull_request) Successful in 4s
Validate Helm Charts / Resource quantities (pull_request) Successful in 15s
Validate Helm Charts / Selector match (pull_request) Successful in 15s
Validate Helm Charts / HTTPRoute match (pull_request) Successful in 16s
Validate Helm Charts / Build rss-bridge (pull_request) Successful in 8s
Validate Helm Charts / Trivy config rss-bridge (pull_request) Successful in 23s
Install-test / Install-test rss-bridge (pull_request) Successful in 1m14s
Validate Helm Charts / Install-test (pull_request) Successful in 1m14s
This chart's install-test had failed on the Gitea runner since the move (#51): php-fpm as uid 33 unable to read /app/index.php, the startup probe 403ing through its whole 150s budget, the pod never Ready. The chart was deliberately kept OUT of ci/excluded-charts.txt so that a pass would be noticed rather than silenced. It passed, in this PR. Measured from the run: k3d cluster up, helm install in Ingress mode, pod 1/1 Ready in 22s with 0 restarts, no "Permission denied" anywhere in the job, and all eight check contexts green. The chart is ruled out as the cause by a diff rather than by an argument: the rendered output for the fixture values is BYTE-IDENTICAL to origin/main - proven in the previous commit to justify the Minor bump - so the pod spec that succeeded is, line for line, the pod spec that had been failing. The implicated layer is the runner, which is where #51 had already placed the burden of proof. The control case arrived for free, from evidence collected for an unrelated reason. What this does NOT establish, and the docs say so: that it is repaired. It is one run, nobody has identified what changed on the runner, and an intermittent effect needs several runs per side. #51 therefore stays open and is to be closed on a cause, not on a colour - which was the standing instruction there before the green arrived. Corrected accordingly, because shipping documentation that says the test fails while it demonstrably passed is the half-finished state this repo tries not to leave behind: - README: the httproute-test paragraph, guideline 4's closing passage on the last chart of the sweep, and the chart table row. - rss-bridge/templates/NOTES.txt: the Gateway branch no longer claims the chart has no successful install-test. What remains true, and is what it now says, is that the install-test installs the INGRESS mode, so the Gateway mode is render-only - the same position as all 21 other charts of the sweep rather than a worse one. - ci/httproute/rss-bridge.yaml: same correction, plus why the overlay stays load-bearing either way. The wiki carries the same correction in the same round (rss-bridge, CI-CD) plus a Lessons-Learned entry on the decision that produced the signal: an excluded test is not a quiet test but a blind one, because you also lose the moment the fault stops existing.
117 lines
5.7 KiB
Plaintext
117 lines
5.7 KiB
Plaintext
{{- $httpRoute := .Values.httpRoute | default dict -}}
|
|
{{- $hostnames := $httpRoute.hostnames | default list -}}
|
|
RSS-Bridge {{ .Chart.AppVersion }} was installed as release "{{ .Release.Name }}".
|
|
|
|
{{ if .Values.ingress.enabled -}}
|
|
ACCESS - INGRESS MODE (ingress.enabled: true, httpRoute.enabled: false)
|
|
|
|
Reachable at:
|
|
{{ range $entry := .Values.ingress.hosts }} https://{{ $entry.host }}
|
|
{{ end }}
|
|
Each host serves the same instance. Certificates are issued by the
|
|
cert-manager cluster issuer "{{ .Values.ingress.clusterIssuer }}" into these secrets:
|
|
{{ range $secret := (fromYaml (include "rss-bridge.tlsGroups" (dict "hosts" .Values.ingress.hosts "root" $))).order }} {{ $secret }}
|
|
{{ end }}
|
|
Hosts sharing a secret name share one certificate with several SANs; hosts with
|
|
distinct names get one certificate each. That grouping is what keeps the three
|
|
grown certificates of this installation on their existing secret names.
|
|
{{- else if $httpRoute.enabled -}}
|
|
ACCESS - GATEWAY MODE (httpRoute.enabled: true, ingress.enabled: false)
|
|
|
|
Reachable at:
|
|
{{ range $hostnames }} https://{{ . }}
|
|
{{ end }}
|
|
All of these names are served by ONE HTTPRoute ({{ .Release.Name }}-{{ .Chart.Name }}-httproute), because
|
|
nothing differs between them: one rule, PathPrefix "/", one backend. Adding or
|
|
removing a name is an edit to httpRoute.hostnames and nothing else.
|
|
|
|
This release renders that route and NOTHING else of the routing path - no
|
|
Gateway, no class, no Certificate. Three things therefore belong to the cluster
|
|
and not to this chart, and if any of them is missing the hostnames above simply
|
|
do not answer:
|
|
|
|
1. The Gateway-API CRDs. Without them this install would have failed, so
|
|
they are present - nothing to check.
|
|
2. The Gateway named in httpRoute.parentRefs
|
|
{{- range $httpRoute.parentRefs }}
|
|
{{ .name }}{{ if .namespace }} in namespace {{ .namespace }}{{ end }}{{ if .sectionName }}, listener {{ .sectionName }}{{ end }}
|
|
{{- end }}
|
|
must exist AND its listener must allow routes from this namespace
|
|
({{ .Release.Namespace }}) in allowedRoutes. A rejected attachment is
|
|
visible only in the route's status:
|
|
|
|
kubectl -n {{ .Release.Namespace }} get httproute {{ .Release.Name }}-{{ .Chart.Name }}-httproute -o yaml
|
|
|
|
Read status.parents[].conditions - "Accepted: True" and
|
|
"ResolvedRefs: True" is what a working attachment looks like. An empty
|
|
status means no controller has looked at the route at all.
|
|
3. A TLS certificate for every hostname above, on the Gateway's listener.
|
|
ingress.clusterIssuer is NOT used in this mode and is not required - the
|
|
chart renders no Certificate here, so none of the tls-* secrets listed by
|
|
the Ingress mode exists and there is nothing for cert-manager to do on
|
|
behalf of this release.
|
|
|
|
NOTHING THIS CHART DID IN INGRESS MODE IS LOST HERE
|
|
|
|
Worth stating plainly, because it is not the usual case in this repository:
|
|
most charts switched to the Gateway API give something up, since
|
|
ingress.annotations has no counterpart in this API and an operator's
|
|
annotation often carried real behaviour. This chart's live Ingress was measured
|
|
before the switch and carries no nginx.ingress.kubernetes.io annotation at all -
|
|
no body-size limit, no buffer sizes, no CORS, no rewrite, no auth. So there is
|
|
no compensation to re-create at the Gateway and no behaviour to miss.
|
|
|
|
Two things do become inert, and neither is a loss:
|
|
|
|
* ingress.annotations - gone in this mode, as everywhere. Empty here.
|
|
* The TLS secret grouping (rss-bridge.tlsGroups, and the per-host
|
|
ingress.hosts[].tlsSecretName it reads) - with the certificate on the
|
|
listener there is nothing left to group. This is the chart's most
|
|
intricate Ingress-mode machinery and it simply has no job here.
|
|
|
|
What is NOT demonstrated: that traffic actually flows. No Gateway controller
|
|
runs in CI, so no HTTPRoute of this chart has ever reached "Accepted: True"
|
|
there, and the install-test installs the Ingress mode rather than this one.
|
|
Check the route status above after the first install rather than assuming it
|
|
attached.
|
|
{{- else -}}
|
|
ACCESS - NEITHER INGRESS NOR HTTPROUTE
|
|
|
|
ingress.enabled and httpRoute.enabled are both false, so this release has no
|
|
Ingress, no HTTPRoute and no certificate; ingress.hosts, ingress.clusterIssuer
|
|
and httpRoute.hostnames are not needed. Reach the instance with:
|
|
|
|
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ .Release.Name }}-{{ .Chart.Name }}-service 8080:80
|
|
|
|
and open http://localhost:8080
|
|
|
|
To publish it instead, set either ingress.enabled=true with ingress.hosts and
|
|
ingress.clusterIssuer, or httpRoute.enabled=true with httpRoute.hostnames and
|
|
httpRoute.parentRefs.
|
|
{{- end }}
|
|
|
|
Enabled bridges ({{ len .Values.whitelist }} entr{{ if eq (len .Values.whitelist) 1 }}y{{ else }}ies{{ end }} in whitelist.txt):
|
|
{{ range $entry := .Values.whitelist }} {{ $entry }}
|
|
{{ end }}
|
|
{{- if has "*" .Values.whitelist }}
|
|
"*" enables every bridge the image ships. Narrow it down by listing bridge
|
|
names in the "whitelist" value.
|
|
{{- end }}
|
|
|
|
Useful to know:
|
|
|
|
* Health endpoint: /?action=health - a fixed JSON document that touches
|
|
neither the cache nor any remote site. All three probes use it.
|
|
* Changing the "whitelist" value rolls the pod: the deployment carries a
|
|
checksum over the ConfigMap, because a subPath mount would otherwise never
|
|
reach the running container.
|
|
* The feed cache lives in an emptyDir at /app/cache and is therefore
|
|
deliberately lost on every restart. RSS-Bridge refills it on demand; it
|
|
holds only fetched feeds, no configuration and no user data.
|
|
* The container runs read-only and non-root as uid 33 (www-data).
|
|
{{- if .Values.scaleDown }}
|
|
|
|
WARNING: scaleDown is true, so this release is running with 0 replicas.
|
|
Set scaleDown=false to bring it back up.
|
|
{{- end }}
|