Логотип Аурабаза
аурабазадокументы
документы›Edge Functions›Test and deploy from CI

Тестирование и развертывание из CI

Работоспособный цикл от первого редактирования до автоматического развертывания с заранее указанными ограничениями локальной эмуляции.

8 мин читать·Уровень средний·Пересмотрено 12 окт. 2026 г.
Этот текст на английском языке был создан автоматически на основе французского оригинала и еще не проверялся.
Эта страница была переведена автоматически. Английская версия является авторитетной.
#
Местный

1. Запустите его локально

aura functions serve запускает ваш файл с помощью Deno и перезапускает его при сохранении.

terminalbash
aura functions serve hello --port 54321
curl -X POST http://127.0.0.1:54321/ -H 'Content-Type: application/json' -d '{"name":"Ada"}'

Это обычный сервер Deno. По сравнению с платформой он имеет:

  • Нет заголовков платформы. x-aura-role и x-aura-user-id отсутствуют: отправьте их самостоятельно с curl -H для проверки веток авторизации.
  • Никаких секретов. Передайте их в свою оболочку: STRIPE_SECRET_KEY=sk_test_… aura functions serve checkout.
  • Никаких ограничений. Память, тайм-аут, размер тела и ограничения скорости не применяются.
  • Простые запросы. Вы вызываете функцию напрямую, поэтому path и method — это параметры вашего curl, а не параметры invoke SDK.

SDK не может быть нацелен на этот сервер, поскольку invoke вызывает маршрут платформы. Проверьте путь SDK на реальном проекте, как показано ниже.

#
Интеграция

2. Проверьте это по-настоящему

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

tests/hello.test.tstypescript
import { createClient, FunctionsHttpError } from '@aurabase/aurabase-js'
import { describe, expect, it } from 'vitest'

const aura = createClient(process.env.AURA_TEST_URL!, process.env.AURA_TEST_ANON_KEY!)

describe('hello', () => {
  it('greets', async () => {
    const { data, error } = await aura.functions.invoke<{ greeting: string }>('hello', { body: { name: 'Ada' } })
    expect(error).toBeNull()
    expect(data?.greeting).toBe('Hello, Ada!')
  })

  it('reports a missing function as a FunctionsHttpError 404', async () => {
    const { error } = await aura.functions.invoke('does-not-exist')
    expect(error).toBeInstanceOf(FunctionsHttpError)
    expect(error?.status).toBe(404)
  })

  it('refuses to list functions with a public key', async () => {
    const { data, error } = await aura.functions.list()
    expect(data).toBeNull()
    expect(error?.status).toBe(403)
  })
})

Советы:

  • Используйте специальный проект, а не производственную версию, и храните его ключи в секретах CI.
  • Ограничение частоты вызовов составляет 15 вызовов, а затем 1 в секунду на каждый IP-адрес. Разместите тесты или запускайте их последовательно.
#
КИ

3. Развертывание из CI

Интерфейс командной строки aura устанавливается из npm в macOS Apple Silicon и из других источников, поэтому задание CI в Linux упрощается с помощью HTTP API. Развертывание осуществляется по одному POST на функцию, аутентифицированному ключом service_role. Этот точный цикл был запущен в реальном проекте, и после этого функция ответила.

.github/workflows/deploy-functions.ymlyaml
name: Deploy functions
on:
  push:
    branches: [main]
    paths: ['aurabase/functions/**']

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy every function
        env:
          AURA_PROJECT_URL: ${{ secrets.AURA_PROJECT_URL }}
          AURA_SERVICE_ROLE_KEY: ${{ secrets.AURA_SERVICE_ROLE_KEY }}
        run: |
          set -euo pipefail
          for dir in aurabase/functions/*/; do
            name=$(basename "$dir")
            file="${dir}index.ts"
            [ -f "$file" ] || continue
            jq -n --arg name "$name" --rawfile code "$file" \
              '{name: $name, runtime: "deno", code: $code}' |
            curl -sS --fail-with-body -X POST "$AURA_PROJECT_URL/v1/functions" \
              -H "apikey: $AURA_SERVICE_ROLE_KEY" \
              -H "Content-Type: application/json" \
              --data-binary @-
            echo " deployed $name"
          done

Факты, которые делают его безопасным при каждом нажатии:

  • POST заменяет код существующей функции, а сохраняет свои секреты, поскольку в теле нет env_vars.
  • Функция является однофайловой: относительный импорт не осуществляется. Сначала создайте пакет, если вы используете локальные модули.
  • На сервере нет истории версий. Ваша история Git — это откат: чтобы вернуться назад, отмените фиксацию и позвольте CI снова развернуться.

Затем запустите интеграционные тесты для только что развернутого проекта в следующем задании.

#
Окружающая среда

4. Разработка, постановка и производство

Один проект — одна среда. Создайте по одному проекту для каждой среды, каждый со своим URL-адресом и ключами, и позвольте CI выбрать цель:

СредаПроектРазвернуто, когда
Разработкапо одному на каждого разработчика или общийпо запросу, из филиала
Постановкаmy-app-stagingкаждое нажатие на main
Производствоmy-appтег выпуска после прохождения промежуточных тестов

Сохраните AURA_PROJECT_URL и AURA_SERVICE_ROLE_KEY для каждой среды GitHub и установите секреты каждой функции отдельно в каждом проекте. Между проектами ничего не делится.

Последнее обновление · 12 окт. 2026 г.