{{- define "gitdata.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} {{- define "gitdata.fullname" -}} {{- if .Values.fullnameOverride -}} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} {{- else -}} {{- $name := default .Chart.Name .Values.nameOverride -}} {{- if contains $name .Release.Name -}} {{- .Release.Name | trunc 63 | trimSuffix "-" -}} {{- else -}} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} {{- end -}} {{- end -}} {{- end -}} {{- define "gitdata.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}} {{- define "gitdata.labels" -}} helm.sh/chart: {{ include "gitdata.chart" . }} app.kubernetes.io/name: {{ include "gitdata.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end -}} {{- define "gitdata.selectorLabels" -}} app.kubernetes.io/name: {{ include "gitdata.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end -}} {{- define "gitdata.serviceAccountName" -}} {{- if .Values.serviceAccount.create -}} {{- default (include "gitdata.fullname" .) .Values.serviceAccount.name -}} {{- else -}} {{- default "default" .Values.serviceAccount.name -}} {{- end -}} {{- end -}} {{- define "gitdata.image" -}} {{- $tag := default .Chart.AppVersion .Values.image.tag -}} {{- printf "%s:%s" .Values.image.repository $tag -}} {{- end -}} {{- define "gitdata.secretName" -}} {{- if .Values.secret.existingSecret -}} {{- .Values.secret.existingSecret -}} {{- else -}} {{- printf "%s-env" (include "gitdata.fullname" .) -}} {{- end -}} {{- end -}} {{/* 组件通用 env:端口/路径/URL 由 values 结构字段生成,用户 config.env 可覆盖 */}} {{- define "gitdata.env" -}} - name: APP_APIHOST__PORT value: {{ .Values.apihost.port | quote }} - name: APP_INTERNAL__RPC__LISTEN_ADDRESS value: {{ printf "0.0.0.0:%v" .Values.apihost.rpcPort | quote }} - name: APP_INTERNAL__EVENT_CLIENT__ENDPOINT value: {{ printf "http://%s-event:%v" (include "gitdata.fullname" .) .Values.event.rpcPort | quote }} {{- if .Values.event.enabled }} - name: APP_EVENT__SOCKET__LISTEN_ADDRESS value: {{ printf "0.0.0.0:%v" .Values.event.socketPort | quote }} - name: APP_EVENT__RPC__LISTEN_ADDRESS value: {{ printf "0.0.0.0:%v" .Values.event.rpcPort | quote }} - name: APP_EVENT__PLATFORM__RPC_ENDPOINT value: {{ printf "http://%s-apihost:%v" (include "gitdata.fullname" .) .Values.apihost.rpcPort | quote }} - name: APP_EVENT__PLATFORM__RESOURCE_API_ENDPOINT value: {{ printf "http://%s-apihost:%v/api/v1" (include "gitdata.fullname" .) .Values.apihost.port | quote }} {{- end }} {{- if .Values.identityKey.secretName }} - name: APP_EVENT__RPC__IDENTITY_PRIVATE_KEY__FILE value: {{ printf "%s/identity-private.pem" .Values.identityKey.mountPath | quote }} - name: APP_INTERNAL__EVENT_CLIENT__PUBLIC_KEY__FILE value: {{ printf "%s/identity-public.pem" .Values.identityKey.mountPath | quote }} {{- end }} - name: APP_GIT__KENSHELL_ENDPOINT value: {{ .Values.kenshell.endpoint | quote }} - name: APP_GIT__KENSHELL_RPC_KEY value: {{ .Values.kenshell.rpcKey | quote }} - name: APP_GIT__KENSHELL_TIMEOUT_SECS value: {{ .Values.kenshell.timeoutSecs | quote }} - name: APP_GIT__SSH_CLONE_HOST value: {{ .Values.kenshell.sshCloneHost | quote }} - name: APP_GIT__SSH_CLONE_PORT value: {{ .Values.kenshell.sshClonePort | quote }} {{- $base := printf "https://%s" .Values.ingress.host }} - name: APP_WEB__WEB_BASE_URL value: {{ default $base .Values.config.env.APP_WEB__WEB_BASE_URL | quote }} - name: APP_GIT__BASE_URL value: {{ default $base .Values.config.env.APP_GIT__BASE_URL | quote }} {{- $cloneBase := default $base .Values.kenshell.httpCloneBaseUrl }} - name: APP_GIT__HTTP_CLONE_BASE_URL value: {{ default $cloneBase .Values.config.env.APP_GIT__HTTP_CLONE_BASE_URL | quote }} {{- if .Values.metrics.otlpEndpoint }} - name: OTEL_EXPORTER_OTLP_ENDPOINT value: {{ .Values.metrics.otlpEndpoint | quote }} # 服务名取各自的 component label(downward API),一处覆盖全部 workload; # 不设的话所有进程在观测端会塌成一个 unknown_service:。 - name: OTEL_SERVICE_NAME valueFrom: fieldRef: fieldPath: "metadata.labels['app.kubernetes.io/component']" {{- end }} {{- range $k, $v := .Values.config.env }} {{- if and (not (hasPrefix "APP_WEB__WEB_BASE_URL" $k)) (not (hasPrefix "APP_GIT__BASE_URL" $k)) (not (hasPrefix "APP_GIT__HTTP_CLONE_BASE_URL" $k)) }} {{/* config.env 走容器 env:,secret.env 走 envFrom:;同名时 env: 优先级更高, 会静默覆盖 Secret 里的真实值(例如把连接串换成 chart 默认的 redis://redis-master)。 因此这里跳过任何已在 secret.env 中声明的键,让 Secret 成为唯一来源。 */}} {{- if not (hasKey $.Values.secret.env $k) }} - name: {{ $k }} value: {{ $v | quote }} {{- end }} {{- end }} {{- end }} {{- end -}} {{- define "gitdata.envFrom" -}} envFrom: - configMapRef: name: {{ printf "%s-env" (include "gitdata.fullname" .) }} - secretRef: name: {{ include "gitdata.secretName" . }} optional: true {{- end -}} {{/* 抗节点故障软反亲和 */}} {{- define "gitdata.podAntiAffinity" -}} {{- $ctx := .ctx -}} podAntiAffinity: {{ if eq .mode "hard" }}requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: {{- include "gitdata.selectorLabels" $ctx | nindent 10 }} app.kubernetes.io/component: {{ .component }} topologyKey: kubernetes.io/hostname {{ else if eq .mode "soft" }}preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: {{- include "gitdata.selectorLabels" $ctx | nindent 12 }} app.kubernetes.io/component: {{ .component }} topologyKey: kubernetes.io/hostname {{ end }} {{- end -}} {{- define "gitdata.imagePullSecrets" -}} {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 2 }} {{- end }} {{- end -}}