fix: уникальный image tag per build вместо :latest (operator v0.1.12)

- internal/builder/builder.go: ImageRef() теперь использует sha256(s3Key)[:12]
  как тег образа вместо :latest
  Пример: naeel/sless-default-hello-http:d431de61e2c9
- controllers/function_controller.go: убран хак с restartedAt аннотацией —
  больше не нужен, новый тег = kubelet всегда пул-ит новый образ
- deployments/k8s/operator.yaml: обновлён до v0.1.12
- doc/progress.md: версия обновлена

Преимущества уникального тега:
- imagePullPolicy: IfNotPresent работает корректно
- Rollback к предыдущей версии возможен (теги не перезаписываются)
- Нет race condition при параллельных сборках
This commit is contained in:
“Naeel”
2026-03-08 21:05:35 +04:00
parent 79719e078d
commit f8fe3835a4
5 changed files with 13 additions and 16 deletions
+3 -10
View File
@@ -208,18 +208,11 @@ func (r *FunctionReconciler) ensureDeployment(ctx context.Context, fn *slessv1al
return ctrl.Result{}, fmt.Errorf("get deployment: %w", err)
}
// Обновляем образ и imagePullSecrets если изменились (новая сборка или смена конфига)
// Обновляем образ и imagePullSecrets при новой сборке.
// Тег образа уникален per build (sha256 от s3Key) → imagePullPolicy: IfNotPresent
// корректно подтягивает новый образ без дополнительных хаков.
existing.Spec.Template.Spec.Containers[0].Image = fn.Status.ImageRef
existing.Spec.Template.Spec.ImagePullSecrets = desired.Spec.Template.Spec.ImagePullSecrets
// Принудительный rollout restart при каждой новой сборке.
// Необходимо т.к. image tag :latest не меняется — без этой аннотации
// kubelet берёт кешированный образ и pod не видит новый код.
if fn.Status.LastBuiltAt != nil {
if existing.Spec.Template.Annotations == nil {
existing.Spec.Template.Annotations = map[string]string{}
}
existing.Spec.Template.Annotations["kubectl.kubernetes.io/restartedAt"] = fn.Status.LastBuiltAt.Time.Format(time.RFC3339)
}
if err := r.Update(ctx, existing); err != nil {
return ctrl.Result{}, fmt.Errorf("update deployment: %w", err)
}