Изучите пошаговый процесс развертывания примера контейнерного приложения Nodejs.

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

Чтобы показать вам, о чем я говорю, в этой статье я расскажу, как создать конвейер CI/CD с Jenkins, контейнерами и Amazon ECS, который развертывает ваше приложение и преодолевает ограничения традиционной модели доставки программного обеспечения.

Это новшество существенно влияет на сроки, время выхода на рынок, качество продукта и т. д. Я проведу вас через пошаговый процесс настройки Docker-конвейера CI/CD для примера приложения Nodejs.

Конвейер CI/CD (или конвейер непрерывной интеграции, непрерывной доставки) — это набор инструкций для автоматизации процесса тестирования, сборки и развертывания программного обеспечения. Вот несколько преимуществ внедрения CI/CD в вашей организации.

  1. Меньшее изменение кода
    Способность конвейеров CI/CD интегрировать небольшой фрагмент кода за раз помогает разработчикам распознавать любую потенциальную проблему до того, как будет выполнен слишком большой объем работы.
  2. Более быстрая доставка
    Несколько ежедневных или непрерывных выпусков могут быть реализованы с помощью конвейеров CI/CD.
  3. Наблюдение
    Наличие автоматизации, которая создает обширные журналы на каждом этапе процесса разработки, помогает понять, если что-то пойдет не так.
  4. Упрощенный откат
    Есть вероятность, что развернутый код может иметь проблемы. В таких случаях крайне важно как можно скорее вернуться к предыдущему рабочему релизу. Одно из наиболее значительных преимуществ использования конвейеров CI/CD заключается в том, что вы можете быстро и легко вернуться к предыдущему рабочему выпуску.
  5. Снижение затрат
    Автоматизация повторяющихся задач высвобождает время разработчиков и операторов, которое можно было бы потратить на разработку продукта.

Это лишь некоторые преимущества конвейеров CI/CD для сборок и развертываний. В этом видео вы можете продолжить изучение Преимуществ CI/CD и узнать, почему вам в первую очередь следует использовать CI/CD.

Теперь, прежде чем мы приступим к настройке конвейера CI/CD с Jenkins, контейнерами и Amazon ECS, давайте посмотрим, какие инструменты и технологии мы будем использовать.

Стек инструментов CI/CD Docker

  1. GitHub
    Это веб-приложение или облачная служба, где люди или разработчики сотрудничают, хранят и управляют кодом своего приложения с помощью Git. Здесь мы создадим и сохраним пример кода приложения Nodejs.
  2. Экземпляр AWS EC2
    AWS EC2 — это эластичный компьютерный сервис, предоставляемый Amazon Web Services, который используется для создания виртуальных машин или виртуальных экземпляров в облаке AWS. Мы создадим экземпляр EC2 и установим в него Jenkins и другие зависимости.
  3. Java
    Это потребуется для запуска Jenkins Server.
  4. AWS CLI
    AWS-CLI, т. е. интерфейс командной строки AWS, — это инструмент командной строки, используемый для управления сервисами AWS с помощью команд. Мы будем использовать его для управления задачей AWS ECS и службой ECS.
  5. Nodejs и Npm
    Nodejs — это внутренняя среда выполнения JavaScript, а Npm — менеджер пакетов для Node. Мы создадим Docker-конвейер CI/CD для приложения Nodejs.
  6. Docker
    Docker — это платформа контейнеризации с открытым исходным кодом для разработки, доставки и запуска приложений. Мы будем использовать его для создания Docker-образов нашего примера приложения Nodejs и отправки/получения их в/из AWS ECR.
  7. Jenkins
    Jenkins — это свободно доступный сервер автоматизации с открытым исходным кодом, используемый для создания, тестирования и развертывания программных приложений. Используя Jenkins, мы создадим наш конвейер CI/CD Docker для сборки, тестирования и развертывания нашего приложения Nodejs на AWS ECS.
  8. AWS ECR
    AWS Elastic Container Registry — это репозиторий образов Docker, полностью управляемый AWS, который позволяет легко хранить, совместно использовать и развертывать образы контейнеров. Мы будем использовать AWS ECR для хранения образов Docker нашего примера приложения Nodejs.
  9. AWS ECS
    AWS Elastic Container Service – это служба оркестрации контейнеров, полностью управляемая AWS, позволяющая легко развертывать контейнерные приложения, управлять ими и масштабировать их. Мы будем использовать его для размещения нашего образца приложения Nodejs.

