Вопрос или проблема
Я хотел бы использовать terraform для управления репозиториями в организации github. При использовании ресурса github_repository
для создания репозиториев и ресурса github_issue_labels
для управления метками я сталкиваюсь со следующей проблемой:
- Создание репозитория с помощью
github_repository
заполнит репозиторий набором стандартных меток. - Я использую
github_issue_labels
для управления как стандартными метками, так и несколькими другими. Это приводит к конфликтам при первом применении ресурса, поскольку стандартные метки были созданы github. - Я не могу импортировать ресурс
github_issue_labels
до создания репозитория, потому что он еще не существует.
Это означает, что процесс создания репозитория выглядит следующим образом:
- Запустить
terraform apply
, который завершится неудачей на этапе меток. - Запустить
terraform import
для импорта меток. - Запустить
terraform apply
повторно, и теперь он будет успешным.
Это делает задачу автоматизации очень сложной.
Мне кажется, что я упускаю что-то простое. Какой правильный способ решения этой проблемы?
Ответ или решение
Управление репозиториями GitHub через Terraform, особенно в рамках организации, может сопровождаться рядом сложностей и конфликтов, как упомянуто в вашем описании. Давайте подробно разберем теоретические аспекты, приведем примеры и предложим практический подход к решению ваших проблем с управлением репозиториями и метками на GitHub.
Теория
Управление ресурсами GitHub через Terraform
Terraform позволяет управлять многими ресурсами GitHub, предоставляя разработчикам инфраструктуры как кода (IaC) мощные инструменты автоматизации. С помощью провайдера GitHub в Terraform можно создавать репозитории, управлять доступом, разрабатывать webhooks и управлять метками для упрощения рабочих процессов.
Конфликты между github_repository
и github_issue_labels
Основная задача в вашем случае связана с тем, что при создании репозитория github_repository
по умолчанию создаются стандартные метки. Когда вы пытаетесь управлять этими же метками через github_issue_labels
, возникает конфликт из-за попытки повторного создания уже существующих меток GitHub. Terraform, не зная, что метки уже присутствуют, пытается их добавить, что приводит к ошибке при применении. У существующих меток уже есть идентикаторы в системе GitHub, что требует их "импорта" для корректного учета в Terraform, если вы хотите достичь целевой конфигурации.
Пример
Предположим, вы хотите создать репозиторий под названием my-awesome-repo
и управлять набором меток, которые включают как дефолтные метки GitHub (такие как bug
, enhancement
), так и пользовательские (feature-request
, например). Здесь возникает проблема: дефолтные метки уже присутствуют после создания репозитория, и Terraform не сможет их создать вновь без импорта.
Применение
Чтобы модифицировать рабочий процесс и устранить необходимость ручного вмешательства, можно принять несколько стратегий:
-
Импорт меток в автоматическом режиме через скрипты:
Разработайте скрипт, который выполняется в цепочке автоматизации для импорта меток после создания репозитория, а затем вновь запускает
terraform apply
. Этот способ сохраняет процесс автоматизированным, но требует дополнительного скриптового решения.Вот пример bash скрипта:
#!/bin/bash # Создаем репозиторий terraform apply -target=github_repository.my_awesome_repo # Импортируем существующие метки existing_labels=$(gh label list -R my-org/my-awesome-repo --json name) for label in $(echo "${existing_labels}" | jq -r '.[] | @base64'); do _jq() { echo ${label} | base64 --decode | jq -r ${1} } terraform import github_issue_label.my_awesome_repo_label[\"$(_jq '.name')\"] my-org/my-awesome-repo:$(_jq '.name') done # Применяем остальную конфигурацию terraform apply
-
Создание репозитория без стандартных меток:
К сожалению, на текущий момент GitHub не предоставляет API для отключения создания стандартных меток. Однако, потенциальное решение может состоять в использовании API для удаления дефолтных меток сразу после их создания, если это допустимо.
-
Программное управление метками:
Используйте скрипты или отдельные инструменты управления метками и синхронизируйте их состояние с Terraform после репозитория, решая конфликт вручную лишь один раз. Этот подход может стать частью большого CI/CD процесса, где изменения меток недостаточно часты, чтобы существенно повлиять на их автоматизацию.
-
Обработка через условные операторы Terraform:
Рассмотрите работу с модулями и условными операторами, чтобы избежать попыток создания меток при первоначальном применении ресурса. Это может потребовать использования дополнительных модулей Terraform или частей кода, например, выводов для отслеживания состояния ресурса.
Заключение
Сквозной процесс автоматизации применения Terraform для управления метками в репозиториях GitHub может быть оптимизирован использованием комбинации скриптирования, импорта существующих ресурсов и обдуманной архитектуры кода Terraform. Важно также учитывать возможность использования новых фич GitHub или обновлений Terraform, так как платформа регулярно получает обновления, которые могут в будущем упростить подобные задачи.
Эти рекомендации помогут вам создать высокоавтоматизированный процесс, минимизирующий ручные вмешательства и обеспечивающий целостность ваших IaC решений.