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

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

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.<название_секрета> }}
              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. В списке сервисов выберите Cloud Functions.

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

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

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

  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. Удалите сервисный аккаунт.