Эта серия блогов посвящена представлению сложных проектов DevOps как простых и доступных с помощью простого языка и множества изображений. Ты можешь это сделать.

GitHub, вездесущий инструмент для хранения облачного кода, вышел на рынок CI / CD в середине 2019 года. Их убийственная особенность заключается в том, что ваш код, вероятно, уже хранится в GitHub, так почему бы им не управлять автоматическими действиями изначально, а не полагаться на другие более сложные методы, такие как веб-перехватчики или веб-скрапинг?

Это совсем не страшный аргумент. Почти все ИТ-специалисты слышали о GitHub, и большинство из них использовали его. Это очень удобно для проектов с открытым исходным кодом, и это дружелюбие продолжается с GitHub Actions - они бесплатны для репозиториев с открытым исходным кодом.

Это не означает, что для частных репо это дорого. Ценообразование основано на том, сколько минут потребляется в месяц, при этом большое количество минут предоставляется бесплатно для подключения новых пользователей, а затем простая поминутная оплата в зависимости от типа инстанса. И, как и в случае с другими поставщиками облачных CI / CD, вариант с самостоятельным размещением (когда вы запускаете свой собственный хост-компоновщик) на 100% бесплатен.

В этом блоге мы:

  • Создайте пользователя IAM в AWS с разрешениями на выполнение любых действий
  • Bootstrap AWS с бакетом S3 (для хранения терраформ) и таблицей DynamoDB для блокировки состояния терраформ
  • Настройте новый репозиторий GitHub
  • Сохраните ключ IAM и секретный ключ как зашифрованные ключи в GitHub, чтобы действия могли их использовать.
  • Создайте некоторые действия GitHub, которые выполняют автоматический план терраформирования, когда код фиксируется в нашем репозитории.

Давайте начнем. Ты можешь сделать это.

Пользователь IAM + сегмент S3 / начальная загрузка таблицы DynamoDB

Когда мы говорим о различных платформах CI / CD, часто возникает потребность в загрузке Terraform, работающей с CI / CD, в AWS. Ему требуются разрешения (пользователь IAM), место для хранения файла состояния (корзина S3) и таблица для отслеживания блокировки состояния для предотвращения конфликтов изменений (DynamoDB).

Поскольку эта информация дублируется в каждом из этих блогов, я создал отдельный блог для этой темы. Пожалуйста, проработайте это, чтобы создать пользователя IAM, корзину S3 и таблицу DyanmoDB в AWS, затем загрузите файл состояния в корзину S3, а затем вернитесь сюда, чтобы продолжить.

Создайте новый репозиторий GitHub

Неудивительно, что для использования действий GitHub вам понадобится репозиторий GitHub. Итак, давайте создадим его.

Если у вас никогда не было аккаунта на GitHub, купите его. #CodeIsLife. Когда закончите, возвращайтесь сюда, и мы создадим репо.

После входа в систему щелкните вверху справа на знаке «плюс», затем на «Новый репозиторий».

Назовите репозиторий - он должен быть уникальным в пределах вашей учетной записи. Вы можете добавить необязательное описание и указать, является ли репо общедоступным или частным. Я начну с публики, так как это проще всего. Поскольку действия будут выполняться автоматически на основе кода, загруженного в этот репозиторий, рекомендуется изучить частные репозитории и узнать, как их использовать. Не выбирайте ни один из вариантов «инициализировать репо» внизу.

Репо теперь пусто и его нужно как-то инициализировать. GitHub имеет удобную функцию, которая может реплицировать код на стороне сервера из другого проекта. Мы можем использовать мой общедоступный проект с некоторой базовой конфигурацией AWS terraform и базовым файлом .gitignore. Выберем внизу вариант «импортировать код».

Введите общедоступное хранилище для нашего базового кода AWS (или загрузите собственную действующую конфигурацию TF AWS), указав этот URL-адрес в качестве URL-адреса клона старого репозитория. Затем нажмите Начать импорт.

Примерно через 2 минуты вы получите электронное письмо о завершении импорта. Вы также можете обновить свою страницу, чтобы проверить статус. Вы можете нажать на ссылку, чтобы увидеть заполненное репо. Обратите внимание на URL репо - нам нужно будет связать с ним Terraform Cloud через минуту.

Действия Terraform в… действии

Вы попадете в ваш новый блестящий репозиторий на GitHub. Щелкните вкладку «Действия», и вы должны увидеть рабочий процесс «Применить Terraform». Это было создано автоматически из-за файла, который мы импортировали из моего исходного репозитория в .github / workflows / TerraformApply.yml. Он будет запускаться автоматически каждый раз при обновлении любого файла в этом репо, включая его собственный файл, но не будет работать, пока мы не добавим некоторые секреты.

Добавим наши секреты. Секреты хорошо обрабатываются в GitHub Actions - они хранятся локально, зашифрованы и недоступны по большинству параметров. Они исключаются из журналов действий и не читаются в графическом интерфейсе. Это идеальное место для нашего ключа доступа и секретного ключа доступа.

