Настройка CI/CD с Yandex Cloud Functions
SourceCraft дает возможность хранить код функции Yandex Cloud Functions и развертывать новые версии функции при изменениях в репозитории.
В этом руководстве вы настроите CI/CD между Cloud Functions и SourceCraft. Для этого вы создадите репозиторий, настроите развертывание функции и проверите результат.
Чтобы настроить CI/CD:
- Создайте сервисный аккаунт и авторизованный ключ.
- Создайте репозиторий.
- Создайте секрет в репозитории.
- Внесите изменения в репозиторий.
- Проверьте CI/CD-процесс.
- Проверьте изменения в функции.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Создайте сервисный аккаунт и авторизованный ключ
От имени сервисного аккаунта SourceCraft будет создавать функцию и ее версии.
Создайте сервисный аккаунт
- В консоли управления в списке сервисов выберите 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.
Создайте авторизованный ключ
- В консоли управления в списке сервисов выберите Identity and Access Management.
- Выберите сервисный аккаунт
functions-cicd-sa
. - На верхней панели нажмите
- Выберите алгоритм шифрования.
- Нажмите Создать.
- Нажмите Скачать файл с ключами. Убедитесь, что файл сохранился на компьютере. Его содержимое понадобится при создании секрета. Открытый ключ нельзя будет посмотреть в консоли управления.
Выполните команду:
yc iam key create --service-account-name sa-function -o functions-cicd-sa_key_file.json
В случае успеха в файл functions-cicd-sa_key_file.json
будут записаны данные авторизованного ключа. Например:
{
"id": "ajek6nubd5g3********",
"service_account_id": "ajelprpohp7r********",
"created_at": "2025-05-28T16:17:17.721526532Z",
"key_algorithm": "RSA_2048",
"public_key": "-----BEGIN PUBLIC KEY-----\nMI...QAB\n-----END PUBLIC KEY-----\n",
"private_key": "PLEASE DO NOT REMOVE THIS LINE! Yandex.Cloud SA Key ID \u003cajek6nubd5g3********\u003e\n-----BEGIN PRIVATE KEY-----\nMI...WdQ=\n-----END PRIVATE KEY-----\n"
}
Чтобы создать авторизованный ключ доступа, воспользуйтесь методом REST API create для ресурса Key или вызовом gRPC API Key/Create.
Создайте репозиторий
В репозитории будут храниться параметры и код функции, а также настройки CI/CD-процесса.
- Откройте главную страницу SourceCraft.
- На панели слева нажмите
- В открывшемся окне выберите Пустой репозиторий.
-
В блоке Сведения о новом репозитории:
-
В поле Владелец выберите организацию, в которой будет создан репозиторий.
-
В поле Название укажите название репозитория.
Название должно быть уникальным в пределах организации и может содержать следующие ASCII-символы: строчные и заглавные буквы латинского алфавита, цифры, запятые, дефисы и подчеркивания.
Под названием отображается адрес, по которому репозиторий будет доступен.
-
(опционально) В поле Описание укажите описание репозитория.
-
- Нажмите Создать репозиторий.
Создайте секрет в репозитории
В секрете в зашифрованном виде будет храниться авторизованный ключ сервисного аккаунта для доступа к функции.
-
Откройте главную страницу SourceCraft.
-
На вкладке
-
Выберите созданный ранее репозиторий.
-
На странице репозитория в разделе
-
На странице с секретами нажмите Новый секрет.
-
В открывшемся окне:
- В поле Название введите название секрета —
authorized-key
. - В поле Секрет вставьте содержимое файла с авторизованным ключом, сохраненное ранее.
- В поле Название введите название секрета —
-
Нажмите Добавить секрет.
Внесите изменения в репозиторий
Создайте в репозитории следующие файлы:
index.js
с кодом функции;.sourcecraft/ci.yaml
с параметрами функции и настройками CI/CD-процесса.
-
Откройте главную страницу SourceCraft.
-
На вкладке
-
Выберите созданный ранее репозиторий.
-
Нажмите Просмотр всех файлов репозитория.
-
Справа от имени ветки нажмите
-
Введите название файла
index.js
и нажмите Создать файл. -
Вставьте в файл
index.js
следующий код:module.exports.handler = async function (event, context) { return { statusCode: 200, body: 'Hello from SourceCraft!', }; };
-
Аналогичным образом создайте файл
.sourcecraft/ci.yaml
. Вставьте в него следующий код, указав идентификатор каталога, в котором хотите создать функцию:on: push: - workflows: cicd filter: branches: [ main ] workflows: cicd: tasks: - name: deploy-latest env: TMP_PATH: ./tmp YC_AUTHORIZED_KEY_JSON: ${{ secrets.<название_секрета> }} YC_FOLDER_ID: <идентификатор_каталога> YC_FUNCTION_NAME: cicd-test YC_FUNCTION_RUNTIME: nodejs22 YC_FUNCTION_ENTRYPOINT: index.handler YC_FUNCTION_MEMORY: 128m cubes: - name: install-and-configure-yc script: - curl -o ./yc-install.sh -L https://storage.yandexcloud.net/yandexcloud-yc/install.sh - chmod +x ./yc-install.sh && ./yc-install.sh -i /tmp/yc -n && mv /tmp/yc/bin/yc /usr/bin/yc - echo "$YC_AUTHORIZED_KEY_JSON" > key.json - yc config profile create sa-profile - yc config set service-account-key key.json - yc config set format json - yc config set folder-id $YC_FOLDER_ID - name: check-and-create-function script: - | 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 - name: deploy-function-version script: - mkdir -p $TMP_PATH - cp ./*.js* $TMP_PATH - echo "Deploying new function version..." - | yc serverless function version create \ --function-name=$YC_FUNCTION_NAME \ --runtime $YC_FUNCTION_RUNTIME \ --entrypoint $YC_FUNCTION_ENTRYPOINT \ --memory $YC_FUNCTION_MEMORY \ --execution-timeout 5s \ --source-path $TMP_PATH
Где:
YC_FOLDER_ID
— идентификатор каталога, в котором вы хотите создать функцию.YC_FUNCTION_NAME
— имя функции.YC_FUNCTION_RUNTIME
— среда выполнения.YC_FUNCTION_ENTRYPOINT
— точка входа.YC_FUNCTION_MEMORY
— объем RAM.
-
В правом верхнем углу нажмите Сохранить изменения.
-
Сделайте коммит:
- Введите сообщение об изменениях.
- В блоке Ветка изменений выберите Сохранить непосредственно в ветку: main.
- В блоке Действие после сохранения изменений выберите Просто сохранить.
- Нажмите Сохранить и вернуться в режим чтения.
Проверьте CI/CD-процесс
Убедитесь, что CI/CD-процесс прошел успешно.
- Откройте главную страницу SourceCraft.
- На вкладке
- Выберите созданный ранее репозиторий.
- На странице репозитория в разделе
- В списке запусков автоматизаций вы увидите новый запуск со статусом
Проверьте, что функция создалась
Убедитесь, что в сервисе Cloud Functions создалась функция с именем cicd-test
.
-
В консоли управления перейдите в каталог, который указали в файле
.sourcecraft/ci.yaml
. -
В списке сервисов выберите Cloud Functions.
-
В списке должна появиться функция
cicd-test
, выберите ее. -
В разделе История версий должна появиться версия функции, по времени создания соответствующая времени запуска CI/CD-процесса.
-
Перейдите на вкладку Редактор.
-
В редакторе кода в файле
index.js
должен отобразиться код:module.exports.handler = async function (event, context) { return { statusCode: 200, body: 'Hello from SourceCraft!', }; };
-
Получите список функций в каталоге, указанном в файле
.sourcecraft/ci.yaml
:yc serverless function list
Результат:
+----------------------+-----------+----------------------+--------+ | ID | NAME | FOLDER ID | STATUS | +----------------------+-----------+----------------------+--------+ | b097d9ous3ge******** | cicd-test | aoek49ghmknn******** | ACTIVE | +----------------------+-----------+----------------------+--------+
В выводе команды должна отобразиться функция
cicd-test
. -
Получите список версий функции
cicd-test
: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.
В списке должна отобразиться функция cicd-test
.
Чтобы получить список версий функции, воспользуйтесь методом REST API listVersions для ресурса Function или вызовом gRPC API FunctionsService/ListVersions.
В списке должна появиться новая версия функции, по времени создания соответствующая времени запуска CI/CD-процесса.
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их: