мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
devops_training_in_yandex:devops-trainings-cloud-1 [2023/11/10 08:17] Администраторdevops_training_in_yandex:devops-trainings-cloud-1 [2023/11/13 11:21] (текущий) Администратор
Строка 113: Строка 113:
 {{:devops_training_in_yandex:pasted:20231109-105432.png?nolink}} {{:devops_training_in_yandex:pasted:20231109-105432.png?nolink}}
  
-===== Автосборка с помощью Github CI =====+===== Автосборка с помощью Github CI и отправка в Яндекс облако =====
 Для начала нужно создать ключи доступа к яндекс облаку из Github Для начала нужно создать ключи доступа к яндекс облаку из Github
 <code>yc iam access-key create --service-account-name ikfellk</code> <code>yc iam access-key create --service-account-name ikfellk</code>
Строка 127: Строка 127:
 {{:devops_training_in_yandex:pasted:20231110-111730.png?nolink}} {{:devops_training_in_yandex:pasted:20231110-111730.png?nolink}}
  
-Создаем в корне своего репозитория на гитхабе файл +Создаем в репозитории на гитхабе файл 
-<code>docker-build-catgpt.yml</code>+<code>.github/workflows/docker-build-catgpt.yml</code>
 <code>name: Docker Build and Deploy catgpt <code>name: Docker Build and Deploy catgpt
  
 on: on:
   push:   push:
-    branches+    tags
-      - main+      - '*'  # Любой тег
  
 jobs: jobs:
Строка 142: Строка 142:
       - name: Checkout       - name: Checkout
         uses: actions/checkout@v2         uses: actions/checkout@v2
 +      - name: Login to Yandex
 +        run: docker login -u ${{ secrets.YANDEX_USERNAME }} -p ${{ secrets.YANDEX_CLOUD_SERVICE_ACCOUNT_KEY }}  cr.yandex/crj3b74hbhretbg25qbk
       - name: Build and push Docker image       - name: Build and push Docker image
         run: |         run: |
-          docker build -t ikfellk/catgpt:v1 . +          docker build -t cr.yandex/crj3b74hbhretbg25qbk/catgpt:v1 ./catgpt 
-          docker tag ikfellk/catgpt:v1 cr.yandex/crp3b70hbcrvtbg25qbk/ikfellkcatgpt +          docker push cr.yandex/crj3b74hbhretbg25qbk/catgpt:v1</code> 
-          echo "$YANDEX_CLOUD_SERVICE_ACCOUNT_KEY" | yc auth login --service-account-key +<note>Где: 
-          docker login -u jsonkey -p "$(yc registry get-credentials)cr.yandex/crp3b70hbcrvtbg25qbk +  * **YANDEX_USERNAME** - логин от яндекс облака 
-          docker push cr.yandex/crp3b70hbcrvtbg25qbk/ikfellkcatgpt +  * **YANDEX_CLOUD_SERVICE_ACCOUNT_KEY** Токен авторизации созданный ранее 
-      env+  * **crj3b74hbhretbg25qbk** Идентификатор вашего реестра на яндекс облаке 
-        YANDEX_CLOUD_SERVICE_ACCOUNT_KEY: ${{ secrets.YANDEX_CLOUD_SERVICE_ACCOUNT_KEY }} +</note> 
-      - name: Deploy to Yandex.Cloud +Создаем секреты описанные в предыдущем шаге 
-        run| +для создания вы должны находится в своем репозитории и нажать кнопку **Settings** 
-          yc compute container create --name registry-ikfellk --image cr.yandex/crp3b70hbcrvtbg25qbk/ikfellkcatgpt --format json</code>+ 
 +{{:devops_training_in_yandex:pasted:20231110-122951.png?nolink}} 
 + 
 +Далее перейти в **Secrets and variables** и далее в **Actions** 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-123059.png?nolink}} 
 + 
 +Теперь создаем секреты для авторизации 
 +Нужно нажать **New repository secret** 
 +Ввести названия что упоминались выше или можете посмотреть свой файл **docker-build-catgpt.yml** и там найти строки с секретами и изменить на ваши названия, которые вы создали 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-123202.png?nolink}} 
 +<note important>Важное напоминание 
 + 
 +У вас должен лежать Dockerfile в каталоге, который использует команда docker build. 
 + 
 +В случае данного задания у меня лежит файл в каталоге **./catgpt** 
 +</note> 
 + 
 +===== Тестируем автосборку и отправку в Яндекс облако ===== 
 +В консоли переходим в каталог клонированной ветки репозитория гитхаба 
 +<code>cd y-y-devops-trainings-cloud-1/</code> 
 +Выполняем команды 
 +<code>git pull</code> 
 +<code>git tag -a v1.2.4 -m "Тест автосборки"</code> 
 +<code>git push origin v1.2.4</code> 
 +Вводим логин и пароль от гитхаба и получаем такой вывод 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-124248.png?nolink}} 
 + 
 +Переходим в браузере в данный репозиторий во складку **Actions** 
 +И видим что процесс автосборки пошел 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-124422.png?nolink}} 
 + 
 +Буквально через несколько минут там же вы увидите такую картину 
 + 
 +Процесс сборки завершился успешно 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-124517.png?nolink}} 
 + 
 +Теперь переходим в свое яндекс облако и проверяем действительно ли там появился образ 
 + 
 +Вуаля и он действительно там 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-124617.png?nolink}} 
 + 
 +===== Автосборка с помощью Github CI и отправка в Docker Hub ===== 
 +Для начала нужно создать токен авторизации на docker hub: 
 +  * Переходим на [[https://hub.docker.com| сайт]] 
 +  * Логинимся под своей учеткой 
 +  * Переходим в **Account Settings** 
 +  * Далее **Security** 
 +  * Нажимаем **New Access Token** 
 +  * Даем ему имя и права 
 +  * Получаем готовый токен 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-125344.png?nolink}} 
 + 
 +Токен копируем и не теряем, он пригодится для создания секретов на гитхабе 
 +Создаем в репозитории на гитхабе файл 
 +<code>.github/workflows/docker-publish.yml</code> 
 +<code>name: Publish Docker image 
 + 
 +on: 
 +  push: 
 +    tags: 
 +      - '*'  # Любой тег 
 + 
 +jobs: 
 +  push_to_registry: 
 +    name: Push Docker image to Docker Hub 
 +    runs-on: ubuntu-latest 
 +    steps: 
 +      - name: Check out the repo 
 +        uses: actions/checkout@v4 
 +       
 +      - name: Log in to Docker Hub 
 +        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a 
 +        with: 
 +          username: ${{ secrets.USERNAME }} 
 +          password: ${{ secrets.PASSWORD }} 
 +       
 +      - name: Extract metadata (tags, labels) for Docker 
 +        id: meta 
 +        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 
 +        with
 +          images: ikfellk/catgpt 
 +       
 +      - name: Build and push Docker image 
 +        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 
 +        with: 
 +          context: ./catgpt 
 +          file: ./Dockerfile 
 +          push: true 
 +          tags: ${{ steps.meta.outputs.tags }} 
 +          labels: ${{ steps.meta.outputs.labels }}</code> 
 +           
 +<note>Где: 
 +  * **USERNAME** - логин от docker hub 
 +  * **PASSWORD** - Токен авторизации созданный ранее 
 +</note> 
 +Создаем секреты описанные в предыдущем шаге 
 +для создания вы должны находится в своем репозитории и нажать кнопку **Settings** 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-122951.png?nolink}} 
 + 
 +Далее перейти в **Secrets and variables** и далее в **Actions** 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-123059.png?nolink}} 
 + 
 +Теперь создаем секреты для авторизации 
 +Нужно нажать **New repository secret** 
 +Ввести названия что упоминались выше или можете посмотреть свой файл **docker-publish.yml** и там найти строки с секретами и изменить на ваши названия, которые вы создали 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-123202.png?nolink}} 
 +<note important>Важное напоминание 
 +У вас должен лежать Dockerfile в корневом каталоге 
 +</note> 
 + 
 +===== Тестируем автосборку и отправку в Docker Hub ===== 
 +В консоли переходим в каталог клонированной ветки репозитория гитхаба 
 +<code>cd y-y-devops-trainings-cloud-1/</code> 
 +Выполняем команды 
 +<code>git pull</code> 
 +<code>git tag -a v1.2.4 -m "Тест автосборки"</code> 
 +<code>git push origin v1.2.4</code> 
 + 
 +Получаем выполненный процесс как и в предыдущем тестировании 
 +Переходим в свой репозиторий на **Docker hub** и убеждаемся что файлы попали туда 
 + 
 +{{:devops_training_in_yandex:pasted:20231110-130712.png?nolink}} 
 + 
 +===== Разворачиваем инфраструктуру с помощью Terraform ===== 
 +==== Установка ==== 
 + 
 +Для начала нужно установить Terraform, а т.к. мы в России, то делать будем это через репозиторий яндекса 
 +Заходим на сайт **https://hashicorp-releases.yandexcloud.net/terraform/** и копируем ссылку последней версии 
 +Выполняем команды: 
 +Скачать архив 
 +<code>wget https://hashicorp-releases.yandexcloud.net/terraform/1.6.3/terraform_1.6.3_linux_amd64.zip</code> 
 +Распаковать архив 
 +<code>unzip terraform_1.6.3_linux_amd64.zip</code> 
 +Переместить файл 
 +<code>sudo mv terraform /usr/local/bin</code> 
 + 
 +==== Проверка работы Terraform ==== 
 +Переходим в заранее клонированный репозиторий с github в папку terraform 
 +И выполняем команду 
 +<code>terraform init</code> 
 +Если получаете ошибку такого рода 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-103023.png?nolink}} 
 + 
 +То нужно выполнить следующее: 
 +Создать файл 
 +<code>nano ~/.terraformrc</code> 
 +<code>provider_installation { 
 +  network_mirror { 
 +    url = "https://terraform-mirror.yandexcloud.net/" 
 +    include = ["registry.terraform.io/*/*"
 +  } 
 +  direct { 
 +    exclude = ["registry.terraform.io/*/*"
 +  } 
 +}</code> 
 +После этого пробуем еще раз команду 
 +<code>terraform init</code> 
 +И получаем положительный результат 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-103308.png?nolink}} 
 + 
 +==== Запуск ==== 
 +<note important>У вас заранее должны быть созданы два сервисных аккаунта в яндекс облаке с нужными правами, описанными в **main.tf**</note> 
 +Для начала нужно выполнить команду 
 +<code>terraform plan</code> 
 +Данная команда покажет ошибки в вашем main.tf если таковы имеются. 
 +В моем случае ошибки есть и их нужно исправить 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-103833.png?nolink}} 
 + 
 +=== Разбор ошибок и устранение === 
 +1) Ошибка в названии регистра 
 +<note>Error: Reference to undeclared resource 
 +on output.tf line 2, in output "container_registry_id": 
 +2:   value = yandex_container_registry.registry1.id 
 +A managed resource "yandex_container_registry" "registry1" has not been declared in the root module.</note> 
 + 
 +Тут все просто, в файле **output.tf** не верно указано название регистра **registry1** 
 +В моем случае оно называется **ikfellk-registry** Просто меняю на корректное название и ошибка уходит 
 + 
 +2) Отсутствует json файл с данными 
 +<note>Error: Invalid SA Key 
 +with provider["registry.terraform.io/yandex-cloud/yandex"], 
 +on main.tf line 11, in provider "yandex": 
 +11:   service_account_key_file = "./tf_key.json" 
 +JSON in "./tf_key.json" are not valid: invalid character '.' looking for beginning of value 
 +Error: JSON in "./tf_key.json" are not valid: invalid character '.' looking for beginning of value 
 +with provider["registry.terraform.io/yandex-cloud/yandex"], 
 +on main.tf line 11, in provider "yandex": 
 +11:   service_account_key_file = "./tf_key.json"</note> 
 + 
 +Для решения нужно сгенерировать json файл с данными для входа 
 +Мы это уже делали ранее [[https://wiki.fellk.ru/doku.php/devops_training_in_yandex/devops-trainings-cloud-1#avtosborka_s_pomoschju_github_ci_i_otpravka_v_jandeks_oblako | тут]] 
 +Теперь выполняем команду 
 +<code>terraform plan</code> 
 +Видим что ошибки ушли, но появилась еще одна 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-113611.png?nolink}} 
 + 
 +3) Отсутствует SSH ключ для авторизации 
 +<note>Error: Invalid function argument 
 +on main.tf line 119, in resource "yandex_compute_instance_group" "catgpt": 
 +119:       ssh-keys  = "ubuntu:${file("~/.ssh/devops_training.pub")}" 
 +while calling file(path) 
 +Invalid value for "path" parameter: no file exists at "~/.ssh/devops_training.pub"; this function works 
 +only with files that are distributed as part of the configuration source code, so if this file will be 
 +created by a resource in this configuration you must instead obtain this result from an attribute of that 
 +resource.</note> 
 +Для решения нужно сгенерировать SSH ключ 
 +<code>ssh-keygen -t rsa</code> 
 +Указываем путь и название как в ошибке **/root/.ssh/devops_training** 
 +Вводим пароль 
 +Проверяем полученные сертификаты 
 +<code>~/.ssh/</code> 
 +{{:devops_training_in_yandex:pasted:20231113-114723.png?nolink}} 
 + 
 +Теперь выполняем команду 
 +<code>terraform plan</code> 
 +И получаем полностью корректный план. 
 +Небольшой пример как это выглядит 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-123824.png?nolink}} 
 + 
 +После этого можно запускать команду, которая настроит все необходимые ресурсы в автоматическом режиме 
 +<code>terraform apply</code> 
 +В конце, как отработает команда, вы получите такой вывод 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-132702.png?nolink}} 
 + 
 +===== Тестируем отработанный Terraform ===== 
 +Переходим в свой личный кабинет яндекс облака и смотрим что там появились машины, сети, балансировщик и регистр 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-133032.png?nolink}} 
 + 
 +Теперь нужно загрузить актуальную версию приложения в контейнер 
 +Для этого выполняем уже знакомые нам команды 
 +<code>git pull</code> 
 +<code>git tag -a v1.2.5 -m "Тест автосборки"</code> 
 +<code>git push origin v1.2.5</code> 
 +Вводим логин и пароль от гитхаба 
 +Спустя примерно минуту или полторы, смотрим в личный кабинет яндекс облака и видим там контейнер 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-141414.png?nolink}} 
 + 
 +Теперь переходим в веб браузер по ip адресам виртуальный машин созданный нашим terraform файлом 
 +и видим там рабочее приложение и метрики 
 + 
 +{{:devops_training_in_yandex:pasted:20231113-141532.png}} 
 +{{:devops_training_in_yandex:pasted:20231113-141625.png}} 
 +{{:devops_training_in_yandex:pasted:20231113-141549.png}} 
 +{{:devops_training_in_yandex:pasted:20231113-141641.png}} 
 + 
 +Для проверки балансировки нужно отключить одну виртуальную машину и со второй ничего не должно произойти и приложение так же останется в рабочем состоянии 
 + 
 +Все работает как нужно. 
 + 
 +Делаем удаление всех ресурсов 
 +<code>terraform destroy</code> 
 + 
 +Задание выполнено.