Как создавать ветки функций при размещении манифестов отдельно от исходного кода?
Часть, которая смущает меня в gitops, - это рекомендация отделить исходный код от манифестов, например, вот что argocd говорит об этом:
Настоятельно рекомендуется использовать другой репозиторий Git для хранения манифестов кубернетов (отдельно от исходного кода вашего приложения). См. Лучшие практики для дальнейшего обоснования.
В типичном проекте я бы использовал gitlab для настройки тестовой среды, а затем on_stop
действие по удалению окружения для каждого PR. Однако, если я отделю манифесты от исходного кода, непонятно, что должен отслеживать argocd.
Для примера предположим, что у нас есть два репозитория:
-
foo
размещает код приложения -
bar
размещает манифесты различных приложений
Предположим:
- Я создал новую ветку
feature-001
вfoo
ветка. - Каждый раз, когда мы добавляем коммит в
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 содержит манифесты различных приложений
- ArgoCD ваш компакт-диск смотрит только git:bar
- Ваша система сборки CI отслеживает git:foo на наличие изменений, например веток, коммитов, pr.
- В рамках сборки CI он создает новый контейнер и загружает его в реестр контейнеров с моим любимым тегом «ГГГГММДД-BuildId-ShortGitHash».
- Волшебство ✨, затем CI проверяет git:bar и обновляет соответствующую конфигурацию с новым тегом контейнера и фиксирует изменение, это запускает ArgoCD.
- ArgoCD обнаруживает изменения в git:bar и вносит необходимые изменения в k8s, чтобы развернуть новый контейнер.