Настройка CI/CD с Yandex Cloud Functions

SourceCraft дает возможность хранить код функции Yandex Cloud Functions и развертывать новые версии функции при изменениях в репозитории.

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

Важно

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

Чтобы настроить CI/CD для развертывания функции Cloud Functions из репозитория SourceCraft:

  1. Создайте сервисный аккаунт.
  2. Создайте репозиторий.
  3. Создайте сервисное подключение.
  4. Отредактируйте конфигурацию CI/CD.
  5. Проверьте выполнение CI/CD.
  6. Проверьте изменения в функции.

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

В стоимость поддержки инфраструктуры входит плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).

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

От имени сервисного аккаунта будет создаваться функция и ее версии.

  1. Войдите в консоль управления Yandex Cloud.
  2. В левой части экрана нажмите на строку с именем каталога, в котором вы хотите развернуть функцию Cloud Functions.
  3. В списке сервисов выберите Identity and Access Management.
  4. Нажмите Создать сервисный аккаунт.
  5. Введите имя сервисного аккаунта: functions-cicd-sa.
  6. Нажмите Добавить роль и выберите роль functions.admin.
  7. Нажмите Создать.
  1. Создайте сервисный аккаунт с именем 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
    
  2. Назначьте сервисному аккаунту роль 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. В репозитории будут храниться примеры кода функций для разных языков программирования и фреймворков, а также настройки CI/CD-процесса.

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

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

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

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

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

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

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

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

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

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

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

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

    • файл .sourcecraft/ci.yaml с предустановленной конфигурацией CI/CD-процесса, который может быть запущен вручную для публикации функции в конкретной среде выполнения или автоматически для среды выполнения nodejs22 при создании коммита в основную ветку репозитория.
    • директории с примерами кода функций для разных языков программирования и фреймворков.
  6. Нажмите Создать репозиторий.

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

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

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

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

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

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

  6. В открывшемся окне:

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

    • В блоке Область применения выберите, для каких репозиториев и веток будет доступно сервисное подключение, например, выберите репозиторий, созданный ранее.

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

      • Каталог, на который вы назначили роль сервисному аккаунту.
      • Сервисный аккаунт, созданный ранее.

      Совет

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

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

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

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

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

Отредактируйте конфигурацию CI/CD

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

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

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

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

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

  6. В рабочем процессе 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.
  7. В правом верхнем углу нажмите Сохранить изменения.

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

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

После сохранения изменений запустится рабочий процесс 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 используется готовый кубик SourceCraft 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.yandex/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.yandex/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.yandex/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

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

Проверьте, что функция создалась

Убедитесь, что в сервисе Cloud Functions создалась функция с именем, которое вы задали в .sourcecraft/ci.yaml, например test-function-nodejs.

  1. В консоли управления перейдите в каталог, в котором вы ранее создали сервисный аккаунт.

  2. В списке сервисов выберите Cloud Functions.

  3. В списке должна появиться функция test-function-nodejs, выберите ее.

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

  5. Перейдите на вкладку Редактор.

  6. В редакторе кода в файле 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,
                }),
            };
        };
    
  1. Получите список функций в каталоге, указанном в файле .sourcecraft/ci.yaml:

    yc serverless function list
    

    Результат:

    +----------------------+----------------------+----------------------+--------+
    |          ID          |         NAME         |      FOLDER ID       | STATUS |
    +----------------------+----------------------+----------------------+--------+
    | b097d9ous3ge******** | test-function-nodejs | aoek49ghmknn******** | ACTIVE |
    +----------------------+----------------------+----------------------+--------+
    

    В выводе команды должна отобразиться функция test-function-nodejs.

  2. Получите список версий функции 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-процесса.

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

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

  1. Удалите функцию.
  2. Удалите сервисный аккаунт.

См. также