Как можно получить версию helm чарта из файла values.yaml в ApplicationSet Argo CD?

Привет! У меня есть следующий ApplicationSet:  
<pre><code class="yaml">apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: applicationset-3rdparty
  namespace: test-namepsace
spec:
  goTemplate: true
  generators:
    - git:
        repoURL: git@gitlab.example.com/argocd.git
        revision: HEAD
        directories:
          - path: configs/*/3rdparty/*/*/*

  template:
    metadata:
      name: "{{ index .path.segments 4 }}"
      labels:
        team: "{{ index .path.segments 2 }}"
    spec:
      destination:
        name: "{{ index .path.segments 1 }}-rke2"
        namespace: "{{ index .path.segments 3 }}"
      sources:
        - repoURL: git@gitlab.example.com/argocd.git
          targetRevision: HEAD
          ref: values
        - repoURL: https://example.com/chartrepo
          targetRevision: ??????????
          helm:
            valueFiles:
              - "$values/{{ .path.path }}/values.yaml"
          chart: "{{ index .path.segments 4 }}"

      project: test
      syncPolicy:
        automated:
          prune: true
          selfHeal: true</code></pre>  

В папке <code>configs/*/3rdparty/*/*/*</code> находится файл <code>values.yaml</code> для Helm, который начинается с строки:  
<code class="yaml">chartVersion: "0.1.0"</code>  

Я не могу понять, как передать значение этого параметра в поле <b>targetRevision</b> для чарта. ChatGPT не дает ясного ответа. Есть ли другие удобные способы решения этой задачи? На текущий момент я создаю отдельную папку для каждого тэга, например <code>victoria-metrics-operator/0.9.13/values.yaml</code>, но это крайне неудобно.
  • 12 февраля 2025 г. 14:34
Ответы на вопрос 2
Ваша задача — извлекать версию чарта из файла `values.yaml` непосредственно в `ApplicationSet` Argo CD. К сожалению, в `ApplicationSet` нет прямых механизмов для динамического считывания содержимого файлов и использования их значений. Однако есть несколько обходных путей, которые вы можете рассмотреть.

### Подходы:

1. **Использование GitOps и CI/CD для подготовки конфигурации:**
   Если у вас есть CI/CD процесс, который обновляет ваш Git-репозиторий, вы можете написать скрипт, который будет извлекать значение `chartVersion` из `values.yaml` и обновлять все ваши необходимые конфигурации перед тем, как они будут применены в Argo CD. Это может быть сделано с помощью `kubectl` или других инструментов, таких как `yq` или `jq`.

   Пример на `yq`:
   ```bash
   version=$(yq eval '.chartVersion' path/to/values.yaml)
   echo "Version: $version"
   ```

2. **Использование внешнего скрипта:**
   Вы можете сделать внешний скрипт, который будет сканировать ваши значения и генерировать необходимые YAML-файлы для `ApplicationSet`. После этого вы можете просто указывать сгенерированные манифесты в вашем Argo CD.

3. **Кастомные Helm Charts:**
   Вы можете использовать Helm-карт для генерации значений. Например, можно создать отдельный Helm-чарт, который будет зависеть от ваших текущих чартов и будет загружать их зависимости с нужными версиями.

4. **Использование Kustomize или Helmfile:**
   Если у вас есть гибкость в том, как организована ваша структура репозитория, вы можете рассмотреть подходы с использованием Kustomize или Helmfile, которые поддерживают переменные и могут упростить управление версиями внутри файлов конфигурации.

### Пример генерации версии с помощью CI/CD:

Примерный процесс может выглядеть так:

1. Вы при каждом изменении `values.yaml` выполняете скрипт, который обновляет `ApplicationSet` с текущей версией:
   ```bash
   version=$(yq eval '.chartVersion' path/to/values.yaml)
   sed -i "s/targetRevision: .*/targetRevision: $version/" path/to/applicationset.yaml
   git commit -am "Update ApplicationSet with new chart version $version"
   git push
   ```

2. Настройте вебхуки или другие триггеры в вашем CI/CD, чтобы автоматически применять обновления, когда они появляются в вашем репозитории.

### Заключение

К сожалению, фактическая реализация динамического считывания значений из `values.yaml` через `ApplicationSet` в Argo CD не является тривиальной задачей, и для управления версиями вам, скорее всего, понадобится использовать координацию с другими инструментами на уровне CI/CD или некоторыми вспомогательными скриптами.
chartVersion: "0.1.0" - похоже на ручное творчество и когда версионированием никто не занимается. Довольно частое явление
Похожие вопросы