Настройка CI/CD для развертывания приложения в Yandex Serverless Containers с помощью GitHub Actions

В этом практическом руководстве вы настроите CI/CD-процесс для развертывания контейнеризированного приложения в Serverless Containers из репозитория SourceCraft с помощью GitHub Actions. Интеграция между SourceCraft и Yandex Cloud будет выполнена с помощью сервисного подключения.

Важно

Для создания сервисного подключения у вас должна быть роль Владелец организации (organization-manager.organizations.owner).

Чтобы настроить CI/CD для развертывания приложения в Serverless Containers из репозитория SourceCraft с помощью GitHub Actions:

  1. Создайте сервисный аккаунт.
  2. Создайте реестр.
  3. Создайте репозиторий.
  4. Создайте сервисное подключение.
  5. Настройте CI/CD.
  6. Проверьте выполнение CI/CD.
  7. Проверьте, что контейнер создан.

Если созданные ресурсы вам больше не нужны, удалите их.

В стоимость поддержки инфраструктуры входит:

  • Плата за хранение созданных Docker-образов (см. тарифы Container Registry).
  • Плата за количество вызовов контейнера, вычислительные ресурсы, выделенные для выполнения приложения, и исходящий трафик (см. тарифы Serverless Containers).

Создайте сервисный аккаунт

От имени сервисного аккаунта будут загружаться Docker-образы в реестры Yandex Container Registry и развертываться контейнеры в Serverless Containers.

  1. Войдите в консоль управления Yandex Cloud.

  2. В левой части экрана нажмите на строку с именем каталога, в котором вы хотите развернуть контейнер.

  3. В списке сервисов выберите Identity and Access Management.

  4. Нажмите Создать сервисный аккаунт.

  5. В поле Имя укажите github-action.

  6. Нажмите Добавить роль и выберите роли:

    • container-registry.images.pusher — для работы с Docker-образами в реестре;
    • serverless-containers.editor — для управления контейнером;
    • iam.serviceAccounts.user — для возможности при создании ревизии контейнера указать сервисный аккаунт, от имени которого Docker-образ будет загружен из реестра.
  7. Нажмите Создать.

  1. Создайте сервисный аккаунт:

    yc iam service-account create \
      --name github-action
      --folder-name <имя_каталога>
    

    Результат:

    id: ajeab0cnib1p********
    folder_id: b0g12ga82bcv********
    created_at: "2025-10-03T09:44:35.989446Z"
    name: github-action
    
  2. Назначьте сервисному аккаунту роли на каталог:

    • iam.serviceAccounts.user — для возможности при создании ревизии контейнера указать сервисный аккаунт, от имени которого Docker-образ будет загружен из реестра:

      yc resource-manager folder add-access-binding <имя_каталога> \
        --service-account-name github-action \
        --role iam.serviceAccounts.user \
        --folder-name <имя_каталога>
      
    • serverless-containers.editor — для управления контейнером:

      yc resource-manager folder add-access-binding <имя_каталога> \
        --service-account-name github-action \
        --role serverless-containers.editor \
        --folder-name <имя_каталога>
      
    • container-registry.images.pusher — для работы с Docker-образами в реестре:

      yc resource-manager folder add-access-binding <имя_каталога> \
        --service-account-name github-action \
        --role container-registry.images.pusher \
        --folder-name <имя_каталога>
      
  1. Создайте сервисный аккаунт github-action. Для этого воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.

  2. Назначьте сервисному аккаунту в текущем каталоге роли:

    • iam.serviceAccounts.user — для возможности при создании ревизии контейнера указать сервисный аккаунт, от имени которого Docker-образ будет загружен из реестра;
    • serverless-containers.editor — для управления контейнером;
    • container-registry.images.pusher — для работы с Docker-образами в реестре.

    Для этого воспользуйтесь методом REST API setAccessBindings для ресурса Folder или вызовом gRPC API FolderService/SetAccessBindings.

Создайте реестр

В реестре Container Registry будет храниться Docker-образ приложения.

  1. В консоли управления выберите Container Registry.
  2. Нажмите Создать реестр.
  3. Задайте имя реестра github-action.
  4. Нажмите Создать реестр.
  5. Сохраните идентификатор созданного реестра, он понадобится в дальнейшем.

Создайте реестр github-action:

yc container registry create --name github-action

Результат:

id: crpd50616s9a********
folder_id: b1g88tflru0e********
name: github-action
status: ACTIVE
created_at: "2025-10-03T10:34:06.601Z"

Сохраните идентификатор созданного реестра, он понадобится в дальнейшем.

Воспользуйтесь методом REST API create для ресурса Registry или вызовом gRPC API RegistryService/CreateRegistryRequest.

Сохраните идентификатор созданного реестра, он понадобится в дальнейшем.

Создайте репозиторий

