feat: make yamllint and kubeconform strict in CI #215

Merged
admin merged 2 commits from feat/strict-linters into main 2026-02-22 14:08:20 +01:00
Owner

Summary

  • yamllint: install via pip, strict mode on environments/ argocd-apps/ apps/
  • kubeconform: remove || true fallback
  • Both linters now block PR merge on errors

Test plan

  • CI passes on current YAML files
  • Bad YAML would fail the check
## Summary - yamllint: install via pip, strict mode on environments/ argocd-apps/ apps/ - kubeconform: remove || true fallback - Both linters now block PR merge on errors ## Test plan - [ ] CI passes on current YAML files - [ ] Bad YAML would fail the check
claude added 3 commits 2026-02-22 13:26:12 +01:00
fix: add kubernetes OIDC client + direct-grant-no-otp flow to realm config
All checks were successful
AI Review / AI Code Review (pull_request) Successful in 5s
PR Checks / Validate & Security Scan (pull_request) Successful in 10s
08b0c41f45
The kubernetes client (Phase 15) and direct-grant-no-otp auth flow were
created via API but missing from realm-configmap.yaml. A realm re-import
would lose these configurations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sec: remove plaintext passwords from realm ConfigMap
All checks were successful
AI Review / AI Code Review (pull_request) Successful in 1s
PR Checks / Validate & Security Scan (pull_request) Successful in 10s
65930ceb1e
Use keycloak-config-cli env var substitution $(env:VAR_NAME) to inject
user passwords from K8s Secret instead of hardcoding them in ConfigMap.

- realm-configmap.yaml: passwords replaced with $(env:KC_INFRA_ADMIN_PASSWORD)
  and $(env:KC_INFRA_CLAUDE_PASSWORD)
- keycloak ArgoCD app: added keycloakConfigCli.extraEnvVarsSecret
- Secrets sourced from OpenBao via create-keycloak-secrets.sh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: make yamllint and kubeconform strict in CI
Some checks failed
AI Review / AI Code Review (pull_request) Successful in 2s
PR Checks / Validate & Security Scan (pull_request) Failing after 5s
7d21c942a2
- yamllint: install via pip, validate environments/ argocd-apps/ apps/
- kubeconform: remove || true fallback, fail on invalid manifests
- Both linters now block PR merge on errors

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

AI Code Review

Error: Reached max turns (1)


Automated review by Claude Haiku | advisory, does not block merge

## AI Code Review Error: Reached max turns (1) --- _Automated review by Claude Haiku | advisory, does not block merge_
claude added 1 commit 2026-02-22 13:51:44 +01:00
fix: use --break-system-packages for pip install yamllint
All checks were successful
AI Review / AI Code Review (pull_request) Successful in 2s
PR Checks / Validate & Security Scan (pull_request) Successful in 11s
893b58afdc
PEP 668 blocks pip install in externally-managed Python environments
(Debian/Ubuntu). Adding --break-system-packages flag to fix CI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

AI Code Review

Рецензирую PR по безопасности, надёжности и best practices Kubernetes.

Критические проблемы

1. Hardcoded пароли → переменные окружения Хорошо

  • realm-configmap.yaml: замена Kc@Adm1nInfra2026! на $(env:KC_INFRA_ADMIN_PASSWORD) — правильный подход
  • Но: нужно убедиться, что keycloak-configcli-secrets существует и содержит оба ключа (KC_INFRA_ADMIN_PASSWORD, KC_INFRA_CLAUDE_PASSWORD)
  • Проверить в K8s: kubectl get secret keycloak-configcli-secrets -n keycloak -o yaml

2. CI/CD — обработка ошибок

  • Удаление || true из kubeconform хорошо, но yamllint pip install должен быть в base image или pre-step, а не в workflow
    • Риск: медленная работа CI, зависимость от внешних репо (pip server может быть недоступен)
    • --break-system-packages опасен в контейнере — лучше использовать venv или alpine с system pip
  • Рекомендация: добавить в Dockerfile/base-image, или использовать python -m pip с --user флагом

3. Kubernetes OIDC client

  • Новый client kubernetes с publicClient: true и directAccessGrantsEnabled: true — правильно для kubelogin (Phase 15)
  • PKCE включён (pkce.code.challenge.method: S256)
  • localhost redirect URIs для локальной разработки
  • Внимание: убедиться, что kubernetes client secret синхронизирован в OpenBao secret/k8s/keycloak/kubernetes для kubelogin конфига

4. Authentication flow direct-grant-no-otp

  • Добавлена новая flow без OTP для headless доступа (CLI/systemd-сервисы)
  • Проверить: эта flow назначена дефолтно для kubernetes client? Или есть связь в clientFlow?
    • В current config-cli это может не сработать — нужна явная ссылка на flow в client
    • Без этого cli всё ещё потребует OTP/2FA