Нажмите кнопку «Добавить новый секрет», чтобы создать его. Вы добавите секретное имя и значение для каждого секрета. Используйте точные имена AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, иначе вам нужно будет обновить ссылки на переменные среды yaml Actions.

Когда вы закончите, это будет выглядеть так:

Теперь давайте пройдемся по YML-файлу GitHub Actions. Yaml - это структурный язык, такой как JSON, и он используется здесь для описания различных шагов, которые мы хотим, чтобы наш размещенный на GitHub контейнер выполнял.

Сначала мы даем ему имя. Он отличается от имени файла и отображается в GitHub.

Во-вторых, мы обеспечиваем триггер для того, когда должно выполняться это действие. Мы используем Push, что означает, что если какой-либо файл во всем этом репо вообще обновляется в главной ветке, это действие будет выполнено. Есть много других триггеров включения, которые можно использовать, проверьте их здесь.

В следующей части файла описаны задания, которые должен выполнять контейнер. Мы называем его (terraform_apply) и устанавливаем продолжение. Мы используем последнюю версию Ubuntu (в настоящее время Ubuntu 18.04), но доступна Ubuntu 16.04, а также Windows Server 2019 и Mac. список доступных строителей здесь.

Мы также предоставляем первый шаг, который заключается в проверке кода из нашего локального репозитория, в котором находится хост GitHub Action. Это необходимо для большинства возможных вариантов использования.

Затем нам нужно описать первую задачу, которую мы хотим, чтобы наш контейнер выполнял, которая называется «шаг» на языке действий. Сначала мы устанавливаем переменную окружения в блоке «env» - версию terraform. Это жестко запрограммировано в нашем скрипте и может быть обновлено только в этом единственном месте, а не в каждой команде, которая на него ссылается.

Затем у нас есть блок «запустить». Вы можете ссылаться на одно направление команды, например run: echo hello world, но если вы хотите запустить несколько команд за один шаг, вы используете блок run: |, а затем отделяете каждую команду возвратом. Мы загружаем версию TF прямо из HashiCorp, распаковываем ее, а затем перемещаем в наш локальный путь exec.

ОБНОВЛЕНИЕ. Читатель Джоэль отмечает, что программы-исполнители GitHub Actions теперь включают предустановленный terraform, поэтому вам не нужно устанавливать его с помощью этих шагов. Это может быть полезно, если вам нужно указать конкретную версию terraform.

Затем мы начинаем делать вещи с Terraform. Вы увидите несколько блоков - сначала простой terraform --version для проверки правильности установки нашей версии, затем мы инициализируем terraform. Мы используем те же переменные среды, которые мы использовали, когда были локальными для нашего компьютера - ключ доступа и секретный ключ доступа. Затем мы проверяем и применяем терраформу.

Предупреждение: помните, что перед отправкой изменений нет шага утверждения. Это отлично для лаборатории и ужасно для производства. Я не могу найти инструментов, которые разрешают двухэтапный этап с этапом утверждения посередине или запуски ручного «применения». GitHub работает над этим, но по состоянию на середину ноября 2019 года его еще нет.

Давай что-нибудь построим

Теперь, когда GitHub Actions создан для Terraform, а Terraform подключен к AWS, давайте создадим некоторые ресурсы в AWS.

Щелкните вкладку «Код» в верхней части страницы репозитория, а затем - файл terraform main.tf. Вы найдете несколько ресурсов, которые закомментированы с помощью /* многострочного комментария. Нажмите на карандаш в правом верхнем углу, чтобы войти в режим редактирования.

Удалите строку /* Commented out until after bootstrap, а также */ в самом конце. Когда все будет готово, это будет выглядеть так:

Если хотите, введите комментарий и описание внизу в поле «Принять изменения» и нажмите «Принять изменения». Мы хотим напрямую заняться мастером в этой лабораторной среде.

Перейдите на вкладку Действия, и вы увидите, что наше Terraform Apply действие обработало файлы изменений и, если все пойдет хорошо, создаст для нас ресурсы в AWS.

Нажмите «Terraform Apply» справа, чтобы перейти к бегу и просмотреть журналы. Вы можете развернуть каждый шаг, чтобы увидеть точную обратную связь и стандартный вывод интерфейса командной строки для каждого шага. Разверните шаг Terraform apply, чтобы увидеть, что каждый элемент создан в Terraform.

Перейдите в Консоль AWS, и вы увидите новые ресурсы.

Там большой мир

С помощью GitHub Actions вы можете делать множество других вещей - вот библиотека готовых пакетов для интересных вещей.

Я был бы впечатлен, если бы вам удалось использовать его в течение 1000 бесплатных минут в месяц, но если вы хотите проверить свое использование здесь.

А если вам интересно узнать о CI / CD у других поставщиков, ознакомьтесь с некоторыми другими, которые я создал:

Удачи тебе.
Кайлер