{"id":25806125,"url":"https://github.com/yandex-cloud-examples/yc-serverless-gitlab-ci-cd","last_synced_at":"2025-02-27T19:59:37.607Z","repository":{"id":277794589,"uuid":"771711726","full_name":"yandex-cloud-examples/yc-serverless-gitlab-ci-cd","owner":"yandex-cloud-examples","description":"Использование СI/CD для развертывания Serverless приложений в Yandex Cloud.","archived":false,"fork":false,"pushed_at":"2025-02-16T06:14:15.000Z","size":24,"stargazers_count":2,"open_issues_count":1,"forks_count":3,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-02-16T07:19:27.632Z","etag":null,"topics":["api-gateway","container-registry","docker","gitlab-runner","lockbox","python3","serverless","serverless-containers","yandex-cloud","yandex-database","yandexcloud","yc-cli","ydb"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yandex-cloud-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-13T20:03:54.000Z","updated_at":"2025-02-15T20:41:06.000Z","dependencies_parsed_at":"2025-02-16T07:29:31.522Z","dependency_job_id":null,"html_url":"https://github.com/yandex-cloud-examples/yc-serverless-gitlab-ci-cd","commit_stats":null,"previous_names":["yandex-cloud-examples/yc-serverless-gitlab-ci-cd"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yandex-cloud-examples","download_url":"https://codeload.github.com/yandex-cloud-examples/yc-serverless-gitlab-ci-cd/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241053195,"owners_count":19901181,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-gateway","container-registry","docker","gitlab-runner","lockbox","python3","serverless","serverless-containers","yandex-cloud","yandex-database","yandexcloud","yc-cli","ydb"],"created_at":"2025-02-27T19:59:36.926Z","updated_at":"2025-02-27T19:59:37.594Z","avatar_url":"https://github.com/yandex-cloud-examples.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Демонстрация использования СI/CD для разворачивания serverless-приложений в Yandex Cloud\n\nВ этом примере демонстрируется тестовое приложение, которое разворачивается в Yandex Cloud на serverless-компонентах. Процесс сборки, тестирования и деплоя приложения полностью автоматизирован с помощью GitLab CI/CD.\n\n## Используемые сервисы и технологии\n\n* [GitLab Runner](https://docs.gitlab.com/runner/) — для автоматизации процессов.\n* [Docker](https://www.docker.com/) — для контейнеризации приложения.\n* [Yandex Container Registry](https://cloud.yandex.ru/services/container-registry) — для хранения Docker-образа приложения.\n* [Yandex Serverless Containers](https://cloud.yandex.ru/services/serverless-containers) — для развертывания приложения в бессерверном режиме.\n* [Yandex API Gateway](https://cloud.yandex.ru/services/api-gateway) — отвечает за прием трафика в приложении.\n* [Yandex Managed Service for YDB](https://cloud.yandex.ru/services/ydb) в режиме serverless Document API — для хранения данных приложения.\n* [Yandex Lockbox](https://cloud.yandex.ru/services/lockbox) — для хранения и доставки секретов приложения.\n\n## Как развернуть демо-приложение у себя\n\nЧтобы самостоятельно развернуть этот пример, вам потребуется репозиторий в GitLab и аккаунт в Yandex Cloud.\n\nЛокально должны быть установлены и настроены приложения и утилиты:\n* [Интерфейс командной строки Yandex Cloud](https://cloud.yandex.ru/docs/cli/).\n* [Утилита потоковой обработки JSON-файлов `jq`](https://stedolan.github.io/jq/).\n* [Утилита потоковой обработки YAML-файлов `yq`](https://github.com/mikefarah/yq).\n* [Python версии 3.8 или выше](https://www.python.org/).\n* Библиотеки Python, перечисленные в [application/requirements.txt](application/requirements.txt).\n\nТакже обратите внимание, что сервис Yandex Lockbox находится на стадии [Preview](https://cloud.yandex.ru/docs/overview/concepts/launch-stages). Доступ предоставляется по запросу. Для использования сервиса в своем облаке [запросите доступ](https://cloud.yandex.ru/services/lockbox#preview-form).\n\n## Первоначальная настройка\n\n1. Скопируйте содержимое этой директории в корень своего репозитория GitLab.\n1. Для развертывания базовой инфраструктуры в корне репозитория выполните команду:\n\n   ```bash\n   YC_CLOUD_ID=\u003cидентификатор вашего облака\u003e ./bootstrap.sh\n   ```\n\nВ конце выполнения скрипт выведет значения переменных окружения для GitLab. Сохраните их, они потребуются в дальнейшем.\n\n## О приложении\n\nВ этом демонстрационном проекте реализовано простое web-приложение на [Django](https://www.djangoproject.com/), имитирующее корзину товаров e-commerce сервиса.\n\nВ базе данных хранятся описания товаров, БД наполняется тестовыми данными из bootstrap-скрипта. Состояние корзины товаров сервис хранит в сессии пользователя.\n\nDjango-приложение разворачивается в serverless-контейнере, доставка секретов в приложение осуществляется безопасно с помощью сервиса Yandex Lockbox. API Gateway принимает запросы от пользователей и перенаправляет их в контейнер приложения.\n\n## Окружения\n\nВ этом примере мы используем два окружения для деплоя нашего приложения:\n* **prod** — продакшн окружение, доступное пользователям.\n* **testing** — тестовое окружение, используется для проверки приложения перед релизом в **prod**.\n\nДля каждого из окружений в bootstrap-скрипте создается отдельный каталог в Yandex Cloud, а так же отдельный набор статических ресурсов — БД, сервисные аккаунты и т. д. Таким образом все окружения изолированы друг от друга на уровне настроек [Yandex Identity and Access Management](https://cloud.yandex.ru/services/iam).\n\nОкружения **prod** и **testing** содержат в себе по одному развернутому стенду.\n\nДополнительно в проекте используется общий каталог infra — в него публикуются все собранные Docker-образы приложения. Сервисные аккаунты окружений prod и testing имеют ограниченные права в infra-каталоге, которых достаточно для того, чтобы скачивать образы из infra-каталога. Публикация образов в infra-каталог осуществляется от отдельного сервисного аккаунта builder.\n\n## Автоматизированные процессы\n\nПосле добавления файла конфигурации сценария CI `.gitlab-ci.yml` запустится сценарий сборки.\n\nОн выглядит следующим образом:\n* Сборка образа из ветки и загрузка в реестр Container Registry.\n* Тестовое развертывание приложения в окружение `testing`.\n* Тестирование приложения — на данный момент командой `curl` мы проверяем доступность главной страницы приложения.\n* Удаление тестового приложения.\n* Развертывание приложения в продакшн. Дополнительно используется опция с окружениями, которая позволяет сохранить развертывание и восстановить его при необходимости.\n\nПри публикации изменений в ветку `main` (при влитии PR или прямом пуше в main) автоматически снова запустится сценарий сборки. Таким образом изменения в PR автоматически докатываются в развернутый стенд.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-serverless-gitlab-ci-cd/lists"}