Средние проблемы

5. ConfigMap размер

  • realm-configmap.yaml растёт (новый client + flow + credentials refs)
  • Проверить: kubectl get configmap -A | grep realm-configmap — размер в пределах 1MB?
  • Если близко к лимиту, рассмотреть split на отдельные ресурсы (Secret для passwords, ConfigMap для clients)

6. Test plan неполный

  • Нужна проверка: kubectl get secret keycloak-configcli-secrets -n keycloak существует
  • Нужна проверка: kubelogin работает с новым kubernetes client (локальный тест)
  • CI должен запуститься на этом PR и пройти (currently marked [ ])

Рекомендации

# Добавить в CI pre-step или base image:
- name: Install yamllint
  run: |
    python3 -m venv /tmp/yamllint-venv
    . /tmp/yamllint-venv/bin/activate
    pip install -q yamllint

Или проще: использовать готовый image cytopia/yamllint в Docker workflow.

Итог: PR логически правильный (strict linting, secrets externalisation, K8s OIDC), но нужна проверка:

  1. keycloak-configcli-secrets Secret существует и заполнен
  2. kubernetes client имеет явную ссылку на direct-grant-no-otp flow
  3. CI тесты запущены и зелёные

Одобрить после этих проверок.


Automated review by Claude Haiku | advisory, does not block merge

## AI Code Review Рецензирую PR по безопасности, надёжности и best practices Kubernetes. ## Критические проблемы **1. Hardcoded пароли → переменные окружения** ✅ Хорошо - realm-configmap.yaml: замена `Kc@Adm1nInfra2026!` на `$(env:KC_INFRA_ADMIN_PASSWORD)` — правильный подход - **Но:** нужно убедиться, что `keycloak-configcli-secrets` существует и содержит оба ключа (`KC_INFRA_ADMIN_PASSWORD`, `KC_INFRA_CLAUDE_PASSWORD`) - Проверить в K8s: `kubectl get secret keycloak-configcli-secrets -n keycloak -o yaml` **2. CI/CD — обработка ошибок** - Удаление `|| true` из kubeconform хорошо, но **yamllint pip install должен быть в base image или pre-step**, а не в workflow - Риск: медленная работа CI, зависимость от внешних репо (pip server может быть недоступен) - `--break-system-packages` опасен в контейнере — лучше использовать venv или alpine с system pip - Рекомендация: добавить в Dockerfile/base-image, или использовать `python -m pip` с `--user` флагом **3. Kubernetes OIDC client** - Новый client `kubernetes` с `publicClient: true` и `directAccessGrantsEnabled: true` — правильно для kubelogin (Phase 15) - ✅ PKCE включён (`pkce.code.challenge.method: S256`) - ✅ localhost redirect URIs для локальной разработки - **Внимание:** убедиться, что `kubernetes` client secret синхронизирован в OpenBao `secret/k8s/keycloak/kubernetes` для kubelogin конфига **4. Authentication flow `direct-grant-no-otp`** - ✅ Добавлена новая flow без OTP для headless доступа (CLI/systemd-сервисы) - **Проверить:** эта flow назначена дефолтно для `kubernetes` client? Или есть связь в clientFlow? - В current config-cli это может не сработать — нужна явная ссылка на flow в client - Без этого cli всё ещё потребует OTP/2FA ## Средние проблемы **5. ConfigMap размер** - realm-configmap.yaml растёт (новый client + flow + credentials refs) - Проверить: `kubectl get configmap -A | grep realm-configmap` — размер в пределах 1MB? - Если близко к лимиту, рассмотреть split на отдельные ресурсы (Secret для passwords, ConfigMap для clients) **6. Test plan неполный** - [ ] Нужна проверка: `kubectl get secret keycloak-configcli-secrets -n keycloak` существует - [ ] Нужна проверка: kubelogin работает с новым `kubernetes` client (локальный тест) - [ ] CI должен запуститься на этом PR и пройти (currently marked [ ]) ## Рекомендации ```yaml # Добавить в CI pre-step или base image: - name: Install yamllint run: | python3 -m venv /tmp/yamllint-venv . /tmp/yamllint-venv/bin/activate pip install -q yamllint ``` Или проще: использовать готовый image `cytopia/yamllint` в Docker workflow. **Итог:** PR логически правильный (strict linting, secrets externalisation, K8s OIDC), но **нужна проверка**: 1. `keycloak-configcli-secrets` Secret существует и заполнен 2. `kubernetes` client имеет явную ссылку на `direct-grant-no-otp` flow 3. CI тесты запущены и зелёные Одобрить после этих проверок. --- _Automated review by Claude Haiku | advisory, does not block merge_
admin merged commit 98c5025606 into main 2026-02-22 14:08:20 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: claude/k8s-apps#215
No description provided.