Настройка CI/CD между Yandex Cloud Functions и SourceCraft
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
SourceCraft
В этом руководстве вы настроите CI/CD
Важно
Для создания сервисного подключения у вас должна быть рольВладелец организации (organization-manager.organizations.owner).
Чтобы настроить CI/CD для развертывания функции Cloud Functions из репозитория SourceCraft:
- Создайте сервисный аккаунт.
- Создайте репозиторий.
- Создайте сервисное подключение.
- Отредактируйте конфигурацию CI/CD.
- Проверьте выполнение CI/CD.
- Проверьте изменения в функции.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Создайте сервисный аккаунт
От имени сервисного аккаунта будет создаваться функция и ее версии.
- Войдите в консоль управления
Yandex Cloud. - В левой части экрана нажмите на строку с именем каталога, в котором вы хотите развернуть функцию Cloud Functions.
- В списке сервисов выберите Identity and Access Management.
- Нажмите Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
functions-cicd-sa. - Нажмите
Добавить роль и выберите рольfunctions.admin. - Нажмите Создать.
-
Создайте сервисный аккаунт с именем
functions-cicd-sa:yc iam service-account create --name functions-cicd-saРезультат:
id: ajehb3tcdfa1******** folder_id: b1g86q4m5vej******** created_at: "2025-05-28T16:05:14.237381531Z" name: functions-cicd-sa -
Назначьте сервисному аккаунту роль
functions.adminна каталог:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role functions.admin \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>Результат:
done (3s) effective_deltas: - action: ADD access_binding: role_id: functions.admin subject: id: ajehb3tcdfa1******** type: serviceAccount
Чтобы создать сервисный аккаунт, воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
Чтобы назначить сервисному аккаунту роль functions.admin на каталог, воспользуйтесь методом setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
Создайте репозиторий
Репозиторий будет создан из шаблона yc-cloud-functions-template
-
Откройте главную страницу сервиса
. -
На панели слева нажмите
Создать репозиторий. -
В открывшемся окне выберите Пустой репозиторий.
-
В блоке Сведения о новом репозитории:
-
В поле Владелец выберите организацию
, в которой вы создали сервисный аккаунт в Yandex Cloud. -
В поле Название укажите название репозитория.
Название должно быть уникальным в пределах организации и может содержать следующие ASCII-символы
: строчные и заглавные буквы латинского алфавита, цифры, запятые, дефисы и подчеркивания.Под названием отображается адрес, по которому репозиторий будет доступен.
-
(опционально) В поле Описание укажите описание репозитория.
-
-
В блоке Шаблон репозитория нажмите Просмотр шаблонов, выберите шаблон yc-cloud-functions-template
и нажмите Использовать шаблон.Чтобы посмотреть содержимое шаблона, нажмите Предварительный просмотр.
В шаблоне содержатся:
- файл .sourcecraft/ci.yaml
с предустановленной конфигурацией CI/CD-процесса, который может быть запущен вручную для публикации функции в конкретной среде выполнения или автоматически для среды выполненияnodejs22при создании коммита в основную ветку репозитория. - директории с примерами кода функций для разных языков программирования и фреймворков.
- файл .sourcecraft/ci.yaml
-
Нажмите Создать репозиторий.
Создайте сервисное подключение
-
Откройте главную страницу
SourceCraft. -
Перейдите на вкладку
Организации. -
Выберите организацию, в которой вы создали сервисный аккаунт в Yandex Cloud.
-
На странице организации в разделе
Настройки перейдите в секцию Сервисные подключения. -
Нажмите Новое сервисное подключение.
-
В открывшемся окне:
-
В блоке Базовая информация укажите имя сервисного подключения, например
default-service-connection, опционально добавьте описание. -
В блоке Область применения выберите, для каких репозиториев и веток будет доступно сервисное подключение, например, выберите репозиторий, созданный ранее.
-
В блоке Настройки Yandex Cloud выберите:
- Каталог, на который вы назначили роль сервисному аккаунту.
- Сервисный аккаунт, созданный ранее.
Совет
Чтобы повторно запросить список облаков, каталогов и сервисных аккаунтов из Yandex Cloud, нажмите
Синхронизировать. Это может быть полезно, если параллельно с созданием сервисного подключения вы создали каталог или сервисный аккаунт.
-
-
Нажмите Создать сервисное подключение.
Дождитесь окончания операции. На открывшейся странице будут представлены детали сервисного подключения.
В Yandex Cloud будет автоматически создана федерация сервисных аккаунтов Yandex Identity and Access Management.
Чтобы посмотреть параметры созданного OIDC-провайдера, в блоке
Федерация cервисных аккаунтов нажмите на имя федерации.
Отредактируйте конфигурацию CI/CD
-
Откройте главную страницу
SourceCraft. -
На вкладке
Домой в секции Ваша мастерская перейдите в раздел Репозитории. -
Выберите созданный ранее репозиторий.
-
Выберите файл
.sourcecraft/ci.yaml. -
В правом верхнем углу нажмите
Редактировать. -
В рабочем процессе
deploy-nodejs-functionотредактируйте параметры создаваемой функции:YC_FUNCTION_NAME— имя функции, напримерtest-function-nodejs.YC_FUNCTION_RUNTIME— среда выполнения, напримерnodejs22.YC_FUNCTION_ENTRYPOINT— точка входа функции, напримерindex.handler. Задается в соответствии со средой выполнения согласно документации.SOURCE_PATH— путь в репозитории к коду функции, например./nodejs.
Также вы можете добавить дополнительные параметры:
ENVIRONMENT— переменные окружения для функции, напримерMY_ENV=SOURCECRAFT. Аналог параметра--environmentдля команды Yandex Cloud CLI yc serverless function version create.PUBLIC— сделать функцию доступной публично. Значение —true. Аналог команды Yandex Cloud CLI yc serverless function allow-unauthenticated-invoke.
-
В правом верхнем углу нажмите Сохранить изменения.
-
Сделайте коммит:
- Введите сообщение об изменениях.
- В блоке Ветка изменений выберите Сохранить непосредственно в ветку: main.
- В блоке Действие после сохранения изменений выберите Просто сохранить.
- Нажмите Сохранить изменения.
После сохранения изменений запустится рабочий процесс deploy-nodejs-function.
Аналогичным образом вы можете отредактировать код функции в файле nodejs/index.js. После этого также запустится рабочий процесс публикации новой версии функции.
Совет
В примере рассмотрен автоматический запуск рабочего процесса для среды выполнения nodejs22. Для других сред выполнения используйте ручнойon в файле .sourcecraft/ci.yaml.
Пример автоматического запуска для python312
on:
push:
- workflows: [deploy-python-function]
filter:
branches: ["master", "main"]
Для развертывания функции Cloud Functions в конфигурации CI/CD используется готовый кубикyc-function, подходящий для базовых сценариев.
Для более сложных сценариев развертывания функции Cloud Functions со всеми возможностями Yandex Cloud CLI вы можете использовать готовые кубики yc-iam и yc-cli.
Пример конфигурации CI/CD готовыми кубиками yc-iam и yc-cli
on:
push:
- workflows: [cicd]
filter:
branches: ["master", "main"]
tokens:
# Произвольное имя токена.
<имя_токена>:
service_connection: default-service-connection
# Область запроса доступа:
# org — все репозитории.
# repo — конкретный репозиторий.
# ref — ветка или тег.
scope: repo
workflows:
cicd:
tasks:
- name: deploy-latest
env:
SOURCE_PATH: "./nodejs"
YC_FUNCTION_NAME: "test-function-nodejs"
YC_FUNCTION_RUNTIME: "nodejs22"
YC_FUNCTION_ENTRYPOINT: "index.handler"
# Кубик обменивает токен SourceCraft на IAM-токен Yandex Cloud
# и сохраняет его в переменную IAM_TOKEN в блоке outputs.
cubes:
- name: get-iam-token
env:
ID_TOKEN: ${{ tokens.<имя_токена>.id_token}}
YC_SA_ID: ${{ tokens.<имя_токена>.service_account_id }}
image: cr.yandexcloud.kz/sourcecraft/yc-iam:latest
# Кубик с предустановленным Yandex Cloud CLI забирает из outputs
# переменную IAM_TOKEN и использует ее для проверки наличия функции Cloud Functions
# с определенным именем, в случае отсутствия — создает ее.
- name: check-and-create-function
env:
# Подставьте в блок для получения значений outputs имя кубика с
# IAM-токеном, например get-iam-token.
YC_IAM_TOKEN: ${{ cubes.<имя_кубика_с_IAM-токеном>.outputs.IAM_TOKEN }}
YC_FOLDER_ID: ${{ tokens.<имя_токена>.folder_id }}
image:
name: cr.yandexcloud.kz/sourcecraft/yc-cli:latest
entrypoint: ""
script:
- |
yc config set folder-id $YC_FOLDER_ID
echo "Checking if function exists..."
if ! yc serverless function get --name=$YC_FUNCTION_NAME; then
echo "Function does not exist. Creating new function..."
yc serverless function create --name=$YC_FUNCTION_NAME
else
echo "Function already exists. Proceeding to version deployment..."
fi
# Кубик с предустановленным Yandex Cloud CLI забирает из outputs
# переменную IAM_TOKEN и использует ее для создания новой версии функции Cloud Functions.
- name: deploy-function-version
env:
# Подставьте в блок для получения значений outputs имя кубика с
# IAM-токеном, например get-iam-token.
YC_IAM_TOKEN: ${{ cubes.<имя_кубика_с_IAM-токеном>.outputs.IAM_TOKEN }}
YC_FOLDER_ID: ${{ tokens.<имя_токена>.folder_id }}
image:
name: cr.yandexcloud.kz/sourcecraft/yc-cli:latest
entrypoint: ""
script:
- mkdir -p ./tmp
- cp "$SOURCE_PATH"/*.js* ./tmp
- echo "Deploying new function version..."
- |
yc config set folder-id $YC_FOLDER_ID
yc serverless function version create \
--function-name=$YC_FUNCTION_NAME \
--runtime $YC_FUNCTION_RUNTIME \
--entrypoint $YC_FUNCTION_ENTRYPOINT \
--execution-timeout 5s \
--source-path ./tmp
Проверьте выполнение CI/CD
- Откройте главную страницу
SourceCraft. - На вкладке
Домой в секции Ваша мастерская перейдите в раздел Репозитории. - Выберите созданный ранее репозиторий.
- На странице репозитория в разделе
Код перейдите в секцию Автоматизации. - В списке запусков автоматизаций вы увидите новый запуск со статусом
В очереди. Дождитесь, когда статус изменится на Успех.
Проверьте, что функция создалась
Убедитесь, что в сервисе Cloud Functions создалась функция с именем, которое вы задали в .sourcecraft/ci.yaml, например test-function-nodejs.
-
В консоли управления
перейдите в каталог, в котором вы ранее создали сервисный аккаунт. -
В списке сервисов выберите Cloud Functions.
-
В списке должна появиться функция
test-function-nodejs, выберите ее. -
В разделе История версий должна появиться версия функции, по времени создания соответствующая времени запуска CI/CD-процесса.
-
Перейдите на вкладку Редактор.
-
В редакторе кода в файле
index.jsдолжен отобразиться код:// Example Node.js function handler export const handler = async function (event, context) { // Log the incoming event for debugging console.log('Received event:', event); // Access request body (if it's a POST request) const requestBody = event.body ? JSON.parse(event.body) : {}; // Access query parameters const name = event.queryStringParameters ? event.queryStringParameters.name : 'World'; return { statusCode: 200, headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ message: `Hello, ${name}! Your request body was:`, data: requestBody, }), }; };
-
Получите список функций в каталоге, указанном в файле
.sourcecraft/ci.yaml:yc serverless function listРезультат:
+----------------------+----------------------+----------------------+--------+ | ID | NAME | FOLDER ID | STATUS | +----------------------+----------------------+----------------------+--------+ | b097d9ous3ge******** | test-function-nodejs | aoek49ghmknn******** | ACTIVE | +----------------------+----------------------+----------------------+--------+В выводе команды должна отобразиться функция
test-function-nodejs. -
Получите список версий функции
test-function-nodejs:yc serverless function version list --function-id <идентификатор_функции>Результат:
+----------------------+----------------------+----------+---------------+---------+---------------------+ | ID | FUNCTION ID | RUNTIME | ENTRYPOINT | TAGS | CREATED AT | +----------------------+----------------------+----------+---------------+---------+---------------------+ | b097d9ousd36******** | b097d9ous3ge******** | nodejs22 | index.handler | $latest | 2025-05-28 05:05:12 | +----------------------+----------------------+----------+---------------+---------+---------------------+В выводе команды должна отобразиться версия функции, по времени создания соответствующая времени запуска CI/CD-процесса.
Чтобы получить список функций, воспользуйтесь методом REST API list для ресурса Function или вызовом gRPC API FunctionsService/List.
В списке должна отобразиться функция test-function-nodejs.
Чтобы получить список версий функции, воспользуйтесь методом REST API listVersions для ресурса Function или вызовом gRPC API FunctionsService/ListVersions.
В списке должна появиться новая версия функции, по времени создания соответствующая времени запуска CI/CD-процесса.
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их:
См. также
- Настроить CI/CD для развертывания приложения в Yandex Serverless Containers с помощью GitHub Actions
- Настроить в SourceCraft сервисное подключение к Yandex Cloud
- Интеграция с GitHub Actions в SourceCraft
- Репозиторий yc-cloud-functions-template
в SourceCraft - Репозиторий yc-ci-cd-serverless
в SourceCraft