Читайте также: Конвейер CI/CD и рабочий процесс на AWS, Kubernetes и Docker

Архитектура

Наша архитектура будет выглядеть так после настройки CI/CD Pipeline с Docker.

После успешной настройки Docker Pipeline CI/CD мы отправим коммиты в наш репозиторий GitHub. В свою очередь GitHub Webhook активирует конвейер CI/CD на сервере Jenkins. Затем Jenkins Server извлечет последний код, проведет модульные тесты, создаст образ докера и отправит его в AWS ECR. После того, как образ будет растянут до AWS ECR, этот же образ будет развернут в AWS ECS компанией Jenkins.

Рабочий процесс и этапы CI/CD

Рабочий процесс

Рабочий процесс CI и CD позволяет нам сосредоточиться на разработке, в то время как тесты, сборка и развертывание выполняются автоматически.

  1. Непрерывная интеграция
    Это позволяет разработчикам передавать код в систему контроля версий или систему управления исходным кодом, создавать и тестировать последний код, отправленный разработчиком, а также создавать и хранить артефакты.
  2. Непрерывная доставка
    Этот процесс позволяет нам развертывать протестированный код в рабочей среде всякий раз, когда это необходимо.
  3. Непрерывное развертывание
    Это делает еще один шаг вперед и выпускает каждое изменение без какого-либо ручного вмешательства в систему клиента каждый раз, когда производственный конвейер проходит все тесты.

Фазы

Основная цель автоматизированного конвейера CI/CD — создание и развертывание самого последнего кода. Там могут быть различные этапы в соответствии с необходимостью. Наиболее распространенные из них упомянуты ниже:

  1. Триггер
    Конвейер CI/CD может выполнять свою работу по заданному расписанию при выполнении вручную или автоматически при определенном действии в репозитории кода.
  2. Извлечение кода
    На этом этапе конвейер извлекает последний код при каждом запуске конвейера.
  3. Модульные тесты
    На этом этапе конвейер выполняет тесты в кодовой базе, также называемые модульными тестами.
  4. Сборка или упаковка
    После того, как все тесты пройдены, конвейер движется вперед и создает артефакты или образы Docker в случае Dockerized приложений.
  5. Отправка или сохранение
    На этом этапе созданный код помещается в артефакторию или репозиторий Docker в случае с докеризированными приложениями.
  6. Приемочные тесты
    На этом этапе конвейера проверяется, работает ли программное обеспечение так, как задумано. Это способ убедиться, что программное обеспечение или приложение делают то, для чего оно предназначено.
  7. Развертывание
    Это заключительный этап любого конвейера CI/CD. На этом этапе приложение готово к доставке или развертыванию.

Стратегия развертывания

Стратегия развертывания — это способ удаления и добавления контейнеров микросервисов. Доступны различные варианты. Однако мы обсудим только те из них, которые доступны и поддерживаются ECS.

Последовательные обновления

При последовательных обновлениях планировщик в службе ECS заменяет текущие запущенные задачи новыми. Задачи в кластере ECS — это не что иное, как запущенные контейнеры, созданные на основе определения задачи. Конфигурация развертывания определяет количество задач, которые Amazon ECS добавляет или удаляет из сервиса.

Нижний и верхний предел количества задач, которые должны выполняться, управляются minimumHealthyPercent и maximumPercent соответственно.

  1. minimumHealthyPercent пример: если значение minimumHealthyPercent равно 50, а желаемое количество задач равно 4, то планировщик может остановить две существующие задачи перед запуском двух новых задач.
  2. maximumPercent пример: если значение maximumPercent равно 4, а желаемая задача 4 , то планировщик может запустить четыре новых задачи перед остановкой четырех существующих задач.

Чтобы узнать больше об этом, посетите официальную документацию здесь.

Сине-зеленое развертывание

Стратегия синего/зеленого развертывания позволяет разработчику проверить новое развертывание перед отправкой в ​​него трафика, установив обновленную версию приложения в качестве нового заменяющего набора задач.

В основном существует три способа смещения трафика во время синего/зеленого развертывания.

  1. Канарейка — трафик смещается в два этапа; процент трафика, перенесенного на ваш обновленный набор задач в первом приращении, и интервал в минутах, прежде чем оставшийся трафик будет смещен во втором приращении.
  2. Линейный — трафик смещается с равными приращениями, процент трафика смещается при каждом приращении и количество минут между каждым приращением.
  3. Все сразу — весь трафик сразу переносится с исходного набора задач на обновленный набор задач.

Чтобы узнать больше об этом, посетите официальную документацию здесь.

Из этих двух стратегий мы будем использовать стратегию развертывания последовательных обновлений в нашем демонстрационном приложении.

Dockerize приложение Node.js

Теперь давайте начнем и запачкаем руки.

Файл Dockerfile для примера приложения Nodejs выглядит следующим образом. Нет необходимости копировать и вставлять этот файл; он уже доступен в образце репозитория git, который вы клонировали ранее.

Попробуем разобраться в инструкциях нашего Dockerfile.

  1. FROM node:12.18.4-alpine
    Это будет наш базовый образ для контейнера.
  2. WORKDIR /app
    Это будет рабочий каталог в контейнере.
  3. ENV PATH /app/node_modules/.bin:$PATH
    Переменной PATH назначается путь к /app/node_modules/.bin.
  4. COPY package.json ./
    Package.json будет скопирован в рабочий каталог контейнера.
  5. ЗАПУСК npm install
    Установите зависимости.
  6. COPY . ./
    Скопируйте файлы и папки с зависимостями с хост-компьютера в контейнер.
  7. EXPOSE 3000
    Разрешить порт 300 контейнера.
  8. CMD [“node”, “./src/server.js”]
    Запустить приложение

Мы будем использовать этот файл Docker для создания образа Docker.

Настройка репозиториев GitHub

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

  1. Перейдите на https://github.com/ и создайте учетную запись. Если у вас его еще нет, войдите в свою учетную запись и создайте новый репозиторий. Вы можете назвать его по своему выбору; однако я рекомендую использовать одно и то же имя, чтобы избежать путаницы.

2. Вы получите следующий экран, скопируйте URL-адрес репозитория и держите его под рукой. Назовите этот URL-адрес URL-адресом репозитория GitHub и запишите его в текстовом файле в вашей системе.

Примечание. Создайте новый текстовый файл в своей системе и запишите все детали, которые потребуются позже.

Создайте токен GitHub

Это потребуется для аутентификации. Он будет использоваться вместо пароля для Git через HTTP или для аутентификации в API поверх обычной аутентификации.

  1. Нажмите на значок пользователя в правом верхнем углу, перейдите в «Настройки», затем нажмите «Настройки разработчиков» на левой панели.

2. Щелкните параметры «Токены личного доступа» и «Создать новый токен», чтобы создать новый токен.

3. Установите флажок репо; токен будет иметь полный контроль над частными репозиториями.

4. Теперь вы должны увидеть, что ваш токен создан.

Клонировать репозиторий образцов

  1. Проверьте текущий рабочий каталог.
    pwd