Репозиторий будет создан из шаблона yc-ci-cd-serverless. В репозитории будут храниться Dockerfile и вспомогательные файлы для создания Docker-образа, а также настройки CI/CD-процесса.

  1. Откройте главную страницу сервиса.

  2. На панели слева нажмите Создать репозиторий.

  3. В открывшемся окне выберите Пустой репозиторий.

  4. В блоке Сведения о новом репозитории:

    • В поле Владелец выберите организацию, в которой вы создали сервисный аккаунт в Yandex Cloud.

    • В поле Название укажите название репозитория.

      Название должно быть уникальным в пределах организации и может содержать следующие ASCII-символы: строчные и заглавные буквы латинского алфавита, цифры, запятые, дефисы и подчеркивания.

      Под названием отображается адрес, по которому репозиторий будет доступен.

    • (опционально) В поле Описание укажите описание репозитория.

  5. В блоке Шаблон репозитория нажмите Просмотр шаблонов, выберите шаблон yc-ci-cd-serverless и нажмите Использовать шаблон.

    Чтобы посмотреть содержимое шаблона, нажмите Предварительный просмотр.

    В шаблоне содержатся:

    • файл .sourcecraft/ci.yaml с предустановленной конфигурацией CI/CD-процесса, который запускается при создании коммита и выполняет следующее:
      • Получает IAM-токен Yandex Cloud с помощью сервисного подключения с именем default-service-connection.
      • Устанавливает в окружение воркера утилиту Docker Buildx с помощью GitHub Action Docker Setup Buildx.
      • Аутентифицируется в Container Registry с помощью GitHub Action Docker Login и IAM-токена Yandex Cloud.
      • Собирает Docker-образ из Dockerfile, размещенного в корне репозитория, и отправляет образ в Container Registry с помощью GitHub Action Build and push Docker images.
      • Разворачивает контейнер в Serverless Containers из собранного Docker-образа.
    • файлы Dockerfile, index.html и docker/nginx/conf.d/default.conf с конфигурацией контейнера со статическим веб‑приложением на базе Nginx.
  6. Нажмите Создать репозиторий.

Создайте сервисное подключение

  1. Откройте главную страницу SourceCraft.

  2. Перейдите на вкладку Организации.

  3. Выберите организацию, в которой вы создали сервисный аккаунт в Yandex Cloud.

  4. На странице организации в разделе Настройки перейдите в секцию Сервисные подключения.

  5. Нажмите Новое сервисное подключение.

  6. В блоке Базовая информация укажите имя сервисного подключения default-service-connection.

  7. В блоке Область применения выберите созданный ранее репозиторий.

  8. В блоке Настройки Yandex Cloud выберите:

    • Каталог, в котором ранее вы развернули облачную инфраструктуру и назначили роль сервисному аккаунту.

    • Сервисный аккаунт github-action.

      Совет

      Чтобы повторно запросить список облаков, каталогов и сервисных аккаунтов из Yandex Cloud, нажмите Синхронизировать. Это может быть полезно, если параллельно с созданием сервисного подключения вы создали каталог или сервисный аккаунт.

  9. Нажмите Создать сервисное подключение.

    Дождитесь окончания операции. На открывшейся странице будут представлены детали сервисного подключения.

    В Yandex Cloud будет автоматически создана федерация сервисных аккаунтов Yandex Identity and Access Management.

    Чтобы посмотреть параметры созданного OIDC-провайдера, в блоке Федерация cервисных аккаунтов нажмите на имя федерации.

Настройте CI/CD

  1. Откройте главную страницу SourceCraft.

  2. На вкладке Домой в секции Ваша мастерская перейдите в раздел Репозитории.

  3. Выберите созданный ранее репозиторий.

  4. Выберите файл .sourcecraft/ci.yaml.

  5. В правом верхнем углу нажмите Редактировать.

  6. В параметре YC_DOCKER_REGISTRY_URI укажите идентификатор созданного ранее реестра:

    YC_DOCKER_REGISTRY_URI: cr.yandex/<идентификатор_реестра>
    
  7. В правом верхнем углу нажмите Сохранить изменения.

  8. Сделайте коммит:

    1. Введите сообщение об изменениях.
    2. В блоке Ветка изменений выберите Сохранить непосредственно в ветку: main.
    3. В блоке Действие после сохранения изменений выберите Просто сохранить.
    4. Нажмите Сохранить изменения.

После сохранения изменений запустится рабочий процесс demo-service-connection-workflow.

Проверьте выполнение CI/CD

  1. Откройте главную страницу SourceCraft.
  2. На вкладке Домой в секции Ваша мастерская перейдите в раздел Репозитории.
  3. Выберите созданный ранее репозиторий.
  4. На странице репозитория в разделе Код перейдите в секцию Автоматизации.
  5. В списке запусков автоматизаций вы увидите новый запуск. Дождитесь, когда статус изменится на Успех.

Проверьте, что контейнер создан

  1. В консоли управления выберите сервис Serverless Containers.

  2. В списке должен появиться контейнер demo-serverless-container1, выберите его.

    В блоке Ревизии должна появиться ревизия контейнера, по времени создания соответствующая времени запуска CI/CD-процесса.

Выполните команду:

yc serverless container revision list \
  --container-name demo-serverless-container1

Где --container-name — имя контейнера, указанное в .sourcecraft/ci.yaml.

Результат:

+----------------------+----------------------+--------------------------------------------------------+---------------------+
|          ID          |     CONTAINER ID     |                 IMAGE                                  |     CREATED AT      |
+----------------------+----------------------+--------------------------------------------------------+---------------------+
| bba27hejd69a******** | bba83i1mrb5s******** | cr.yandex/yc/serverless/demo-serverless-container1     | 2025-10-04 09:38:14 |
+----------------------+----------------------+--------------------------------------------------------+---------------------+

Воспользуйтесь методом REST API listRevisions для ресурса Container или вызовом gRPC API RegistryService/CreateRegistryRequest.

Удалите созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Удалите контейнер.
  2. Удалите Docker-образ.
  3. Удалите реестр.

См. также