feat(ai): add aihost configuration and deployment template
ZhenYi committed
Modified chart/templates/_helpers.tpl chart/templates/_helpers.tpl +55 −0 View chart/templates/_helpers.tpl
@@ -67,6 +67,61 @@
6767 value: {{ .Values.health.synchostPort | quote }}
6868- name: APP_HEALTH__MAILS__PORT
6969 value: {{ .Values.health.mailsPort | quote }}
70- name: APP_HEALTH__AIHOST__PORT
71 value: {{ .Values.health.aihostPort | quote }}
72{{- if .Values.ai.enabled }}
73- name: APP_AI__ENABLED
74 value: "true"
75- name: APP_AI__BASE_URL
76 value: {{ .Values.ai.baseUrl | quote }}
77- name: APP_AI__MODEL
78 value: {{ .Values.ai.model | quote }}
79- name: APP_AI__REVIEW_ENABLED
80 value: {{ .Values.ai.reviewEnabled | quote }}
81- name: APP_AI__SUMMARY_ENABLED
82 value: {{ .Values.ai.summaryEnabled | quote }}
83- name: APP_AI__RELEASE_NOTES_ENABLED
84 value: {{ .Values.ai.releaseNotesEnabled | quote }}
85- name: APP_AI__QUEUE_TOPIC
86 value: {{ .Values.ai.queueTopic | quote }}
87- name: APP_AI__DLQ_TOPIC
88 value: {{ .Values.ai.dlqTopic | quote }}
89- name: APP_AI__MAX_ATTEMPTS
90 value: {{ .Values.ai.maxAttempts | quote }}
91- name: APP_AI__REQUEST_TIMEOUT_SECS
92 value: {{ .Values.ai.requestTimeoutSecs | quote }}
93- name: APP_AI__CONTEXT_MAX_BYTES
94 value: {{ .Values.ai.contextMaxBytes | quote }}
95- name: APP_AI__MAX_FINDINGS
96 value: {{ .Values.ai.maxFindings | quote }}
97- name: APP_AI__MAX_OUTPUT_TOKENS
98 value: {{ .Values.ai.maxOutputTokens | quote }}
99- name: APP_AI__TEMPERATURE
100 value: {{ .Values.ai.temperature | quote }}
101- name: APP_AI__SUMMARY_COMMIT_LIMIT
102 value: {{ .Values.ai.summaryCommitLimit | quote }}
103- name: APP_AI__BOT_USERNAME
104 value: {{ .Values.ai.botUsername | quote }}
105- name: APP_AI__BOT_DISPLAY_NAME
106 value: {{ .Values.ai.botDisplayName | quote }}
107- name: APP_AI__OUTPUT_LANGUAGE
108 value: {{ .Values.ai.outputLanguage | quote }}
109- name: APP_AIHOST__ENABLED
110 value: {{ .Values.aihost.enabled | quote }}
111- name: APP_AIHOST__PORT
112 value: {{ .Values.aihost.port | quote }}
113- name: APP_AIHOST__CONCURRENCY
114 value: {{ .Values.aihost.concurrency | quote }}
115- name: APP_AIHOST__POLL_INTERVAL_SECS
116 value: {{ .Values.aihost.pollIntervalSecs | quote }}
117- name: APP_AIHOST__RETRY_BACKOFF_BASE_SECS
118 value: {{ .Values.aihost.retryBackoffBaseSecs | quote }}
119{{- else }}
120- name: APP_AI__ENABLED
121 value: "false"
122- name: APP_AIHOST__ENABLED
123 value: "false"
124{{- end }}
70125{{- if .Values.githost.ssh.enabled }}
71126- name: APP_GIT__SSH__PORT
72127 value: {{ .Values.githost.ssh.containerPort | quote }}
Added chart/templates/aihost.yaml chart/templates/aihost.yaml +81 −0 View chart/templates/aihost.yaml
@@ -0,0 +1,81 @@
1{{- if and .Values.aihost.enabled .Values.ai.enabled }}
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: {{ printf "%s-aihost" (include "gitdata.fullname" .) }}
6 labels:
7 {{- include "gitdata.labels" . | nindent 4 }}
8 app.kubernetes.io/component: aihost
9spec:
10 replicas: {{ .Values.aihost.replicaCount }}
11 revisionHistoryLimit: 3
12 strategy:
13 # 队列消费无状态,但同一 job 不应被两个消费者同时取走;
14 # 滚动时先停旧实例再起新的,避免并发消费同一队列。
15 type: Recreate
16 selector:
17 matchLabels:
18 {{- include "gitdata.selectorLabels" . | nindent 6 }}
19 app.kubernetes.io/component: aihost
20 template:
21 metadata:
22 labels:
23 {{- include "gitdata.selectorLabels" . | nindent 8 }}
24 app.kubernetes.io/component: aihost
25 {{- with .Values.podLabels }}
26 {{- toYaml . | nindent 8 }}
27 {{- end }}
28 annotations:
29 checksum/env: {{ toYaml .Values.config.env | sha256sum }}
30 {{- with .Values.podAnnotations }}
31 {{- toYaml . | nindent 8 }}
32 {{- end }}
33 spec:
34 serviceAccountName: {{ include "gitdata.serviceAccountName" . }}
35 {{- include "gitdata.imagePullSecrets" . | nindent 6 }}
36 terminationGracePeriodSeconds: 60
37 securityContext:
38 {{- toYaml .Values.podSecurityContext | nindent 8 }}
39 containers:
40 - name: aihost
41 image: {{ include "gitdata.image" . }}
42 imagePullPolicy: {{ .Values.image.pullPolicy }}
43 args: ["aihost"]
44 {{- include "gitdata.envFrom" . | nindent 10 }}
45 env:
46 {{- include "gitdata.env" . | nindent 12 }}
47 {{- with .Values.aihost.extraEnv }}
48 {{- toYaml . | nindent 12 }}
49 {{- end }}
50 ports:
51 - name: health
52 containerPort: {{ .Values.health.aihostPort }}
53 livenessProbe:
54 httpGet: { path: /healthz, port: health }
55 initialDelaySeconds: 15
56 periodSeconds: 20
57 readinessProbe:
58 httpGet: { path: /readyz, port: health }
59 initialDelaySeconds: 10
60 periodSeconds: 10
61 failureThreshold: 3
62 securityContext:
63 {{- toYaml .Values.securityContext | nindent 12 }}
64 resources:
65 {{- toYaml .Values.aihost.resources | nindent 12 }}
66 # 评审需要直接读 bare 仓库(git diff / commit 上下文)
67 volumeMounts:
68 - name: repos
69 mountPath: {{ .Values.persistence.repos.mountPath }}
70 volumes:
71 - name: repos
72 {{- if .Values.persistence.repos.existingClaim }}
73 persistentVolumeClaim:
74 claimName: {{ .Values.persistence.repos.existingClaim }}
75 {{- else if .Values.persistence.repos.enabled }}
76 persistentVolumeClaim:
77 claimName: {{ printf "%s-repos" (include "gitdata.fullname" .) }}
78 {{- else }}
79 emptyDir: {}
80 {{- end }}
81{{- end }}
Modified chart/values.yaml chart/values.yaml +36 −0 View chart/values.yaml
@@ -178,6 +178,7 @@
178178 enabled: true
179179 synchostPort: 3002
180180 mailsPort: 3003
181 aihostPort: 3006
181182
182183im:
183184 enabled: true
@@ -192,6 +193,41 @@
192193 extraEnv: []
193194
194195# ---------------------------------------------------------------------------
196# AI:评审 / 仓库总结 / release 文案。启用前必须提供 OpenAI 兼容端点。
197# 密钥走 secret.env(APP_AI__API_KEY),不要写在这里。
198# ---------------------------------------------------------------------------
199ai:
200 # 非敏感默认值;enabled/base_url/model 等按需在 values 覆盖
201 enabled: false
202 reviewEnabled: true
203 summaryEnabled: true
204 releaseNotesEnabled: true
205 queueTopic: "gitdata:ai"
206 dlqTopic: "gitdata:ai:dlq"
207 maxAttempts: 3
208 requestTimeoutSecs: 120
209 contextMaxBytes: 524288
210 maxFindings: 20
211 maxOutputTokens: 4096
212 temperature: "0.2"
213 summaryCommitLimit: 50
214 botUsername: "ai-reviewer"
215 botDisplayName: "AI Reviewer"
216 outputLanguage: "zh-CN"
217
218aihost:
219 enabled: true
220 replicaCount: 1
221 port: 3006
222 concurrency: 2
223 pollIntervalSecs: 5
224 retryBackoffBaseSecs: 2
225 resources:
226 requests: { cpu: 100m, memory: 256Mi }
227 limits: { memory: 1Gi }
228 extraEnv: []
229
230# ---------------------------------------------------------------------------
195231# 存储:githost 与 synchost 共享 bare 仓库,需要 RWX
196232# ---------------------------------------------------------------------------
197233persistence: