В своей предыдущей статье я углубился в увлекательный мир микросервисов — Microservice Architecture Patterns Part 1: Decomposition Patterns . Это было начало моей обширной серии статей о микросервисах и их шаблонах.
Хотя логичным шагом было бы продолжить вторую часть этой серии, я решил, что следующее, что я хотел бы изучить и рассказать вам, — это жизненно важный процесс беспрепятственной доставки этих микросервисов конечному пользователю.
CI/CD — это метод доставки приложений клиентам, достигаемый за счет автоматизации различных этапов разработки приложений. Я считаю, что понимание CI/CD (непрерывной интеграции и непрерывного развертывания) может дать разработчикам возможность лучше понять, как артефакты серверной части проекта существуют за пределами репозитория проекта. Это понимание также может привести к фундаментальному изменению взглядов разработчика. Вместо того, чтобы просто рассматривать свою работу как строки кода, они могут начать воспринимать более широкий контекст своего проекта как ценный продукт.
В этой статье мы стремимся прояснить процесс CI/CD посредством практического применения. Мы проведем вас через пошаговое руководство, разбив его по модулям, где вы вручную построите конвейер CI/CD. Для этого мы воспользуемся возможностями современных инструментов DevOps, таких как AWS, Docker, Kubernetes, Ansible, Git, Apache Maven и Jenkins . Итак, начнем это путешествие!
Этот модуль посвящен созданию экземпляра виртуального сервера AWS EC2. В рамках этой статьи вы настроите три экземпляра EC2 для Jenkins, Ansible и Kubernetes. На данный момент вы можете перейти к следующим модулям и вернуться к этому модулю в разделах «[модуль 2]: Jenkins», «[модуль 6]: Ansible» и «[модуль 7]: Kubernetes».
Перейдите на https://aws.amazon.com.
Нажмите кнопку Создать учетную запись AWS .
Следуйте инструкциям на веб-странице создания учетной записи.
Перейдите на https://console.aws.amazon.com/console/home. Нажмите кнопку «Войти» .
Введите все необходимые учетные данные на этой веб-странице.
Найдите EC2 в поле поиска.
Выберите виртуальный сервер EC2, нажав EC2 Service .
Нажмите кнопку «Запустить экземпляр» .
Перейдите в раздел «Имя и теги» .
Укажите имя нового экземпляра виртуального сервера AWS EC2 в разделе «Имя» .
Вы также можете добавить дополнительные теги для своего виртуального сервера, нажав «Добавить дополнительные теги» .
Перейдите в раздел «Образы приложений и ОС (Amazon Machine Image)» .
Чтобы играть на виртуальном сервере БЕСПЛАТНО :
Перейдите в раздел «Тип экземпляра» .
Чтобы играть на виртуальном сервере БЕСПЛАТНО :
Выберите тип с тегом «Доступный уровень бесплатного пользования» в разделе «Тип экземпляра» .
Для меня это t2.micro (семейство: t2 1cCPU 1 ГиБ памяти. Текущее поколение: правда) .
Перейдите в раздел «Настроить хранилище» .
Чтобы играть на виртуальном сервере БЕСПЛАТНО :
Не меняйте настройки по умолчанию. Клиенты, соответствующие требованиям уровня бесплатного пользования, могут получить 30 ГБ накопителя EBS общего назначения (SSD) или магнитного накопителя .
Перейдите в раздел «Настройки сети» .
Вам необходимо настроить безопасность вашего виртуального сервера. Сделать это,
По умолчанию ваш виртуальный сервер доступен через ( Тип — SSH, Протокол — TCP, Порт — 22 ). Если вам нужны дополнительные типы подключений, добавьте их, добавив дополнительные правила группы безопасности для входящего трафика.
Перейдите в раздел «Пара ключей (Вход)» .
Создайте новую пару ключей, если вы ее еще не создали.
Если вы еще не создали «пару ключей» :
Запустите экземпляр виртуального сервера EC2, нажав кнопку «Запустить экземпляр» .
После завершения процесса создания экземпляра виртуального сервера EC2 вы увидите следующее.
Затем вам следует перейти в раздел «Экземпляры» , нажав кнопку «Просмотреть все экземпляры» .
Теперь вы можете видеть, что ваш экземпляр виртуального сервера AWS EC2 работает.
Теперь давайте настроим JenkinsServer на экземпляре виртуального сервера EC2.
Вам нужен виртуальный сервер для запуска Jenkins.
Следуйте инструкциям из раздела [Модуль 1]: Виртуальный сервер AWS EC2 этого руководства, чтобы завершить этот шаг и создать экземпляр виртуального сервера EC2 с именем JenkinsServer.
Не забудьте добавить настройку группы безопасности. Это позволяет Jenkins и SSH работать через порты 8080 и 22 соответственно.
Используйте имя «JenkinsServer» , чтобы отличить экземпляр виртуального сервера EC2.
Создайте группу безопасности «CI_CD_Pipeline» и «CI_CD_Pipeline_Key_Pair» для нового экземпляра «JenkinsServer» AWS EC2. Вы можете повторно использовать их далее в статье.
Перейдите на домашнюю страницу консоли AWS → Панель управления консоли управления EC2 → Экземпляры.
Затем вам следует выбрать JenkinsServer и нажать кнопку «Подключиться» .
Затем вы увидите эту веб-страницу. Вам следует еще раз нажать кнопку «Подключиться» .
Теперь вы можете увидеть онлайн-терминал экземпляра виртуального сервера EC2.
Теперь вам нужно загрузить Jenkins на свой экземпляр виртуального сервера EC2.
Следуйте этим инструкциям:
Перейдите на веб-страницу загрузки Jenkins.
Вы можете увидеть варианты «Стабильный» (LTS) и «Обычный» (еженедельный). Выберите вариант Red Hat/Fedora/Alma/Rocky/CentOS LTS.
Вы увидите эту веб-страницу.
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
Теперь Дженкинс загружен.
Чтобы завершить установку Jenkins, нам нужно импортировать ключ Jenkins.
Чтобы импортировать ключ Jenkins, нам нужно скопировать команду «sudo rpm..» и выполнить ее.
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
Таким образом, менеджер пакетов «rpm» может убедиться, что устанавливаемые вами пакеты Jenkins — это именно те пакеты, которые опубликованы проектом Jenkins, и что они не были подделаны или повреждены.
Чтобы запустить Jenkins, нам нужно установить Java на наш экземпляр виртуального сервера EC2.
Чтобы установить Java , используйте эту команду.
sudo amazon-linux-extras install java-openjdk11 -y
Проверьте, правильно ли установлена Java , с помощью этой команды:
java -version
Вы увидите что-то подобное.
Чтобы запустить Jenkins, вам необходимо установить Fontconfig на наш экземпляр виртуального сервера EC2.
Используйте эту команду.
sudo yum install fontconfig java-11-openjdk -y
Fontconfig — это библиотека, предназначенная для обеспечения общесистемной настройки шрифтов, настройки и доступа к приложениям. Это необходимо Jenkins, поскольку у Jenkins есть функции, которые отображают шрифты.
На предыдущих шагах вы настроили экземпляр виртуального сервера EC2 для использования определенного репозитория Jenkins, а затем импортировали ключ GPG, связанный с этим репозиторием. Теперь вам нужно запустить команду, которая выполнит поиск во всех известных ей репозиториях, включая добавленный вами Jenkins, чтобы найти пакет Jenkins. Как только он найдет пакет Jenkins в репозитории Jenkins, он загрузит и установит его.
Давайте запустим эту команду.
sudo yum install jenkins -y
Вы можете запустить Jenkins с помощью этой команды.
sudo systemctl start jenkins
Чтобы проверить, что Jenkins работает, используйте эту команду.
sudo systemctl status jenkins
Вы увидите результат, как на скриншоте ниже:
Дженкинс теперь должен быть готов к работе.
Чтобы получить доступ к приложению Jenkins, откройте любой веб-браузер и введите общедоступный IP-адрес или доменное имя вашего экземпляра EC2, а затем порт 8080.
http://<your-ec2-ip>:8080
При первом доступе к Jenkins он будет заблокирован автоматически сгенерированным паролем.
Вам необходимо отобразить этот пароль с помощью следующей команды.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Скопируйте этот пароль, вернитесь в браузер, вставьте его в поле «Пароль администратора» и нажмите «Продолжить».
Тогда вы сможете увидеть эту веб-страницу.
Теперь вы можете использовать свой сервер Jenkins.
Теперь, когда Jenkins работает нормально, вы можете приступить к созданию конвейера Jenkins. Чтобы создать конвейер Jenkins, вам необходимо создать новый «Проект Freestyle». Чтобы создать новый «Проект Freestyle», вам нужно перейти на панель управления Jenkins и нажать кнопку «Новый элемент» .
Введите имя проекта Github «Freestyle project» (имя «конвейера» будет использоваться далее) и нажмите кнопку «ОК» .
Затем предоставьте описание конвейера.
Затем нажмите кнопку «Применить» и «Сохранить». После этого это означает, что вы создали основу конвейера, который будет построен в этом уроке.
Теперь, когда Jenkins работает на экземпляре виртуального сервера AWS EC2, вы можете настроить Git с помощью конвейера.
Git — это бесплатная распределенная система контроля версий (VCS) с открытым исходным кодом, предназначенная для того, чтобы помочь командам разработчиков программного обеспечения отслеживать каждое изменение кода в базе данных особого типа. Если допущена ошибка, разработчики могут повернуть время вспять и сравнить более ранние версии кода, чтобы исправить ошибку и свести к минимуму неудобства для всех членов команды. VCS особенно полезна для
Git, как самая популярная система контроля версий, позволяет нам переносить последнюю версию кода из репозитория Github вашего проекта на экземпляр виртуального сервера EC2, где установлен ваш Jenkins.
Используйте эту команду для установки Git.
sudo yum install git -y
Теперь убедитесь, что Git работает, используя эту команду.
git --version
Теперь Git отлично работает на экземпляре виртуального сервера EC2.
Поскольку Git отлично работает на экземпляре виртуального сервера EC2, мы можем теперь интегрировать Jenkins с Git.
Чтобы начать эту интеграцию, давайте установим плагин Jenkins Github.
Перейдите в раздел панели управления Jenkins.
Нажмите кнопку «Управление Jenkins» , а затем кнопку «Управление плагинами» .
Нажмите кнопку «Доступные плагины» .
Найдите поле поиска плагина Github .
Выберите плагин Github .
Выберите плагин Github . А затем нажмите кнопку «Установить без перезагрузки» .
Дождитесь окончания загрузки плагина Github.
Да! Плагин Jenkins Github установлен.
Теперь, когда плагин GitHub Jenkins установлен, вы можете настроить этот плагин для окончательной интеграции Jenkins с Git. Для этого вам необходимо вернуться на главную страницу, нажав кнопку «Вернуться на верхнюю страницу».
Затем на главной странице нужно нажать кнопку «Управление Jenkins» , а затем нажать кнопку «Глобальная конфигурация инструмента» .
Затем на веб-странице глобальной конфигурации инструментов вам следует перейти в раздел Git.
В разделе Git вам необходимо настроить Git, указав имя и путь к Git на компьютере.
Затем нажмите кнопки «Применить» и «Сохранить» .**.**
На этом вы завершили настройку плагина Jenkins Github.
Теперь, когда плагин Jenkins Github установлен и настроен, вы можете использовать его в своем конвейере. Это позволит вашему конвейеру, который вы создали в модуле 2, извлекать код вашего проекта из указанного репозитория GitHub.
Что ж, чтобы интегрировать этот плагин в свой конвейер, вам нужно перейти в раздел «Управление исходным кодом» и выбрать Git в своем конвейере. Затем вам нужно указать URL-адрес репозитория вашего проекта. Если репозиторий вашего проекта общедоступен на Github, вам не нужно предоставлять учетные данные. Если репозиторий проекта является частным на Github, вам необходимо предоставить учетные данные.
Вы можете использовать мой проект по следующему URL-адресу репозитория: https://github.com/Sunagatov/Hello.git .
Просто скопируйте и вставьте его в поле « URL-адрес репозитория» . Затем нажмите кнопки «Применить» и «Сохранить» , чтобы завершить интеграцию Git с конвейером.
Теперь вы можете использовать обновленный конвейер для извлечения проекта из Github. Для этого вам нужно нажать кнопку ** «Построить сейчас»**. В результате вы увидите успешную сборку в истории сборок.
Откройте первую сборку из истории сборок.
Теперь вы можете увидеть успешный результат работы первой сборки. Если вы откроете свой терминал AWS EC2. Вы можете проверить, что конвейер работает хорошо.
Просто используйте эту команду.
cd /var/lib/jenkins/workspace/{your pipeline name}
Таким образом, вы увидите, что ваш проект из Github был перенесен на ваш экземпляр виртуального сервера AWS EC2.
Apache Maven — широко используемый инструмент автоматизации сборки и управления проектами при разработке программного обеспечения. Он оптимизирует процесс компиляции, тестирования и упаковки кода, управляя зависимостями проекта и обеспечивая согласованный жизненный цикл сборки. Maven использует файлы конфигурации на основе XML (файлы POM) для определения структуры проекта, зависимостей и задач, что позволяет разработчикам эффективно управлять сложными программными проектами и развертывать их.
Теперь, когда вы интегрировали Git в конвейер, вы можете еще больше улучшить его, включив Apache Maven, который позволяет создавать, тестировать и упаковывать проект. Для этого вам необходимо установить Apache Maven на экземпляр виртуального сервера AWS EC2, где были установлены Jenkins и Git.
Чтобы загрузить Apache Maven, перейдите в каталог «/opt» .
cd /opt
А затем используйте эту команду.
sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz
Эта команда загрузит последнюю официальную версию Apache Maven (проверьте последнюю версию на официальном веб-сайте Apache Maven). Чтобы найти последнюю официальную версию Apache Maven, воспользуйтесь ссылкой https://maven.apache.org/download.cgi .
Используйте эту команду, чтобы извлечь Apache Maven из загруженного архива:
sudo tar -xvzf apache-maven-*.tar.gz
Перейдите в корневую папку с помощью этой команды.
cd ~
Отредактируйте файл .bash_profile с помощью этой команды.
vi .bash_profile
Добавьте переменные JAVA_HOME и M2_HOME.
Назначьте путь к JDK11 для JAVA_HOME и путь к каталогу maven для переменной M2_HOME .
Чтобы найти путь к JDK, используйте эту команду.
sudo find / -name java
Как использовать ВИМ
Сохраните изменения.
Затем выполните эту команду, чтобы обновить системные переменные.
source .bash_profile
Чтобы проверить $PATH , используйте эту команду.
echo $PATH
Чтобы проверить Apache Maven , используйте эту команду.
mvn -v
Если вы все сделали правильно, вы сможете просмотреть версию Apache Maven.
Поскольку Apache Maven можно использовать в экземпляре EC2, вы можете установить плагин Apache Maven, чтобы интегрировать его с конвейером.
Чтобы добиться этого, выполните следующие действия:
Дождитесь окончания процесса загрузки.
А затем нажмите кнопку «Вернуться на верхнюю страницу» .
После успешной установки плагина Apache Maven Jenkins вы теперь можете использовать этот плагин в конвейере, который вы создали и обновили в модулях 2 и 3.
Для этого выполните следующие действия:
Затем перейдите в раздел «Maven» . Нажмите кнопку «Добавить Maven» . Снимите флажок «Установить автоматически».
Затем добавьте имя и путь MAVEN_HOME .
Нажмите кнопки «Применить» и «Сохранить» .
На этом вы завершили настройку плагина Apache Maven Jenkins.
Теперь, когда плагин Apache Maven GitHub установлен и настроен, вы можете использовать Apache Maven в своем конвейере. Это позволит вашему конвейеру, который вы создали в «[модуле 2]: Jenkins Server», построить код вашего проекта для создания артефакта jar.
Чтобы интегрировать Apache Maven в конвейер, вам необходимо выполнить следующие шаги:
Наконец, вам следует нажать кнопки «Применить» и «Сохранить» , чтобы завершить интеграцию Apache Maven с конвейером.
Теперь вы можете использовать обновленный конвейер для создания проекта Github. Для этого вам нужно нажать кнопку ** «Построить сейчас»**. В результате вы увидите успешный результат задания в истории сборки.
Если вы откроете свой терминал AWS EC2. Вы можете проверить, что конвейер работает хорошо.
Просто используйте эту команду.
cd /var/lib/jenkins/workspace/{your pipeline name}/target
Таким образом вы сможете увидеть артефакт JAR, указывающий на успешную сборку вашего проекта с GitHub.
Теперь давайте создадим новый экземпляр EC2 с именем «Ansible Server», куда вы собираетесь установить Docker и Ansible.
Чтобы завершить этот шаг, используйте инструкции из раздела « Запуск экземпляра виртуального сервера AWS EC2» этого руководства. Не забудьте добавить настройку группы безопасности. Это позволяет Docker и SSH работать через порты 8080 и 22 соответственно.
Нажмите кнопку «Подключиться».
Теперь вы можете увидеть онлайн-терминал экземпляра виртуального сервера EC2.
sudo chown ansible-admin:ansible-admin /opt/docker
Теперь вам нужно установить Docker на ваш экземпляр Ansible EC2. Для этого вам нужно создать новую папку Docker.
sudo mkdir /opt/docker
Затем установите Docker, выполнив следующую команду.
sudo yum install docker -y
Вам необходимо добавить текущего пользователя ansible-admin в группу Docker на виртуальном сервере EC2 AnsibleServer , чтобы предоставить права администратора Docker.
sudo usermod -a -G docker ansible-admin
Вам нужно будет выйти из системы и снова войти в систему, чтобы эти изменения вступили в силу.
Затем вы можете выполнить следующую команду
id ansible-admin
чтобы увидеть, что новый пользователь докера существует.
Теперь, когда Docker установлен на экземпляре Ansible EC2, вы можете запустить его, выполнив следующую команду.
sudo systemctl start docker
Когда Docker запустится, вы можете выполнить следующую команду
sudo systemctl status docker
чтобы увидеть, что докер активен и работает.
В окончательной версии конвейера этот процесс будет включать создание нового образа Docker из вашего проекта GitHub и отправку его в Docker Hub. Для этого ваш проект GitHub должен содержать файл Dockerfile.
Если вы использовали проект «Hello» , который предлагался в модуле « [Модуль 3]: Git и Github» , вам не нужно создавать новый Dockerfile, поскольку этот репозиторий проекта уже содержит Dockerfile.
FROM eclipse-temurin:17-jre-jammy ENV HOME=/opt/app WORKDIR $HOME ADD hello-0.0.1-SNAPSHOT.jar $HOME ENTRYPOINT ["java", "-jar", "/opt/app/hello-0.0.1-SNAPSHOT.jar" ]
Если вы использовали собственный репозиторий проекта и он не содержал Dockerfile, вам потребуется создать новый Dockerfile.
Чтобы создать новый файл Dockerfile, выполните следующую команду, которая создаст новый файл.
sudo touch Dockerfile
Затем вы можете заполнить этот файл последовательностью команд, описывающих, как построить контейнерную среду приложения. Эти команды включают в себя такие действия, как копирование файлов в образ, установку программного обеспечения, настройку переменных среды и настройку контейнера.
Чтобы заполнить Dockerfile этими командами, выполните следующую команду.
vim Dockerfile
Dockerfile готов к использованию.
Теперь, когда ваш Dockerfile подготовлен к использованию, скопируйте артефакт JAR вашего проекта из экземпляра **"JenkinsServer"**EC2 и вставьте его в экземпляр EC2 "AnsibleServer" . Важно отметить, что в дальнейшем эта передача через конвейер будет автоматизирована.
Выполнив этот шаг, вы будете готовы протестировать свой Dockerfile вместе с настроенной вами средой Docker.
Прежде чем приступить к тестированию, обязательно авторизируйтесь в Dockerhub. Выполните следующую команду.
docker login
Эта команда предложит вам ввести учетные данные для входа в Dockerhub, включая имя пользователя и пароль.
На этом вы завершили процесс входа в Docker и теперь готовы приступить к тестированию.
После успешного входа в Dockerhub вы готовы начать тестирование подготовленного Dockerfile.
Выполните эту команду, чтобы создать образ Docker.
docker build -t hello:latest .
Затем выполните следующую команду, чтобы установить тег, который облегчит загрузку изображения в Dockerhub:
docker tag hello:latest zufarexplainedit/hello:latest
Наконец, приступите к отправке образа Docker в Dockerhub, выполнив эту команду.
docker push zufarexplainedit/hello:latest
Выполнив следующие действия, перейдите в свою учетную запись Dockerhub, чтобы проверить, видите ли вы новое изображение или нет.
Теперь вы должны заметить, что изображение было эффективно добавлено. Этот результат подтверждает успешную установку среды Docker и правильность вашего Dockerfile.
Теперь давайте настроим сервер Ansible на экземпляре виртуального сервера EC2.
Для запуска Ansible вам понадобится виртуальный сервер.
Следуйте инструкциям из раздела [Модуль 1]: Виртуальный сервер AWS EC2 этого руководства, чтобы завершить этот шаг и создать экземпляр виртуального сервера EC2 для Ansible.
Не забудьте добавить настройку группы безопасности. Это позволяет Ansible и SSH работать через порты 8080 и 22 соответственно.
Используйте имя «AnsibleServer» , чтобы отличить экземпляр виртуального сервера EC2.
Вы можете повторно использовать группу безопасности «CI_CD_Pipeline» и «CI_CD_Pipeline_Key_Pair» для нового экземпляра EC2 «AnsibleServer» .
Перейдите на домашнюю страницу консоли AWS → Панель управления консоли управления EC2 → Экземпляры → AnsibleServer.
Затем нажмите кнопку «Подключиться» .
Затем вы увидите эту веб-страницу. Вам следует еще раз нажать кнопку «Подключиться» .
Теперь вы можете увидеть онлайн-терминал экземпляра виртуального сервера EC2.
Теперь давайте настроим Ansible Server на экземпляре виртуального сервера EC2.
Первое, что вам нужно сделать, если вы хотите настроить AnsibleServer на экземпляре виртуального сервера EC2, — это изменить его имя хоста.
Давай сделаем это. Выполните эту команду, чтобы открыть файл имени хоста:
sudo vi /etc/hostname
Вы должны увидеть что-то вроде этого:
Замените это имя хоста на «ansible-server». Затем перезагрузите его.
sudo init 6
Теперь давайте добавим нового пользователя ansible-admin в экземпляр виртуального сервера AWS EC2.
Для этого используйте эту команду:
sudo useradd ansible-admin
Затем установите пароль для пользователя ansible-admin .
sudo passwd ansible-admin
Также вам необходимо настроить права пользователя, отредактировав файл sudoers .
sudo visudo
Добавьте «ansible-admin ALL=(ALL) ALL» в этот файл sudoers .
Кроме того, вам необходимо отредактировать файл /etc/ssh/sshd_config , чтобы включить проверку подлинности пароля.
sudo vi /etc/ssh/sshd_config
Затем вам необходимо перезагрузить сервис, чтобы подтвердить эти изменения.
sudo service sshd reload
В результате выполнения этой команды вы увидите:
Теперь вы можете использовать эту команду, чтобы не добавлять sudo для всех дальнейших команд.
sudo su - ansible-admin
Далее в этой статье вы планируете управлять удаленными серверами, такими как экземпляры виртуальных серверов K8s EC2. Вот почему вам необходимо настроить ключи SSH.
ssh-keygen
В результате выполнения этой команды вы увидите:
Теперь ключи SSH сгенерированы и готовы к использованию.
Теперь вы можете установить Ansible на свой экземпляр виртуального сервера EC2 «AnsibleServer» .
Давай сделаем это.
Выполните эту команду, чтобы установить Ansible.
sudo amazon-linux-extras install ansible2
Чтобы проверить Ansible, используйте следующую команду:
ansible --version
В результате выполнения этой команды вы увидите:
Поскольку Ansible установлен на вашем экземпляре виртуального сервера EC2 «AnsibleServer» , вы можете настроить Jenkins для его интеграции с Ansible. Вам необходимо установить плагин «Publish over SSH» , чтобы интегрировать Jenkins с экземпляром виртуального сервера EC2, на котором установлен Ansible, и с другими экземплярами виртуального сервера EC2, на которых установлен Kubernetes .
Перейдите в «Панель управления» → « Управление Jenkins» → «Настроить систему» → «Доступные плагины» .
Затем введите «Опубликовать через SSH» в поле поиска.
Нажмите кнопку «Установить без перезагрузки» . Дождитесь окончания процесса загрузки.
Теперь плагин «Публикация через SSH» установлен на экземпляре виртуального сервера Jenkins EC2.
После успешной установки плагина Apache Maven Jenkins вы теперь можете использовать этот плагин в конвейере, который вы создали и обновили в модулях 2 и 3.
Для этого выполните следующие действия:
Перейдите в «Панель управления» → «Управление Jenkins» → «Настроить систему» → «Публикация через SSH» .
Введите все необходимые данные, как показано на скриншоте, включая имя хоста, имя пользователя и закрытый ключ (или пароль, если применимо).
Затем нажмите кнопки «Применить» и «Сохранить» .
На этом вы завершили настройку плагина Jenkins «Публикация через SSH» .
Затем нажмите «Проверить конфигурацию», чтобы убедиться, что плагин работает правильно.
С левой стороны вы можете видеть, что статус конфигурации тестового плагина — «Успех». Это означает, что конфигурация плагина правильная.
Вам необходимо создать новую папку на экземпляре AnsibleServer EC2, в которой будет храниться JAR-файл проекта. Этот jar-файл позже будет использоваться для создания образа Docker.
Давайте начнем.
Перейдите в папку «/opt» в экземпляре AnsibleServer EC2.
cd /opt
Создайте там новую папку «docker» .
sudo mkdir docker
Дайте привилегии этой папке «docker» .
sudo chown ansible-admin:ansible-admin docker
Теперь проверьте права доступа к папке «docker» , выполнив эту команду.
ll
Вы можете видеть, что папка «docker» доступна пользователю «ansible-admin» .
Теперь, когда плагин Github «Публикация через SSH» установлен и настроен, вы можете интегрировать его в конвейер, который вы создали в «[модуле 2]: Jenkins Server», для передачи артефакта jar проекта из « JenkinsServer» в «Ансиблсервер» .
Что ж, чтобы интегрировать плагин Github «Публикация через SSH» в конвейер, вам необходимо выполнить следующие шаги:
Наконец, вам следует нажать кнопки «Применить» и «Сохранить» , чтобы завершить интеграцию плагина «Публикация через SSH» с конвейером.
Теперь вы можете использовать обновленный конвейер для переноса артефакта jar проекта из JenkinsServer в AnsibleServer . Для этого вам нужно нажать кнопку «Построить сейчас» . В результате вы увидите успешный результат задания в истории сборки.
Если вы откроете терминал AWS EC2 «AnsibleServer» . Вы можете проверить, что конвейер работает хорошо.
Просто используйте эту команду.
cd /opt/docker
Таким образом вы сможете увидеть артефакт JAR, указывающий на успешную сборку вашего проекта с GitHub.
Когда вы запускаете книгу воспроизведения Ansible, вы указываете хосты, на которых она должна работать. Вы можете сделать это двумя способами:
hosts
список IP-адресов или имен хостов./etc/ansible/hosts
.
Редактируя /etc/ansible/hosts
, вы можете легко управлять группами хостов без необходимости записывать их IP-адреса каждый раз, когда вы запускаете сборник сценариев.
Давайте узнаем хост экземпляра AnsibleServer EC2, выполнив следующую команду.
sudo ifconfig
После того, как вы найдете хост экземпляра AnsibleServer EC2, вы можете добавить его в файл хостов Ansible, выполнив следующую команду.
sudo vi /etc/ansible/hosts
Вы также можете добавить «[ansible]» в качестве ссылки.
Если вы управляете кластером серверов и хотите применить книгу ко всем из них, вместо указания IP-адреса каждого сервера в книге, вы можете просто добавить все серверы в группу в файле инвентаризации, а затем указать группа в сборнике игр.
Ansible предназначен для автоматизации задач на удаленных серверах. Аутентификация SSH без пароля позволяет Ansible подключаться к этим серверам без необходимости ввода пароля вручную.
Выполните эту команду, чтобы создать безопасное соединение вашего компьютера с другим компьютером (например, с IP-адресом 172.31.34.41), используя SSH-ключ пользователя ansible-admin.
sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}
В моем случае это выглядит так.
sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub [email protected]
Теперь вы можете увидеть «Количество добавленных ключей: 1» . Это означает, что установка аутентификации SSH без пароля успешно завершена.
Теперь, когда Ansible настроен и готов к работе, вы можете создать новый сборник сценариев Ansible для своего конвейера. Этот сборник сценариев позволит Ansible создать и отправить новый образ Docker в Dockerhub.
Вот как вы можете это сделать:
touch hello-app.yml
hello-app.yml
. Откройте его для редактирования с помощью этой команды. vi hello-app.yml
--- - hosts: ansible user: root tasks: - name: create docker image command: docker build -t hello:latest . args: chdir: /opt/docker - name: create tag to push image onto dockerhub command: docker tag hello:latest zufarexplainedit/hello:latest - name: push docker image onto dockerhub command: docker push zufarexplainedit/hello:latest
Сборник сценариев Ansible для задач Docker готов к использованию.
Когда Ansible, Ansible playbook, AnsibleServer и JenkinsServer настроены правильно, пришло время протестировать Ansible playbook.
Перейдите к местоположению вашей книги пьес Ansible.
cd /opt/docker
Затем выполните следующую команду.
sudo -u ansible-admin ansible-playbook /opt/docker/hello-app.yml
По завершении вы увидите успешный результат выполнения вашего сборника сценариев Ansible.
Кроме того, найдите время, чтобы посетить свою учетную запись Dockerhub и проверить, видно ли теперь новое изображение.
Вы должны увидеть только что добавленное изображение. Этот результат подтверждает, что ваш сборник сценариев Ansible верен.
Теперь, когда плагин Github «Публикация через SSH» , Ansible и Docker установлены и настроены, вы можете интегрировать их все в конвейер, который вы создали в «[модуле 2]: Jenkins Server», для передачи артефакта jar проекта. с « JenkinsServer» на «AnsibleServer» , а затем создайте новый образ Docker из своего проекта и затем отправьте этот образ Docker на Dockerhub.
Чтобы добиться этого, вам необходимо выполнить следующие шаги:
Наконец, нажмите кнопки «Применить» и «Сохранить» , чтобы завершить интеграцию задач Ansible Docker с конвейером.
Теперь вы можете протестировать обновленный конвейер, чтобы беспрепятственно перенести артефакт jar проекта из « JenkinsServer» в «AnsibleServer» , затем создать новый образ Docker из своего проекта и затем отправить этот образ Docker в Dockerhub. Для этого вам нужно нажать кнопку «Построить сейчас» . В результате вы увидите успешный результат задания в истории сборки.
Кроме того, найдите время, чтобы посетить свою учетную запись Dockerhub и проверить, видно ли теперь новое изображение.
Вы должны увидеть только что добавленное изображение. Этот результат подтверждает, что ваш сборник сценариев Ansible с задачами Docker был успешно интегрирован в конвейер.
Теперь давайте настроим K8s на экземпляре EC2. Вы собираетесь создать новый экземпляр EC2 и установить инструмент командной строки kubectl для дальнейшего взаимодействия с кластером Kubernetes .
Чтобы завершить этот шаг, используйте инструкции из раздела « Запуск экземпляра виртуального сервера AWS EC2» этого руководства.
Не забудьте добавить настройку группы безопасности. Это позволяет всем инструментам и SSH работать через порты 8080 и 22 соответственно.
Используйте имя «K8sServer» , чтобы отличить экземпляр виртуального сервера EC2.
Вы можете повторно использовать группу безопасности «CI_CD_Pipeline» и «CI_CD_Pipeline_Key_Pair» для нового экземпляра EC2 «K8sServer» .
Нажмите кнопку «Подключиться».
Теперь вы можете увидеть онлайн-терминал экземпляра виртуального сервера EC2.
Первое, что вам нужно сделать, если вы хотите настроить KuberenetesServer на экземпляре виртуального сервера EC2, — это изменить его имя хоста.
Давай сделаем это. Выполните эту команду, чтобы открыть файл имени хоста:
sudo vi /etc/hostname
Вы должны увидеть что-то вроде этого.
Замените это имя хоста на «kubernetes-server», а затем перезагрузите его.
sudo init 6
Ваше имя хоста было изменено.
Используйте эту команду, чтобы проверить версию AWS .
aws --version
Таким образом, вы сможете увидеть текущую версию aws-cli.
Если вы видите версию aws-cli/1.18 , вам следует загрузить последнюю версию.
Теперь, когда вы узнали, что на вашем экземпляре EC2 установлена старая версия aws-cli, вам необходимо ее обновить. Для этого перейдите в AWS → Документация → Интерфейс командной строки AWS → Руководство пользователя для версии 2.
Скопируйте и вставьте команду Curl .
Сначала выполните эту команду, чтобы загрузить awscli версии 2.
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
Подождите, пока начнется процесс загрузки.
Вы должны увидеть что-то вроде этого.
Во-вторых, вам нужно выполнить эту команду, чтобы распаковать архив awscli версии 2.
unzip awscliv2.zip
В-третьих, вам следует выполнить эту команду, чтобы установить awscli версии 2.
sudo ./aws/install
Затем перезагрузите онлайн-терминал экземпляра виртуального сервера Kubernetes EC2.
Затем используйте эту команду, чтобы проверить версию AWS.
aws --version
Вы можете видеть, что у aws cli есть aws-cli/2.
Kubectl — это фундаментальный инструмент командной строки для взаимодействия с любым кластером Kubernetes, независимо от базовой инфраструктуры. Он позволяет вам управлять ресурсами, развертывать приложения, настраивать сеть, получать доступ к журналам и выполнять различные другие задачи в кластере Kubernetes.
Теперь вам нужно установить инструмент командной строки kubectl для дальнейшего взаимодействия с кластером Kubernetes. Для этого вам нужно перейти в AWS → Документация → Amazon EKS → Руководство пользователя → Установка или обновление kubectl → Linux .
Или просто нажмите ссылку https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html .
Сначала выполните эту команду, чтобы загрузить kubectl.
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl
Дождитесь процесса загрузки.
Вы увидите что-то вроде этого.
Дайте разрешение kubectl.
chmod +x kubectl
Переместите kubectl в папку /usr/local/bin.
sudo mv kubectl /usr/local/bin
Проверьте версию kubectl.
kubectl version --output=yaml
Eksctl — еще один инструмент командной строки, специально разработанный для сервиса Amazon EKS. Eksctl можно использовать для создания кластеров AWS EKS, управления группами узлов и выполнения задач, специфичных для EKS, таких как интеграция с ролями IAM и другими сервисами AWS, абстрагируя большую часть настройки и управления инфраструктурой AWS.
Выполните команду для загрузки kubectl.
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
Переместите eksctl в папку /usr/local/bin.
sudo mv /tmp/eksctl /usr/local/bin
Проверьте версию eksctl.
eksctl version
Вы должны увидеть версию
Вам необходимо создать роль IAM и прикрепить ее к вашему экземпляру EC2 «KubernetesServer» .
Для этого вам нужно найти EC2 в поле поиска.
Выберите виртуальный сервер EC2, перейдя по ссылке https://us-east-1.console.aws.amazon.com/ec2/ .
Перейдите в Панель управления IAM → Роли .
Нажмите кнопку «Создать роль» на веб-странице ролей IAM .
Затем выберите «Сервис AWS», «EC2». И нажмите кнопку «Далее» .
Затем найдите «AmazonEC2FullAccess» , «AmazonEC2FullAccess» , «IAMFullAccess» , «AWSCloudFormationFullAccess» в поле поиска и нажмите кнопку «Добавить разрешения» .
И затем нажмите кнопку «Далее» .
Затем введите «Eksctl_Role» в поле «Имя роли» .
И нажмите кнопку «Создать роль» .
Роль наконец создана.
Перейдите на веб-страницу экземпляра AWS EC2. Выберите «KuberbetesServer». Затем нажмите «Действия» → «Безопасность» → «Изменить роль IAM».
Выберите «Eksctl_Role» , а затем нажмите кнопку «Обновить роль IAM» .
Теперь ваша роль IAM связана с вашим «EKS_Server» и инструментом eksctl.
Кластер Amazon EKS (Elastic Kubernetes Service) — это управляемая среда Kubernetes на AWS, автоматизирующая сложные инфраструктурные задачи, такие как настройка, масштабирование и обслуживание. Это очень важно, поскольку оно обеспечивает эффективную, безопасную и оптимизированную для AWS платформу для развертывания, управления и масштабирования контейнерных приложений, оптимизации операций и позволяет разработчикам сосредоточиться на кодировании, а не на управлении базовой инфраструктурой.
Теперь пришло время настроить кластер EKS.
Чтобы добиться этого, выполните следующие действия:
eksctl create cluster --name cluster-name \ --region region-name \ --node-type instance-type \ --nodes-min 2 \ --nodes-max 2 \ --zones <AZ-1>,<AZ-2>
Например, в моем случае это выглядит так.
eksctl create cluster --name zufarexplainedit \ --region eu-north-1 \ --node-type t3.micro
Выполните измененную команду и терпеливо дождитесь завершения процесса создания кластера. Вы заметите, что на веб-странице AWS CloudFormation статус кластера EKS указан как «создается» .
Процедура создания кластера обычно занимает около 20 минут. После завершения терминал отобразит результат процесса.
Кроме того, вы можете проверить статус успешного создания кластера EKS на веб-странице AWS CloudFormation.
YAML-файл развертывания Kubernetes — это сценарий конфигурации, написанный в формате YAML, который определяет, как управлять и поддерживать определенное приложение или службу в кластере Kubernetes. Он инкапсулирует инструкции по организации развертывания, масштабирования, обновления и мониторинга контейнеров, в которых выполняется приложение. Этот файл содержит такие сведения, как образ контейнера, желаемое количество реплик, ограничения ресурсов, переменные среды, настройки сети и многое другое. При применении к кластеру Kubernetes YAML-файл развертывания обеспечивает желаемое состояние приложения, автоматически управляя созданием, масштабированием и восстановлением контейнеров для поддержания желаемого уровня доступности и надежности.
Теперь, когда кластер Kubernetes, eksctl, kubectl установлены и настроены, вы можете создать yaml-файл развертывания Kubernetes.
Вы можете сделать это, выполнив следующую команду.
touch hello-app-deployment.yaml
Затем отредактируйте этот файл, выполнив следующую команду.
vi hello-app-deployment.yaml
Добавьте это содержимое в файл hello-app-deployment.yaml.
apiVersion: apps/v1 kind: Deployment metadata: name: zufarexplainedit-hello-app labels: app: hello-app spec: replicas: 2 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: zufarexplainedit/hello imagePullPolicy: Always ports: - containerPort: 8080 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
Теперь файл hello-app-deployment.yaml создан и готов к использованию.
YAML-файл службы Kubernetes — это сценарий конфигурации, написанный в формате YAML, который определяет сетевую абстракцию для набора модулей, обеспечивая согласованный доступ к ним в кластере Kubernetes. В этом файле описывается, как служба должна обнаруживаться, получать к ней доступ и распределять нагрузку другими службами или внешними клиентами. Он включает в себя такие характеристики, как тип службы (ClusterIP, NodePort, LoadBalancer), номера портов, селекторы для идентификации модулей и многое другое. При применении к кластеру Kubernetes файл YAML службы создает виртуальный IP-адрес и порт, которые направляют трафик к соответствующим модулям, абстрагируя изменения базового модуля и обеспечивая стабильную конечную точку для связи, обеспечивая плавное подключение и динамическое масштабирование.
Поскольку кластер Kubernetes, eksctl, kubectl установлены и настроены, вы можете создать yaml-файл службы Kubernetes.
Для этого вам необходимо создать yaml-файл службы Kubernetes, выполнив следующую команду.
touch hello-app-service.yaml
Затем отредактируйте этот файл, выполнив следующую команду.
vi hello-app-service.yaml
Добавьте это содержимое в файл hello-app-deployment.yaml.
apiVersion: v1 kind: Service metadata: name: zufarexplainedit-hello-app-service labels: app: hello-app spec: selector: app: hello-app ports: - port: 8080 targetPort: 8080 type: LoadBalancer
Теперь файл hello-app-service.yaml создан и готов к использованию.
После того, как ваш кластер Kubernetes EKS успешно установлен и настроен, а также готовы файлы службы и развертывания Kubernetes, пришло время протестировать ситуацию с помощью команд kubectl.
Применить развертывание.
Используйте следующую команду, чтобы применить конфигурацию развертывания.
kubectl apply -f hello-app-deployment.yaml
Это создаст развертывание с указанным количеством реплик и стратегией непрерывного обновления, гарантируя доступность и управляемость вашего приложения.
2. Применить Сервис.
Затем примените конфигурацию службы.
kubectl apply -f hello-app-service.yaml
При этом будет настроена служба типа LoadBalancer, предоставляющая доступ к вашему приложению из Интернета.
Обратите внимание, что подготовка LoadBalancer и получение внешнего IP-адреса может занять некоторое время.
Проверьте статус LoadBalancer.
Следите за статусом использования вашего сервиса.
kubectl get service zufarexplainedit-hello-app-service
Когда назначен внешний IP-адрес, вы почти готовы получить доступ к своему приложению.
Получите доступ к вашему приложению.
Используя веб-браузер, введите назначенный внешний IP-адрес, а затем: 8080. Через некоторое время страница загрузится и отобразит сообщение «HelloWorld». Имейте в виду, что первоначальная загрузка может занять несколько секунд.
Если вам нужно привести в порядок ресурсы в среде Kubernetes, вы можете использовать следующие команды kubectl для эффективного удаления развертываний, модулей и сервисов.
1. Удалите все развертывания .
Чтобы удалить все развертывания, вы можете использовать следующую команду.
kubectl delete deployments --all
Это действие гарантирует, что в вашем кластере не останется активных экземпляров развертывания.
2. Удалить все модули .
Если вам нужно удалить все модули, независимо от того, управляются ли они развертыванием или нет, вы можете использовать следующую команду.
kubectl delete pods --all
Очистка модулей может помочь сбросить состояние вашего кластера или подготовиться к новым развертываниям.
3. Удалить все службы .
Чтобы очистить службы, которые предоставляют доступ к вашим приложениям из сети, вы можете использовать следующую команду.
kubectl delete services --all
Удаление служб может привести к простою, поэтому прежде чем продолжить, учтите последствия.
Чтобы удалить все ресурсы, связанные с указанным кластером Amazon EKS, созданным с помощью eksctl
, включая рабочие узлы, сетевые компоненты и другие ресурсы, вы можете использовать следующую команду.
eksctl delete cluster --name {your cluster name} --region {your region name}
Для меня это.
eksctl delete cluster --name zufarexplainedit --region eu-north-1
Убедитесь, что вы уверены в необходимости остановки кластера, поскольку это действие необратимо и приведет к потере данных.
Теперь давайте добавим нового пользователя ansible-admin в экземпляр виртуального сервера AWS EC2 «KubernetesServer» .
Для этого используйте эту команду.
sudo useradd ansible-admin
Затем установите пароль для пользователя ansible-admin .
sudo passwd ansible-admin
Также вам необходимо настроить права пользователя, отредактировав файл sudoers .
sudo visudo
Добавьте «ansible-admin ALL=(ALL) ALL» в этот файл sudoers .
Кроме того, вам необходимо отредактировать файл /etc/ssh/sshd_config , чтобы включить проверку подлинности пароля.
sudo vi /etc/ssh/sshd_config
Затем вам необходимо перезагрузить сервис, чтобы внести эти изменения.
sudo service sshd reload
В результате выполнения этой команды вы увидите:
Теперь вы можете использовать эту команду, чтобы не добавлять sudo для всех дальнейших команд.
sudo su - ansible-admin
Далее в этой статье вы планируете управлять удаленными серверами, такими как экземпляр виртуального сервера K8s EC2. Вот почему вам необходимо настроить ключи SSH.
ssh-keygen
В результате выполнения этой команды вы увидите:
Теперь ключи SSH сгенерированы и готовы к использованию.
Ansible предназначен для автоматизации задач на удаленных серверах. Аутентификация SSH без пароля позволяет Ansible подключаться к этим серверам без необходимости ввода пароля вручную.
Выполните эту команду, чтобы создать безопасное соединение вашего компьютера с другим компьютером (например, с IP-адресом 172.31.34.41), используя SSH-ключ пользователя ansible-admin.
sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}
В моем случае это выглядит так.
sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub [email protected]
Теперь вы можете увидеть «Количество добавленных ключей: 1» . Это означает, что установка аутентификации SSH без пароля успешно завершена.
Когда вы запускаете книгу воспроизведения Ansible, вы указываете хосты, на которых она должна работать. На этом этапе вам необходимо указать хост экземпляра KubernetesServer EC2. Для этого вам нужно повторить те же шаги, которые вы прошли в « [Модуль 6]: Ansible».
Давайте узнаем хост экземпляра KubernetesServer EC2, выполнив следующую команду.
sudo ifconfig
Найдя хост экземпляра KubernetesServer EC2, вы можете добавить его в файл хостов Ansible, выполнив следующую команду.
sudo vi /etc/ansible/hosts
Вы также можете добавить «[kubernetes]» в качестве ссылки.
Теперь, когда Kubernetes настроен и готов к работе, вы можете создать новый сборник сценариев Ansible с задачами Kubernetes для вашего конвейера. Этот сборник сценариев позволит Ansible запускать ваше приложение в кластере Kubernetes с помощью команд kubectl.
Вот как вы можете это сделать:
touch kubernetes-hello-app.yml
hello-app.yml
. Откройте его для редактирования с помощью этой команды. vi kubernetes-hello-app.yml
--- - hosts: kubernetes tasks: - name: deploy regapp on kubernetes command: kubectl apply -f hello-app-deployment.yaml - name: create service for regapp command: kubectl apply -f hello-app-service.yaml - name: update deployment with new pods if image updated in docker hub command: kubectl rollout restart deployment.apps/zufarexplainedit-hello-app
Сборник сценариев Ansible для задач Kubernetes готов к использованию.
Теперь, когда Kubernetes, Ansible и Ansible playbook для задач Kubernetes настроены и готовы к работе, вы можете интегрировать их с Jenkins.
Перейдите в JenkinsServer → Панель управления Jenkins → Новый элемент.
Создайте новый проект Jenkins Freestyle с именем «CD-Job».
Нажмите кнопку «ОК».
Перейдите в раздел «Действия после сборки».
Нажмите кнопку «Добавить действие после сборки».
Выберите опцию «Отправить артефакты сборки через SSH».
Выберите «AnsibleServer» в качестве SSH-сервера.
Добавьте эту команду во входную команду «exec command».
sudo -u ansible-admin ansible-playbook /opt/docker/kubernetes-hello-app.yml
Нажмите кнопки «Применить» и «Сохранить».
Перейдите на панель управления Jenkins → «CI_CD_Pipeline» → «Настроить» → раздел «Действия после сборки».
Нажмите кнопку «Добавить действие после сборки».
Выберите опцию «Создать другие проекты».
Перейдите в раздел «Создать другие проекты».
Выберите опцию «Триггер только в том случае, если сборка стабильна».
Добавьте «CD-Job» к входным данным «Проект для сборки».
Нажмите кнопки «Применить» и «Сохранить».
Теперь можно считать, что трубопровод полностью готов и готов к использованию.
Настало время протестировать окончательную версию конвейера.
Перейдите в Jenkins → Панель управления Jenkins → «CI_CD_Pipeline».
Нажмите кнопку «Построить сейчас».
Чтобы увидеть результаты, просмотрите журналы консоли сборки.
Вы заметите, что «CD-Job» был запущен в журналах консоли сборки, а окончательный статус отмечен как «УСПЕХ».
4
Кроме того, вы можете зайти в Dockerhub, чтобы подтвердить добавление нового образа Docker.
И, наконец, вы можете получить доступ к своему приложению с помощью веб-браузера. Введите назначенный внешний IP-адрес, а затем «:8080». Через некоторое время страница загрузится и отобразит сообщение «HelloWorld».
Молодцы, что настроили этот современный конвейер CI/CD!
Ты проделал потрясающую работу и ты настоящий герой!
Спасибо за все ваши усилия!
Зуфар Сунагатов — опытный старший инженер-программист, увлеченный разработкой современных программных систем.