feat(): Add demonstration 7.1

This commit is contained in:
Black_Raven committed 2026-06-18 23:37:27 +03:00
1 parent cc1e9c2320
commit aac766d4a5
5 files changed
+335

No files matched your search

@@ -0,0 +1,202 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 7
task_code: 1
task_title: CI/CD с использованием Terraform и GitHub Actions
student_fio: Ремизов Кирилл Львович
date: 2026-06-18
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- terraform init
- terraform validate
- terraform plan -out=tfplan
- terraform apply -auto-approve tfplan
- git add
- git commit
- git push
- gh pr create
- gh pr merge
- openstack server list
attached_files:
- VKC_PR_M07_01_cicd_terraform_РемизовКЛ_20260618.yml
- VKC_PR_M07_01_cicd_workflow_РемизовКЛ_20260618.png
- VKC_PR_M07_01_cicd_terraform_РемизовКЛ_20260618.log
status: final
---
# Отчёт по практической демонстрации
## 1. Цель
Освоить настройку CI/CD для управления инфраструктурой в облаке VK Cloud с использованием **Terraform** и **GitHub Actions**. Научиться:
- организовывать репозиторий с Terraform-конфигурацией и пайплайном;
- настраивать GitHub Actions для автоматического выполнения `terraform validate`, `plan` и `apply`;
- использовать артефакты для передачи плана между джобами;
- публиковать результаты `terraform plan` в комментариях к Pull Request;
- настраивать защищённые окружения (`environment`) с ручным подтверждением для продакшн-применений;
- безопасно хранить чувствительные данные (учётные данные VK Cloud, SSH-ключи) в секретах GitHub.
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 7 «Безопасность, CI/CD и FinOps», тема 7.2 «CI/CD и GitOps»
- **Ключевые понятия:**
- **CI/CD** — непрерывная интеграция и доставка, автоматизация сборки, тестирования и развертывания.
- **GitHub Actions** — платформа для автоматизации рабочих процессов (workflows) непосредственно в репозитории.
- **Terraform** — инструмент Infrastructure as Code, позволяющий описывать и версионировать инфраструктуру.
- **Артефакты** — файлы, передаваемые между джобами (в нашем случае — сохранённый план `tfplan`).
- **Окружения (environments)** — механизм GitHub для управления развертываниями с правилами защиты (требование подтверждения).
- **Секреты** — зашифрованные переменные, доступные только в workflows.
- **Дополнительно:** Документ 4-Практические работы - VK -1.md, демонстрация 7.1 «Настройка CI/CD пайплайна».
## 3. Ход выполнения
### Демонстрация 7.1: Настройка CI/CD пайплайна
#### Этап 0. Подготовка репозитория и структуры
- Создан репозиторий на GitHub с ветками `main` и `dev`:
- **URL:** [https://github.com/BlackCorbeau/7.1](https://github.com/BlackCorbeau/7.1)
- В корне репозитория создана следующая структура:
```
.
├── .github/
│ └── workflows/
│ └── terraform.yml
├── terraform/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── README.md
```
- Файлы `main.tf`, `variables.tf` и `outputs.tf` были скопированы из предыдущей практической работы по мониторингу (стек Prometheus + Grafana). В `variables.tf` добавлены переменные для аутентификации в VK Cloud (`vkcs_username`, `vkcs_password`, `vkcs_project_id`, `vkcs_region`, `vkcs_auth_url`, `my_ip`, `ssh_public_key`).
#### Этап 1. Разработка workflow (`.github/workflows/terraform.yml`)
Создан файл `terraform.yml` (полный листинг приведён в разделе 5.1). Workflow включает два задания (jobs):
1. **plan** — выполняется при любом событии `push` в `main` и `pull_request` в `main`:
- Устанавливает Terraform версии 1.5.0.
- Создаёт файл `~/.ssh/id_rsa.pub` из секрета `SSH_PUBLIC_KEY`.
- Инициализирует Terraform с передачей переменных из секретов.
- Выполняет `terraform validate`.
- Выполняет `terraform plan -out=tfplan`.
- Сохраняет план как артефакт с именем `tfplan`.
- Если событие — `pull_request`, публикует вывод `plan` в комментарий к PR (с обрезкой при превышении 60000 символов).
2. **apply** — выполняется **только** при `push` в `main` и **зависит** от `plan`:
- Запускается в окружении `production` с правилом защиты, требующим ручного подтверждения.
- Скачивает артефакт `tfplan`.
- Повторно инициализирует Terraform.
- Применяет сохранённый план: `terraform apply -auto-approve tfplan`.
#### Этап 2. Настройка секретов GitHub
В настройках репозитория (Settings → Secrets and variables → Actions) добавлены следующие секреты:
| Секрет | Описание |
|----------------------|-----------------------------------|
| `VKCS_USERNAME` | Логин пользователя VK Cloud |
| `VKCS_PASSWORD` | Пароль пользователя |
| `VKCS_PROJECT_ID` | ID проекта |
| `VKCS_REGION` | Регион (ru-msk) |
| `VKCS_AUTH_URL` | URL аутентификации |
| `SSH_PUBLIC_KEY` | Публичный ключ для доступа к ВМ |
| `MY_IP` | Мой публичный IP для SSH |
#### Этап 3. Тестирование пайплайна через Pull Request
1. Создана ветка `dev` и внесены изменения в `main.tf` (например, изменено количество реплик).
2. Создан Pull Request из `dev` в `main`.
3. Workflow автоматически запустил задание `plan`:
- Инициализация, валидация и план прошли успешно.
- В комментарии к PR появился вывод `terraform plan` с перечнем изменений (добавление/удаление ресурсов).
4. После проверки комментария Pull Request был смержен в `main`.
#### Этап 4. Применение изменений в production
- После мержа в `main` автоматически запустилось задание `apply`.
- В интерфейсе GitHub Actions появилась кнопка "Review deployments" для окружения `production`.
- Был нажат "Approve and deploy" (ручное подтверждение).
- После подтверждения `apply` успешно выполнился, и инфраструктура была обновлена согласно плану.
#### Этап 5. Проверка созданных ресурсов
Через OpenStack CLI проверено, что ВМ и другие ресурсы созданы/изменены корректно:
```bash
openstack server list
```
#### Этап 6. Очистка (опционально)
Для завершения работы выполнено:
```bash
terraform destroy -auto-approve
```
(в рамках отчёта сохранены ресурсы для демонстрации).
## 4. Ошибки и исправления
| Проблема | Решение |
| :--- | :--- |
| **Отсутствие прав на запись в PR комментарий** | Добавлено разрешение `pull-requests: write` в секции `permissions` для задания `plan`. |
| **SSH-ключ не находился** | Вместо `file("~/.ssh/id_rsa.pub")` в `main.tf` использована переменная `var.ssh_public_key`, которая передаётся как строка из секрета. |
| **План не применялся из-за устаревшего state** | Артефакт `tfplan` сохранялся и передавался корректно; в `apply` использован тот же план. |
| **В комментарии выводился огромный план, обрезалось** | Добавлена проверка длины и обрезка до 60000 символов с указанием `... (truncated)`. |
| **Apply не запускался после push** | Условие `if: github.event_name == 'push' && github.ref == 'refs/heads/main'` было настроено верно; дополнительно требовалось настроить окружение `production` с правилами защиты. |
## 5. Критерии успеха
- [x] **Workflow определён** — файл `.github/workflows/terraform.yml` создан и закоммичен.
- [x] **Задание `plan` работает** — при `push` и `pull_request` запускается, выполняет `init`, `validate`, `plan`, сохраняет артефакт.
- [x] **Комментарий в PR** — при создании PR в комментарии появляется вывод `terraform plan`.
- [x] **Задание `apply` запускается только на `main`** — после мержа PR запускается, но требует ручного подтверждения.
- [x] **Ручное подтверждение** — в GitHub Actions отображается кнопка подтверждения для окружения `production`.
- [x] **Применение успешно** — после подтверждения инфраструктура изменяется согласно плану.
- [x] **Все секреты переданы** — переменные окружения подставлены, аутентификация проходит.
- [x] **Артефакт `tfplan` передаётся** — скачивается в джобе `apply` и применяется.
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ------------------------------------------------------------------------------ | ------------- | ----------------------------------------------------- |
| `VKC_PR_M07_01_cicd_terraform_РемизовКЛ_20260618.yml` | Конфигурация | Исходный код workflow (GitHub Actions) |
| `VKC_PR_M07_01_cicd_workflow_РемизовКЛ_20260618.png` | Скриншот | Визуализация структуры workflow (из интерфейса GitHub) |
| `VKC_PR_M07_01_cicd_terraform_РемизовКЛ_20260618.log` | Текстовый лог | Полный вывод выполнения workflow (прилагается отдельно) |
| **Репозиторий GitHub** | Ссылка | [https://github.com/BlackCorbeau/7.1](https://github.com/BlackCorbeau/7.1) – все файлы, история коммитов и Actions доступны |
## 7. Самопроверка
- **Что получилось:**
Удалось настроить полноценный CI/CD-пайплайн для Terraform. Workflow автоматически выполняет проверку синтаксиса, планирование изменений и публикует результат в PR. Применение защищено ручным подтверждением, что соответствует best practices для продакшн-окружений. Секреты передаются безопасно, артефакты работают.
- **Что осталось непонятным:**
- Как лучше организовать параллельное выполнение `plan` для нескольких окружений (dev/staging/prod) в одном репозитории.
- Как автоматически обновлять комментарий в PR при новых коммитах (сейчас перезаписывается, но нужно удалять старый).
- Возможность интеграции с внешними системами уведомлений (например, Slack) о статусе деплоя.
- **Что можно улучшить:**
- Добавить стадию `terraform fmt -check` для автоматической проверки форматирования.
- Настроить хранение state-файла в удалённом бэкенде (например, S3) с блокировками для предотвращения конкурентных изменений.
- Внедрить тестирование инфраструктуры (terratest) перед применением.
- Использовать `matrix` для параллельного плана по нескольким окружениям.
## 8. Краткий вывод
Практическая работа позволила на практике реализовать CI/CD-пайплайн для управления облачной инфраструктурой с использованием **Terraform** и **GitHub Actions**. Автоматизация процессов проверки и развертывания значительно сокращает время внесения изменений и снижает риск человеческой ошибки.
Ключевые преимущества подтверждены на практике:
- **Воспроизводимость** — весь процесс описан кодом и хранится в репозитории.
- **Безопасность** — чувствительные данные не попадают в код, доступ к продакшну защищён.
- **Прозрачность** — план изменений доступен для ревью в комментариях PR.
Полученный пайплайн может быть легко расширен для работы с несколькими окружениями и интегрирован с инструментами GitOps (например, ArgoCD), что делает его универсальным решением для автоматизации доставки инфраструктуры.