Автоматизация конвейера развертывания всегда является сложной задачей. Это требует больших усилий при настройке сервера для нескольких сред, подготовки сборки и внедрения одной и той же сборки на сервер.
Мы пойдем на настройку простых конвейеров развертывания, чтобы вы могли построить из этого.
вступление
В этом посте я собираюсь показать вам, насколько легко можно сделать конвейер развертывания для их следующего приложения, просто скопив исходный код. Мы будем использовать простое приложение Nodejs Dockerized для размещения в Cloud Run. К концу этого чтения вы сможете сделать развертывание для любого языка.
В этом уроке мы будем использовать следующие стеки -:
Реестр контейнеров -: Он хранит все изображения Docker, которые будут использоваться в облачном запуска
Google Storage -: Это спасет наше состояние Terraform.
Облачный запуск -: Без сервера платформа где будет размещено наше последнее приложение
Terraform -: Это поможет нам развернуть экземпляр Cloud Run и создать несколько рабочих сред, таких как постановка и производство
Go -: Это поможет нам запустить команду Terraform, когда мы хотим с помощью GitHub Actions
Действия GitHub -: Это поможет нам в качестве точки входа, чтобы вызвать команду GO GO и GO, запустит Terraform
Почему облако бежать, иди и терраформ?
Облачный запуск
Cloud Run — это управляемая вычислительная платформа, которая позволяет запускать контейнеры и Google Scales Containers в соответствии с запросом, и вы платите за использование. Управление накладными расходом инфраструктуры обрабатывается самим Google, поэтому мы можем сосредоточиться на создании приложений. Google имеет отличный док в Облачный запуск
Идти
GO — очень популярный язык программирования в наши дни из -за его быстрой, надежной и простой архитектуры. С Go мы можем генерировать двоичные файлы, которые будут выполняться, не установив ничего, поэтому эта функция довольно удобна при работе с ОС
Терраформ
Terraform — это инструмент для безопасной и эффективной инфраструктуры построения, изменения и управления версиями. Таким образом, с помощью Terraform мы можем построить инфраструктуру, как мы строим приложение с кодом, т.е. Инфраструктура как код Анкет
Предположения
Вы знакомы с тем, как идти работает
Вы знакомы с тем, как работает Cloud Run, то есть указание изображения контейнера. Если не проверьте эту статью https://ujwaldhakal.medium.com/automate-cloud-run-meployment in-minute-cb85e7db9f82
Вы знакомы с тем, как Terraform раскрывает новый сервер и как Terraform управляет состоянием
Вы знакомы с приложением.
Учебное пособие по развертыванию
Мы будем строить трубопроводы развертывания в следующих четырех шагах::
1. Dockerize Приложение
Во -первых, мы создадим приложение и рассмотрим его. Давайте создадим index.js файл в каталоге SRC и создадим ответ Hello World.
index.js
2. Настройка инфраструктуры с Terraform
Во -первых, мы напишем Terraform File, где мы сообщим Terraform, чтобы раскрутить экземпляр Cloud Run. Давайте создадим проект GitHub и создадим CICD папки, в которой необходимо для TerraForm, чтобы создать экземпляр Cloud Run с данным изображением.
terraform apply -var image_tag=docker_image_tag -var-file=dev.tfvars -auto-approve
Как только мы сможем подтолкнуть изображение Docker в реестр контейнеров, мы сможем использовать это, но мы хотим сделать его более простым и автоматизированным, как если бы мы могли развернуть. Имя ветви в GIT. Давайте поработаем над несколькими файлами для достижения этого
3. Вызвать терраформ с Go
С GO мы можем создавать двоичные файлы, которые будут работать без установки дальнейших зависимостей. GO построит изображение Docker и отправит его в реестр контейнеров, если изображение не существует в реестре, и запустите Terraform для развертывания нового изображения для запуска облака.
Я использую https://github.com/ujwaldhakal/gcp-deployment-utils Этот пакет для всех утилит в этой демонстрации. Получение хэша коммита текущей ветви, вход в реестр контейнеров и разжигание изображений выполняются в результате go-gcp-docker-utils упаковка.
Если вы посмотрите на https://github.com/ujwaldhakal/gcp-deployment-utils/blob/master/docker/docker.go#lc24 Эта функция сборки внимательно существует ** Target ** Использование в файле Docker из -за того, что сборка будет отличаться в производственной и локальной среде, поэтому убедитесь, что вы используете ** Target * * В вашем файле Docker.
Внутренняя функция initterraform
cmd := exec.Command("terraform", "init", "-backend-config", "bucket=tf-test-app")
tf-test-app это название нашего ведра, которое нужно создавать вручную в облачном хранилище
Этот Deployer.go генерирует развертывание, используя go build deployer.go. Deploy Binary ожидает один параметр, который является средой имени, и он подготовит сервисную учетную запись json dev-cred.json, dev.tfvarsand github Commit Hash, который будет использоваться на Terraform. После этого он попытается проверить, существует ли изображение, которое мы пытаемся создать, уже или нет. Если это уже существует, это не будет построить. Если нет, это будет строить и толкать. И, наконец, это будет применяться к Terraform с данными учетными данными.
Поскольку он будет работать в действии GitHub после того, как проверится в филиале с данным названием ветви с ./cicd/deploy dev Master. Мы будем использовать тот же хэш для коммита для создания тега в изображении Docker и использовать то же изображение для развертывания. ПРИМЕЧАНИЕ: Убедитесь, что у вашего IAM JSON есть услуга для чтения ведра, создания и уничтожения облачного запуска, прочитать и добавить изображения контейнеров в реестр Google Containers
Если вы хотите изменить что -нибудь, вы можете просто скопировать ту же функцию из пакета UTILS и вставить его в свой фактический проект и начать использовать свой собственный вместо использования пакета
4. Склейте все с помощью GitHub Action и Bash File
Наконец, эти две вещи будут работать внутри контейнера действия GitHub на триггере команды, т. Е. Развертывание Dev Master. Как мы недавно создали DeployBash внутри CICD, который будет обрабатывать нашу команду Deploy Master и триггеры GitHub Repository Dispatch который запустит развертывание. Действие GitHub будет заказано в филиале, данном в команде Deploy, и это запустит бинар Deployer с именем среды и, как мы уже обсуждали, как развертыватель. Go
обрабатывает входящий запрос
Чтобы запустить это, вам нужно получить GitHub Personal Token Следуйте Ссылка Чтобы получить один, и положите его в файл .env. Обычно мы не отслеживаем файл .ENV на GIT, поэтому для этой цели я настаиваю его на GitHub
После того, как вы запустите эту команду ./cicd/deploy dev Master, Deploy File запустит GitHub Action Deploy.ymlPass те разработки и главных аргументов, где действие GitHub будет оказаться в соответствии с данной филиалом, то есть мастером, и передает имя среды, чтобы развернуть. Github. Анкет Как только двоичные файлы узнают хэш -хэш и название окружающей среды, он загрузит необходимые учетные данные, а запустить Terraform применяется с новой чертой изображения, и для размышлений потребуется минуты.
Вы увидите зеленую галочку рядом с текстом развертывания, как только ваше развертывание будет успешным. Вы можете найти ссылку на действие в https://github.com/username/reponame/actions
Добавьте больше сред
Мы видели только одну среду, т. Е. ** Дев. * *Но с большим количеством членов команды нам понадобится больше среды, которая может быть производством, постановкой, Test1, Test 2 на основе ваших предпочтений.
Добавить больше среды просто, так как просто копирование файлов конфигурации и их редактирование, так как большая часть сложной части уже сделана, то есть создание и запуск с одной средой. Теперь нам просто нужно создать отдельные учетные данные с учетной записью службы, создав отдельный проект из одной и той же учетной записи в Google Cloud и сделать их доступными в ** Deployer. Go **, как мы делали для Dev и Production, и вы можете добавить больше среды либо с помощью шаблона IF-ELSE, либо просто передать динамическую переменную к имени среды, то есть $ {среда} .tfvars и учетные данные/$ {среда} -cred. json.
Примечание -: Если мы не хотим создавать несколько облачных проектов Google для обработки нескольких сред, мы можем использовать Terraform State обрабатывать несколько среда с одним и тем же проектом.
func getTfVarFileName(env string) string { if env == "dev" { return "dev.tfvars" } if env == "production" { return "prof.tfvars" } panic("Please select correct environment only dev & production available at the moment") } func getCredentialsFilePath(env string) string { if env == "dev" { return "credentials/dev-cred.json" } if env == "production" { return "credentials/prod-cred.json" } panic("error on loading credentials") }
Эта демонстрация не охватывает какую -либо автоматизацию DNS добавления домена и проверки в облачном запуска. Поскольку для разоблаченных учетных данных не проводится шифрование, пожалуйста, не используйте этот подход в общественных репозиториях. Используйте это только в частных репозиториях.
Если вы хотите зашифровать учетные данные, вы можете использовать Google KMS зашифровать с помощью ключа и расшифровать с помощью ключа при использовании его для аутентификации в Google Cloud.
Вывод
Это всего лишь основная идея о том, как сделать CI/CD с минимальными инструментами. При таком подходе можно сделать CI/CD для обычного применения в компании, прикрепить другие сервисы Google в Terraform, такие как Cloud SQL, Redis и т. Д.
Особая благодарность и кредиты Ujjwal ojha за то, чтобы помочь мне понять и сделать CI/CD
Позвольте мне знать ваши мысли!
Источник -: https://github.com/ujwaldhakal/cloud-run-cicd-boilerplate
Оригинал: «https://dev.to/ujwaldhakal/build-a-simple-automated-deployment-pipeline-for-cloud-run-step-by-step-tutorial-211d»