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

Цель этого поста — настроить конвейер CI/CD с помощью Github Actions, чтобы каждая фиксация, сделанная в основной ветке, запускала набор действий для запуска нашего кода и развертывания в Elastic Beanstalk, если все действия пройдены. кодовая база будет ниже. Во-первых, обратите внимание, что Docker-compose было полностью объяснено в моем предыдущем посте. Кроме того, концепции Elastic Beanstalk и eb cli были объяснены в предыдущем посте.







Настройка действий Github

Действия Github позволяют нам выполнять действия и команды каждый раз, когда какой-либо конкретный объект даже срабатывает против нашей кодовой базы в виртуальной среде. Действия Github настраиваются в <file_name>.yml в каталоге /.github/workflows/.

Перейдите в личный репозиторий Github и нажмите Action. Github предлагает несколько шаблонов того, как запустить workflow, это полезно, если нам нужны специфичные для языка команды (npm) для запуска таких событий, как test or builds. Однако в этом случае требуется только взаимодействие с Docker и AWS.

Чтобы создать пользовательскую настройку, flow нажмите set up a workflow yourself и воспользуйтесь строкой поиска для поиска полезных действий. Действия в Marketplace имеют открытый исходный код и значительно снижают сложность. Все рабочие процессы будут иметь структуру имени, события и задания.

#NAME
name: Push images to Dockerhub and deploy on ELastic Beanstalk
#EVENT
on:
 push:
  branches:
   - master
#JOBS
jobs:
 build_docker_images:
  name: build docker images
  runs-on: [ubuntu-latest]
  steps:
   - name: checkout
     uses: actions/checkout@v2
     ...

Раздел событий запускается по термину on и может быть настроен для запуска по величине различных событий Github. В частности, этот workflow будет запускаться каждый раз при отправке ветки master. Затем раздел заданий обозначается термином jobs, где каждое job имеет имя вроде build_docker_images. У каждого задания есть OS, на котором оно выполняется. Кроме того, каждое задание имеет набор steps со свойством имени. Мы используем термин uses для извлечения из справки действий с открытым исходным кодом, таких как клонирование репо в шаг или вход в докер.

Чтобы Elastic Beanstalk успешно развернул содержимое коммита git, первым шагом будет настройка действия Github для сборки и отправки новых образов в DockerHub.. Это означает, что нам нужно будет войти в Dockerhub в виртуальной среде Github. Мы можем использовать другое действие сообщества, docker/[email protected], для входа в нашу учетную запись Docker. {{secrets.DOCKERHUB_USERNAME}} извлекается из секретов, зашифрованных в нашем профиле Github — в основном env переменных.

- name: Docker Login
  uses: docker/[email protected]
  with:
   username: ${{secrets.DOCKERHUB_USERNAME}}
   password: ${{secrets.DOCKERHUB_TOKEN}}
   logout: true

Теперь, когда у нас есть доступ к нашей учетной записи Dockerhub, все, что осталось, — это создать и отправить наши образы в их репозитории. При отправке изображений в Dockerhub приведенные ниже команды будут создавать, помечать и отправлять образ, созданный из Dockerfile в каталоге.

docker build -t keithkfield/blog-server . 
docker tag keithkfield/blog-server keithkfield/blog-server:latest
docker push keithkfield/blog-server:latest

Эти три команды должны быть единственными тремя, необходимыми для отправки образов, созданных из нашего исходного кода, в Dockerhub.

- name: Build Server image
  run: docker build -t keithkfield/blog-server -f
             ./Server/Dockerfile ./Server
- name: Tag our Image
  run: docker tag keithkfield/blog-server 
             keithkfield/blog-server:latest
- name: Push to dockerhub
  run: docker push keithkfield/blog-server

Теперь просто повторите эти три шага для контейнеров client и nginx.

Использование АВС

После того, как наши образы будут постоянно развертываться, нам потребуется доступ к нашей учетной записи Amazon Web Service. Опять же, мы можем использовать другое действие с открытым исходным кодом — einaregilsson/beanstalk-seploy@v14.

- name: Deploy to EB
  uses: einaregilsson/beanstalk-deploy@v14
  with:
   aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
   aws_secret_key: ${{ secrets.AWS_ACCESS_SECRET_KEY }}
   application_name: medium-compose-series
   environment_name: Mediumblogseries-dev
   version_label: "app-cbe0-210131_121135"
   region: us-east-1

Мы извлекаем aws_access_key и aws_secret_key из наших зашифрованных секретов. application_name, enviorment_name, and version_label будет получен в процессе создания приложения Elastic Beanstalk.

Создание эластичного приложения Beanstalk

Чтобы этот процесс работал, нам нужно заранее создать имя приложения и среды. Для запуска используйте команду

eb init -r <region> <application_name>

начать процесс создания приложения.

Единственная конфигурация, которая должна отличаться от стандартной, — это вопрос о платформе. Вместо 1 по умолчанию это приложение Multi-container Docker,, поэтому выберите 2.

Select a platform branch.
1) Docker running on 64bit Amazon Linux 2
2) Multi-container Docker running on 64bit Amazon Linux
3) Docker running on 64bit Amazon Linux

После этой команды init будет каталог .elasticbeanstalk с файлом config.yml. В aws файл Dockerrun.aws.json указывает, как должны работать несколько контейнеров в приложении.

Dockerrun.aws.json напоминает файл Docker-compose. Его формат .json, и все его контейнеры перечислены в ключе containerDefinitions. Суть в том, что только образ keithkfield/blog-nginx имеет сопоставление портов и связывает образы client и server.

Теперь, когда файл конфигурации Dockerrun создан, мы можем использовать команду

eb create <enviorment-name> 

для создания переменной окружения. Выполнение этой команды ищет инструкции в Dockerrun.aws.json. Во-первых, он отмечает, что AWSEBDockerrunVersion имеет значение 3,, это означает, что это мультиконтейнерное приложение. Elastic beanstalk извлекает все три образа из dockerhub и объединяет их вместе в соответствии с конфигурацией балансировщика нагрузки nginx. Этот процесс занимает некоторое время, но устанавливает базовое приложение, из которого мы можем построить.

Соединить

Теперь, когда мы определили имя приложения и среды, мы можем поместить их на последний шаг нашего рабочего процесса. Остается только получить метку версии. Чтобы получить это, выполните команду

eb appversion

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

Моя последняя команда в моем рабочем процессе ниже.

Активация потока

Чтобы просто активировать этот поток, отправьте эти изменения в основную ветку. Это запускает действие с именем коммита на вкладке actions. Через несколько минут мы можем проверить консоль Elastic Beanstalk, чтобы получить сгенерированный URL-адрес и посетить сайт.

Успешно, наше приложение здорово! Теперь внесение любых изменений в пользовательский интерфейс и их отправка приведут к развертыванию того же приложения.

Успех!!

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

Потребовалось 30 потоков, чтобы мой конвейер CI/CD заработал идеально.