Примечание. Вы находитесь в домашнем каталоге, т. е. /home/ubuntu.

  1. Скопируйте мой тестовый репозиторий, содержащий весь необходимый код.
    git clone https://github.com/shivalkarrahul/nodejs.git
  2. Создайте новый репозиторий. Этот репозиторий будет использоваться для настройки конвейера CI/CD.
    git clone https://github.com/shivalkarrahul/demo-nodejs-app.git
  3. Скопируйте весь код из моего репозитория nodejs во вновь созданный репозиторий demo-nodejs-app.
    cp -r nodejs/* demo-nodejs-app/
  4. Смените рабочий каталог.
    cd demo-nodejs-app/

Примечание. Не меняйте каталог до конца статьи. Оставайтесь в том же каталоге. Вот он, /home/ubuntu/demo-nodejs-app/, и оттуда выполняйте все команды.

  1. ls -l
  2. git status

Отправьте свой первый коммит в репозиторий

  1. Проверьте свой текущий рабочий каталог; это должно быть то же самое. Вот оно, /home/ubuntu/demo-nodejs-app/
    pwd
  2. Установите имя пользователя для сообщения о коммите git.
    git config user.name “Rahul”
  3. Установите адрес электронной почты для сообщения о коммите git.
    git config user.email “<[email protected]>”
  4. Подтвердите имя пользователя и адрес электронной почты, которые вы указали.
    git config –list
  5. Проверьте статус и просмотрите файлы, которые были изменены или добавлены в ваш репозиторий git.
    git status
  6. Добавьте файлы в тестовую область git.
    git add
  7. Проверьте статус и просмотрите файлы, которые были добавлены в тестовую область git.
    git status
  8. Зафиксируйте свои файлы с сообщением о коммите.
    git commit -m “My first commit”
  9. Отправьте фиксацию в удаленный репозиторий git.
    git push

Настройка инфраструктуры AWS

Создайте пользователя IAM с программным доступом

  1. Создайте пользователя IAM с программным доступом в своей учетной записи AWS и запишите ключи доступа и секретные ключи в текстовом файле для дальнейшего использования. Предоставьте пользователю права администратора.
    Нам не нужен доступ администратора. Однако, чтобы избежать проблем с правами доступа и ради демонстрации, давайте продолжим с правами администратора.

Создайте репозиторий ECR

  1. Создайте репозиторий ECR в своей учетной записи AWS и запишите его URL-адрес в текстовый файл для дальнейшего использования.

Создайте кластер ECS

  1. Перейдите в консоль ECS и нажмите «Начать», чтобы создать кластер.

2. Нажмите кнопку «Настроить», доступную в пользовательской опции в разделе «Определение контейнера».

3. Укажите имя контейнера «nodejs-container», URL-адрес репозитория ECR в текстовом поле «Изображение», порт «3000» в разделе «Сопоставление портов», а затем нажмите кнопку «Обновить». Вы можете указать любое имя по вашему выбору для контейнера.

4. Теперь вы можете увидеть детали, которые вы указали в разделе «Определение контейнера». Нажмите кнопку Далее, чтобы продолжить.

5. Выберите Application Load Balancer в разделе Define your service и нажмите кнопку Next.

6. Оставьте имя кластера по умолчанию и продолжите, нажав кнопку Далее. Вы можете изменить имя кластера, если хотите.

7. Просмотрите конфигурацию, она должна выглядеть следующим образом. Если конфигурации совпадают, нажмите кнопку «Создать». Это инициирует создание кластера ECS.

8. Через несколько минут у вас должен быть создан кластер ECS, а статус запуска должен быть следующим.

Создайте экземпляр EC2 для настройки сервера Jenkins.

  1. Создайте экземпляр EC2 с Ubuntu 18.04 AMI и откройте его Port 22 для своего IP-адреса и Port 8080 для 0.0.0.0/0 в его группе безопасности. Порт 22 потребуется для ssh g\\\\\\\\\\\\\\\\h\ и 8080 для доступа к серверу Jenkins. Port 8080 — это место, где GitHub Webhook попытается подключиться к серверу Jenkins. Следовательно, нам нужно разрешить это для 0.0.0.0/0.

Настройте Jenkins на экземпляре EC2.

После того, как экземпляр будет доступен, давайте установим Jenkins Server и все зависимости.

Требования к инстансу EC2

  1. Убедитесь, что используется ОС Ubuntu 18.04 LTS
    cat/
  2. Проверьте оперативную память; нам требуется минимум 2 ГБ.
    free -m
  3. Пользователь, которого вы используете для входа на сервер, должен иметь привилегии sudo. «ubuntu» — это пользователь, доступный с привилегиями sudo для экземпляров EC2, созданных с использованием AMI «Ubuntu 18.04 LTS».
    whoami
  4. Проверьте свой текущий рабочий каталог; это будет ваш домашний каталог.
    pwd

Установите Java, процессор JSON jq, Nodejs/NPM и AWS-CLI в инстансе EC2.

  1. Обновите свою систему, загрузив информацию о пакетах из всех настроенных источников.
    sudo apt update
  2. Найдите и установите Java 11
    sudo apt search openjdk
    sudo apt install openjdk-11-jdk
  3. Установите команду jq, процессор JSON.
    sudo apt install jq
  4. Установите Nodejs 12 и NPM
    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash –
    sudo apt install nodejs
  5. Установите инструмент командной строки AWS.
    sudo apt install awscli
  6. Проверьте версию Java.
    java –version
  7. Проверьте версию jq.
    jq –version
  8. Проверьте версию Nodejs.
    node –version
  9. Проверьте версию NPM.
    npm –version
  10. Проверьте версию интерфейса командной строки AWS.
    aws –version

Примечание. Убедитесь, что все ваши версии соответствуют версиям, показанным на изображении выше.

Установите Jenkins на экземпляр EC2.

  1. Jenkins можно установить из репозитория Debian
    wget -q -O — http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -sudo sh -c ‘echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list’
  2. Обновите индекс пакета apt
    sudo apt-get update
  3. Установите Jenkins на машину
    sudo apt-get install jenkins
  4. Проверьте статус службы, чтобы узнать, запущена она или нет.
    service jenkins status
  5. Теперь у вас должен быть установлен Дженкинс. Вы можете обратиться к официальной документации здесь, если у вас возникнут проблемы с установкой.

Установите Docker на экземпляр EC2.

  1. Установите пакеты, чтобы разрешить apt использовать репозиторий через HTTPS:
    sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
  2. Добавьте официальный ключ GPG Docker:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  3. Настройте стабильный репозиторий
    echo “deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. Обновите индекс пакета apt
    sudo apt-get update
  5. Установите последнюю версию Docker Engine и containerd,
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  6. Проверьте версию докера.
    docker –version
  7. Создайте группу «докер»; это может выйти.
    sudo groupadd docker
  8. Добавить пользователя Ubuntu в группу Docker
    sudo usermod -aG docker ubuntu
  9. Добавить пользователя Jenkins в группу docker
    sudo usermod -aG docker jenkins
  10. Проверьте, можете ли вы создавать объекты Docker с помощью пользователя Ubuntu.
    docker run hello-world
  11. Переключитесь на пользователя root
    sudo -i
  12. Переключиться на пользователя Jenkins
    su jenkins
  13. Проверьте, можете ли вы создавать объекты Docker с помощью пользователя Jenkins.
    docker run hello-world
  14. Выйти из-под пользователя Jenkins
    exit
  15. Выйти из-под пользователя root
    exit
  16. Теперь вы должны вернуться к пользователю ubuntu. Вы можете обратиться к официальной документации здесь, если у вас возникнут проблемы с установкой.

Настройте сервер Дженкинс

  1. После установки Jenkins первым шагом является извлечение его пароля.
    sudo cat /var/lib/jenkins/secrets/initialAdminPassword

2. Нажмите URL-адрес в браузере
Jenkins URL: http://<public-ip-of-the-ec2-instace>:8080

3. Выберите вариант «Установить предлагаемые плагины».

4. Укажите имя пользователя и пароль для создаваемого нового пользователя-администратора. Вы можете использовать этого пользователя в качестве администратора.

5. Это поле URL будет заполнено автоматически; нажмите кнопку «Сохранить и закончить», чтобы продолжить.

6. Теперь ваш сервер Jenkins готов.

7. Вот как выглядит его панель инструментов:

Установить плагины

  1. Давайте установим все плагины, которые нам понадобятся. Нажмите «Управление Дженкинсом» на левой панели.

2. Вот список плагинов, которые нам нужно установить

  1. CloudBees AWS Credentials:
    позволяет хранить учетные данные и ключи Amazon IAM в Jenkins Credentials API.
  2. Docker Pipeline:
    Этот подключаемый модуль позволяет создавать, тестировать и использовать образы Docker из Jenkins Pipeline.
  3. Amazon ECR:
    Этот плагин обеспечивает интеграцию с AWS Elastic Container Registry (ECR)
    Использование:
  4. Шаги AWS:
    этот подключаемый модуль добавляет шаги пайплайна Jenkins для взаимодействия с API AWS.

3. Найдите все эти плагины на вкладке «Доступно» и нажмите «Установить без перезагрузки».

4. Вы увидите следующий экран после успешной установки плагинов.

Создание учетных данных в Jenkins

  1. Здесь на помощь придет плагин CloudBees AWS Credentials. Перейдите в Управление Jenkins и нажмите Управление учетными данными.

2. Нажмите «(глобальный)». Добавьте учетные данные.

3. Выберите «Вид» в качестве учетных данных AWS и укажите идентификатор в качестве пользователя demo-admin. Это может быть предоставлено по вашему выбору; сохраните этот идентификатор в текстовом файле. Укажите ключ доступа и секретный ключ пользователя IAM, которого мы создали на предыдущих шагах.

Нажмите OK, чтобы сохранить учетные данные IAM.

4. Выполните тот же шаг, но на этот раз выберите Тип в качестве имени пользователя с паролем, чтобы сохранить имя пользователя и токен GitHub, которые мы создали ранее.

Нажмите OK, чтобы сохранить учетные данные GitHub.

5. Теперь у вас должны быть учетные данные IAM и GitHub в вашем Jenkins.

Создать задание Дженкинса

  1. Перейдите на главную панель инструментов и нажмите «Новый элемент», чтобы создать конвейер Jenkins.

2. Выберите конвейер и назовите его demo-job или укажите имя по вашему выбору.

3. Установите флажок «Проект GitHub» на вкладке «Общие» и укажите URL-адрес репозитория GitHub, который мы создали ранее. Кроме того, установите флажок Триггер ловушки GitHub для опроса GitScm на вкладке Триггер сборки.

4. На вкладке Pipeline выберите сценарий Pipeline из определения SCM, укажите URL-адрес нашего репозитория и выберите учетные данные, которые мы создали для GitHub. Проверьте имя ветки, чтобы убедиться, что оно соответствует тому, которое вы будете использовать для своих коммитов.

Просмотрите конфигурации и нажмите Сохранить, чтобы сохранить изменения в конвейере.

5. Теперь вы можете видеть конвейер, который мы только что создали.

Интеграция GitHub и Jenkins

Следующий шаг — интегрировать GitHub с Jenkins, чтобы всякий раз, когда в репозитории GitHub происходит событие, оно могло запускать Jenkins Job.

  1. Перейдите на вкладку настроек репозитория и нажмите Webhooks на левой панели. Вы можете увидеть кнопку «Добавить веб-перехватчик»; нажмите на него, чтобы создать вебхук.

2. Укажите URL-адрес Jenkins с контекстом как /github-webhook/. URL-адрес будет выглядеть следующим образом.

URL-адрес веб-перехватчика: http://‹Jenkins-IP›:8080/github-webhook/
Вы можете выбрать события по вашему выбору. Однако для простоты я выбрал Отправить мне все.

Убедитесь, что установлен флажок «Активный».

Нажмите «Добавить веб-перехватчик», чтобы создать веб-перехватчик, который будет запускать задание Jenkins всякий раз, когда в репозитории GitHub происходит какое-либо событие.

3. Вы должны увидеть свой вебхук. Нажмите на него, чтобы увидеть, правильно ли он настроен или нет.

4. Нажмите на вкладку «Недавние доставки», и вы должны увидеть зеленую галочку. Зеленая галочка показывает, что веб-перехватчик может подключиться к серверу Jenkins.

Разверните приложение Nodejs в кластере ECS.

Прежде чем запускать Pipeline из GitHub Webhook, давайте попробуем запустить его вручную.

Создайте задание вручную

  1. Перейдите к заданию, которое мы создали, и создайте его.

2. Если вы увидите его журналы, вы узнаете, что это не удалось. Причина в том, что нам все еще нужно присвоить значения переменным, которые есть в нашем Jenkinsfile.

Нажмите на свой второй коммит

Напоминание: оставьте свой каталог таким же, как и для остальной части статьи. Оставайтесь в том же каталоге, то есть /home/ubuntu/demo-nodejs-app, и выполняйте все команды отсюда.

Присвойте значения переменной в Jenkinsfile

  1. Чтобы преодолеть вышеуказанную ошибку, вы должны внести некоторые изменения в файл Jenkins. У нас есть переменные в этом файле, и нам нужно присвоить значения этим переменным, чтобы развернуть наше приложение в созданном нами кластере ECS. Присвойте правильные значения переменным с CHANGE_ME.
    cat Jenkinsfile

2. Вот список переменных для вашего удобства.
У нас есть следующие переменные в Jenkinsfile.

  1. AWS_ACCOUNT_ID=”CHANGE_ME”
    Назначьте здесь номер своей учетной записи AWS.
  2. AWS_DEFAULT_REGION=”CHANGE_ME”
    Назначьте регион, в котором вы создали свой кластер ECS
  3. CLUSTER_NAME=”CHANGE_ME”
    Назначьте имя созданного вами кластера ECS.
  4. SERVICE_NAME=”CHANGE_ME”
    Назначьте имя службы, созданной в кластере ECS.
  5. TASK_DEFINITION_NAME=”CHANGE_ME”
    Назначьте имя задачи, созданной в кластере ECS.
  6. DESIRED_COUNT=”CHANGE_ME”
    Определение количества задач, которые вы хотите создать в кластере ECS.
  7. IMAGE_REPO_NAME=”CHANGE_ME”
    Назначение URL-адреса репозитория ECR
  8. IMAGE_TAG=”${env.BUILD_ID}”
    Не меняйте это.
  9. REPOSITORY_URI = “${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}”
    Не меняйте это.
  10. registryCredential = “CHANGE_ME”
    Назначьте имя учетным данным, созданным в Jenkins, для хранения ключа доступа AWS и секретного ключа.

3. Проверьте статус, чтобы убедиться, что файл был изменен.
git status
cat Jenkinsfile

4. Добавьте файл в промежуточную область git, зафиксируйте его, а затем отправьте в удаленный репозиторий GitHub.
git status
git add Jenkinsfile
git commit -m “Assigned environment specific values in Jenkinsfile”
git push

Ошибка на сервере Дженкинс

После нажатия фиксации сработает Jenkins Pipeline.

Однако вы увидите сообщение об ошибке «Отказано в доступе при попытке подключения к сокету демона Docker по адресу unix:///var/run/docker.sock» в задании Jenkins.

Это связано с тем, что пользователь Jenkins, который использует Jenkins Job, не может создавать объекты Docker. Чтобы разрешить пользователю Jenkins, мы добавили его в группу докеров на предыдущем шаге. Однако после этого мы не перезапускали службу Jenkins.

Я оставил это намеренно, чтобы показать вам необходимость добавления пользователя Jenkins в группу докеров в вашем экземпляре EC2.

Теперь вы знаете, что нужно сделать, чтобы преодолеть вышеуказанную ошибку.

  1. Перезапустите службу Jenkins.
    sudo service jenkins restart
  2. Проверьте, запущен ли сервис Jenkins.
    sudo service jenkins status

Нажмите на свой третий коммит

  1. Внесите некоторые изменения в README.md, чтобы зафиксировать, отправить и проверить, запускается ли Pipeline автоматически или нет.
    vim README.md
  2. Добавьте, зафиксируйте и отправьте файл.
    git status
    git diff README.md
    git add README.md
    git commit -m 'Изменен файл README.md для запуска задания Jenkins после перезапуска службы Jenkins.'
    git push

3. На этот раз вы можете заметить, что задание должно быть запущено автоматически. Перейдите к работе Дженкинса и проверьте то же самое.

4. Вот как выглядит представление сцены. Он показывает нам этапы, которые мы указали в нашем Jenkinsfile.

Проверьте статус задачи в кластере ECS

  1. Перейдите в Кластер, щелкните вкладку Задачи, а затем откройте запущенную Задачу.

2. Нажмите на вкладку JSON и проверьте образ; тег изображения должен соответствовать номеру сборки Jenkins. В данном случае это 6, что соответствует моему номеру Jenkins Job Build.

3. Нажмите URL-адрес ELB, чтобы проверить, доступно ли приложение Nodejs. Вы должны получить следующее сообщение в браузере после нажатия URL-адреса ELB.

Нажмите на четвертый коммит

  1. Откройте файл 'rc/server.js и внесите изменения в отображаемое сообщение, чтобы снова протестировать конвейер CI/CD.
    vim src/server.js
  2. Проверьте файлы, которые были изменены. В этом случае только один файл будет виден как измененный.
    git status
  3. Проверьте разницу, вызванную вашим изменением в файле.
    git diff src/server.js
  4. Добавьте файл, который вы изменили, в тестовую область git.
    git add src/server.js
  5. Проверьте состояние локального репозитория.
    git status
  6. Добавьте сообщение в фиксацию.
    git commit -m 'Обновленное приветственное сообщение'
  7. Отправьте изменения в удаленный репозиторий.
    git push

8. Перейти к задаче; на этот раз вы увидите две запущенные задачи — одну со старой версией и одну с новой версией. Вы видите две задачи из-за стратегии непрерывного обновления кластера, настроенной по умолчанию.

Примечание. Номера версий могут отличаться.

9. Подождите около 2–3 минут, и у вас должна быть запущена только одна задача с последней версией.

10. Снова нажмите URL-адрес ELB, и вы должны увидеть свои изменения. В данном случае мы изменили отображаемое сообщение.

Поздравляем! У вас есть работающий Jenkins CI/CD Pipeline для развертывания вашего контейнерного приложения Nodejs на AWS ECS всякий раз, когда в исходный код вносятся изменения.

Очистите созданные нами ресурсы

Предположим, вы пытались настроить конвейер CI/CD, чтобы ознакомиться с ним или для целей POC в своей организации, и он больше не нужен. В этом случае всегда лучше удалить ресурсы, которые вы создали при выполнении POC. Мы создали несколько ресурсов как часть конвейера CI/CD.

Мы создали список ниже, чтобы помочь вам удалить их:

  1. Удалить репозиторий GitHub
  2. Удалить токен GitHub
  3. Удалить пользователя IAM
  4. Удалить экземпляр EC2
  5. Удалить репозиторий ECR
  6. Удалить кластер ECS
  7. Отменить регистрацию определения задачи

Краткое содержание

И, наконец, вот краткое изложение того, что вам нужно сделать, чтобы настроить конвейер CI/CD Docker для развертывания примера приложения Nodejs на AWS ECS с помощью Jenkins.

  1. Клонируйте существующий образец репозитория GitHub.
  2. Создайте новый репозиторий GitHub и скопируйте в него код из репозитория примера
  3. Создайте токен GitHub
  4. Создать пользователя IAM
  5. Создайте репозиторий ECR
  6. Создайте кластер ECS
  7. Создайте экземпляр EC2 для настройки сервера Jenkins.
  8. Установите Java, JSON-процессор jq, Nodejs и NPM в экземпляре EC2.
  9. Установите Jenkins на экземпляр EC2.
  10. Установите Docker на экземпляр EC2.
  11. Установить плагины
  12. Создание учетных данных в Jenkins
  13. Создать задание Дженкинса
  14. Интеграция GitHub и Jenkins
  15. Проверьте развертывание
  16. Очистить ресурсы

Заключение

Конвейер CI/CD служит способом автоматизации сборки, тестирования и развертывания ваших программных приложений. Это основа любой организации с культурой DevOps. Он имеет множество преимуществ для разработки программного обеспечения и значительно повышает ваш бизнес.

В этой статье мы продемонстрировали шаги по созданию Jenkins CI/CD Docker Pipeline для развертывания примера контейнерного приложения Nodejs на AWS ECS. Мы видели, как GitHub Webhooks может запускать конвейер Jenkins при каждой отправке в репозиторий, который, в свою очередь, развертывает последний образ докера в AWS ECS.

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

Мы надеемся, что эта статья помогла вам узнать больше о неотъемлемых частях Docker Pipeline CI/CD.

Больше контента на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord.

Хотите повысить узнаваемость и принятие вашего технологического стартапа? Посмотрите Цирк.