Как создавать ветки функций при размещении манифестов отдельно от исходного кода?

Часть, которая смущает меня в gitops, - это рекомендация отделить исходный код от манифестов, например, вот что argocd говорит об этом:

Настоятельно рекомендуется использовать другой репозиторий Git для хранения манифестов кубернетов (отдельно от исходного кода вашего приложения). См. Лучшие практики для дальнейшего обоснования.

В типичном проекте я бы использовал gitlab для настройки тестовой среды, а затем on_stopдействие по удалению окружения для каждого PR. Однако, если я отделю манифесты от исходного кода, непонятно, что должен отслеживать argocd.

Для примера предположим, что у нас есть два репозитория:

  • foo размещает код приложения
  • bar размещает манифесты различных приложений

Предположим:

  1. Я создал новую ветку feature-001 в foo ветка.
  2. Каждый раз, когда мы добавляем коммит в feature-001он создает новый образ докера (foo:$COMMIT_SHA).

Как мне создать приложение под управлением argocd, которое отслеживает изменения в этой ветке?

Конечно, я могу создать приложение с помощью CLI:

       argocd app create "foo-$COMMIT_SHA" --repo https://github.com/gajus/bar.git --path bar -p image=foo:$COMMIT_SHA

но откуда ArgoCD знать, чтобы отследить это feature-001ветвь для изменений?, т.е. как мне сказать argocd развернуть новую версию приложения, когда новый образ Docker публикуется из этой ветки?

2 ответа

Как мне создать argocd контролируемое приложение, которое следит за изменениями в этой ветке?

Я не уверен, почему вы отклоняете опцию CLI. Интерфейс командной строки может создавать приложение, включая указание на ревизию git, которая (может быть веткой).

Например:

argocd app create "foo-$COMMIT_NAME"
  --repo https://github.com/gajus/bar.git
  --path bar
  --revision $BRANCH_NAME
  --parameter image=foo:$COMMIT_SHA
  --sync-policy automated

Обратите внимание, что здесь задается политика автоматической синхронизации. Это будет означать, что любые обновления ревизии обновят ветку.

Как мне сказать argocd развернуть новую версию приложения, когда новый образ Docker публикуется из этой ветки

Приведенный выше ответ объясняет, как приложение ArgoCD может отслеживать изменения git, но этот вопрос намекает на проблему обновления тега в манифесте развертывания / репликации. Это сильно зависит от того, как вы это делаете для своей основной ветки. У некоторых людей это жестко запрограммировано, другие передают $COMMIT_SHA из репо foo репо bar, а другие используют язык шаблонов и вводят переменные.

Исходя из вашего беспокойства, я предполагаю, что вы следуете фиксации из репо. foo репо barподход. Если это так, я бы предложил добавить флаг --upsert в команду CLI и просто запускать одну и ту же команду CLI каждый раз в конвейере ветвления.

ПРИМЕЧАНИЕ: здесь добавлен бонусный вариант - добавить дополнительный флаг для чего-то вроде --label branch=${BRANCH_NAME}. Затем это можно использовать для поиска / очистки любой развертываемой ветки на регулярной основе.

Так что у тебя есть

  • git:foo содержит код приложения
  • git:bar содержит манифесты различных приложений
  1. ArgoCD ваш компакт-диск смотрит только git:bar
  2. Ваша система сборки CI отслеживает git:foo на наличие изменений, например веток, коммитов, pr.
  3. В рамках сборки CI он создает новый контейнер и загружает его в реестр контейнеров с моим любимым тегом «ГГГГММДД-BuildId-ShortGitHash».
  4. Волшебство ✨, затем CI проверяет git:bar и обновляет соответствующую конфигурацию с новым тегом контейнера и фиксирует изменение, это запускает ArgoCD.
  5. ArgoCD обнаруживает изменения в git:bar и вносит необходимые изменения в k8s, чтобы развернуть новый контейнер.
Другие вопросы по тегам