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

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

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

Чтобы настроить CI/CD:

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

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

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

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

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

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

  1. В консоли управления в списке сервисов выберите {{ ui-key.yacloud.iam.folder.dashboard.label_iam }}.
  2. Нажмите {{ ui-key.yacloud.iam.folder.service-accounts.button_add }}.
  3. Введите имя сервисного аккаунта: functions-cicd-sa.
  4. Нажмите {{ ui-key.yacloud.iam.folder.service-account.label_add-role }} и выберите роль functions.admin.
  5. Нажмите {{ ui-key.yacloud.iam.folder.service-account.popup-robot_button_add }}.
  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.

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

  1. В консоли управления в списке сервисов выберите {{ ui-key.yacloud.iam.folder.dashboard.label_iam }}.
  2. Выберите сервисный аккаунт functions-cicd-sa.
  3. На верхней панели нажмите {{ ui-key.yacloud.iam.folder.service-account.overview.button_create-key-popup }} и выберите пункт {{ ui-key.yacloud.iam.folder.service-account.overview.button_create_key }}.
  4. Выберите алгоритм шифрования.
  5. Нажмите {{ ui-key.yacloud.iam.folder.service-account.overview.popup-key_button_create }}.
  6. Нажмите {{ ui-key.yacloud.iam.folder.service-account.overview.action_download-keys-file }}. Убедитесь, что файл сохранился на компьютере. Его содержимое понадобится при создании секрета. Открытый ключ нельзя будет посмотреть в консоли управления.

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

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-процесса.

  1. Откройте главную страницу SourceCraft.
  2. На панели слева нажмите Создать репозиторий.
  3. В открывшемся окне выберите Создать пустой репозиторий.
  4. В блоке Сведения о новом репозитории:

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

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

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

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

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

  5. Нажмите Создать репозиторий.

Создайте секрет в репозитории

В секрете в зашифрованном виде будет храниться авторизованный ключ сервисного аккаунта для доступа к функции.

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

  2. На вкладке Домой перейдите в раздел Репозитории.

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

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

  5. На странице с секретами нажмите Новый секрет.

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

    • В поле Название введите название секрета — authorized-key.
    • В поле Секрет вставьте содержимое файла с авторизованным ключом, сохраненное ранее.
  7. Нажмите Добавить секрет.

Внесите изменения в репозиторий

Создайте в репозитории следующие файлы:

  • index.js с кодом функции;
  • .sourcecraft/ci.yaml с параметрами функции и настройками CI/CD-процесса.
  1. Откройте главную страницу SourceCraft.

  2. На вкладке Домой перейдите в раздел Репозитории.

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

  4. Нажмите Просмотр всех файлов репозитория.

  5. Справа от имени ветки нажмите Файл.

  6. Введите название файла index.js и нажмите Создать файл.

  7. Вставьте в файл index.js следующий код:

    module.exports.handler = async function (event, context) {
                return {
                    statusCode: 200,
                    body: 'Hello from SourceCraft!',
                };
            };
            
  8. Аналогичным образом создайте файл .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.authorized-key }}
                      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.
  9. В правом верхнем углу нажмите Сохранить изменения.

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

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

Проверьте CI/CD-процесс

Убедитесь, что CI/CD-процесс прошел успешно.

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

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

Убедитесь, что в сервисе Cloud Functions создалась функция с именем cicd-test.

  1. В консоли управления перейдите в каталог, который указали в файле .sourcecraft/ci.yaml.

  2. В списке сервисов выберите {{ ui-key.yacloud.iam.folder.dashboard.label_serverless-functions }}.

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

  4. В разделе {{ ui-key.yacloud.serverless-functions.item.overview.label_title-history }} должна появиться версия функции, по времени создания соответствующая времени запуска CI/CD-процесса.

  5. Перейдите на вкладку {{ ui-key.yacloud.serverless-functions.item.switch_editor }}.

  6. В редакторе кода в файле index.js должен отобразиться код:

    module.exports.handler = async function (event, context) {
                return {
                    statusCode: 200,
                    body: 'Hello from SourceCraft!',
                };
            };
            
  1. Получите список функций в каталоге, указанном в файле .sourcecraft/ci.yaml:

    yc serverless function list
            

    Результат:

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

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

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

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

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

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