Вам уже знакомо это приложение, вы работали с ним во время выполнения домашнего задания по автотестам. Теперь вам предстоит добавить в него CI/CD.
Вам необходимо форкнуть этот репозиторий и добавить:
- сборку Docker-образа, который содержит работающее приложение;
- запуск тестов на каждый PR;
- процессы для отведения релизной ветки и внесения фиксов;
- деплой приложения на сервер.
Также вам будет нужно настроить виртуальную машину в Яндекс Облаке и Container Registry, для этого вам выдадут промокоды на 1500 рублей. IP-адрес этой машинки укажите в README, чтобы проверяющий мог открыть приложение, которое будет на ней запущено.
Репозиторий, который вы форкнули, должен быть публичным и настроен таким образом, чтобы никто не могу пушить ветку main
, но любой человек мог:
- запускать релизные флоу,
- создавать пулл-реквесты и вливать их, если все проверки прошли успешно.
В файле ./src/client/pages/About.tsx
замените [Your Name]
на своё имя и поправьте тест, которы проверяет содержимое этой строчки.
Вам необходимо подготовить Dockerfile и добавить скрипты в package.json
для работы с Docker-образами.
Скрипт:
build:docker
— собирает образ (с тегомshir-infra
), который будет запускать приложениеstart:docker
— запускает последний собранный образа с тегомshri-infra
на 3000 порту
Создайте виртуальную машину (Compute Cloud), воспользовавшись инструкцией по ссылке:
https://yandex.cloud/ru/docs/compute/quickstart/quick-create-linux#create-vm
Рекомендуемые параметры:
- Операционная система: Ubuntu 20.04
- Диск: HDD на 10 Гб
- Вычислительные ресурсы: 2vCPU, 2 Гб RAM
- Включена опция «Публичный IP-адрес»
В итоге должно получиться чуть меньше 2 200 рублей в месяц — на две недели выполнения и проверки задания должно хватить.
-
Флоу с проверками, который запускается при создании / изменении PR:
-
запускает параллельно линтер через
npm run lint
и тесты черезnpm run test
-
нужно настроить ограничение на мердж изменений, если проверки не прошли
-
-
Флоу создания релиза, который запускается вручную (
on: [workflow_dispatch]
):-
запускает параллельно линтер и тесты
-
здесь и дальше версией релиза будет считаться номер запуска флоу
${{ github.run_number }}
-
отводит от
main
релизуню веткуreleases/<версия_релиза>
-
собирает docker-образ с двумя тегами тегами:
cr.yandex/<идентификатор_реестра>/app:<версия_релиза>
cr.yandex/<идентификатор_реестра>/app:<версия_релиза>_latest
-
загружает docker-образ в Container Registry (необходимо, чтобы реджистри отображались оба тега)
-
создаёт тег, с номером текущей версии, который указывает на последний коммит в главной ветке
-
создаёт Issue в GitHub, которое содержит всю важную информацию:
- дату,
- автора релиза (тот, кто запустил флоу),
- номер версии (
${{ github.run_number }}
), - список коммитов от предыдущего релизного (или фиксрелизного) тега,
- ссылку на docker-образом в Yandex Container Registry
cr.yandex/<идентификатор_реестра>/app:<версия_релиза>
-
обновляет файл
CHANGELOG.md
в корне проекта, дописывает сверху новую версию в виде заголовка, а под ней — список коммитов от предыдущего релизного (или фиксрелизного) тега
-
-
Флоу фикса к релизу, который запускается вручную:
-
принимает на вход версию релиза и все действия выполняет в ветке этого релиза
-
запускает параллельно проверку типов и тесты
-
собирает docker-образ с двумя тегами:
cr.yandex/<идентификатор_реестра>/app:<версия_релиза>_fix<номер_запуска_фиксрелизного_флоу>
cr.yandex/<идентификатор_реестра>/app:<версия_релиза>_latest
-
загружает docker-образ в Container Registry (в реджистри должен появиться образ с двумя тегами, у старого образа тег latest пропадёт)
-
создаёт тег с номером текущего релиза + пометкой
fix
и номером фикса -
добавляет комментарий в Issue, который содержит:
- дату фикса,
- автора фикса (тот, кто запустил флоу),
- список коммитов от предыдущего релизного (или фиксрелизного) тега
- ссылку на doname: 'Git-авторизация'
-
runs:
steps:
- name: Git-авторизация
run: |
git config user.name "${{ github.actor }}"
git config user.email "empty@gmail.com"cker-образом в Yandex Container Registry
cr.yandex/<идентификатор_реестра>/app:<версия_релиза>_fix<номер_запуска_фиксрелизного_флоу>
-
Флоу выкатки релиза в прод
-
принимает на вход версию релиза
-
проверяет, что существует образ в Container Registry с тегом
<версия_релиза>_latest
-
в Issue добавьте комментарий о том, что релиз выкачен в прод c датой и человеком, который запустил выкатку в прод
-
# установите зависимости
npm ci
# соберите клиентский код приложения
npm run build
# запустите сервер
npm start
После этого можете открыть приложение в браузере по адресу http://localhost:3000/hw/store