Aura Logo
aurabasedocumentos
documentos›Edge Functions›Test and deploy from CI

Teste e implante a partir de CI

Um loop viável desde a primeira edição até uma implantação automática, com os limites da emulação local declarados antecipadamente.

8 min lido·Nível intermediário·Revisado em 12 de out. de 2026
Este texto em inglês foi gerado automaticamente a partir do original em francês e ainda não foi revisado.
Esta página foi traduzida automaticamente. A versão em inglês é oficial.
#
Locais

1. Execute-o localmente

aura functions serve executa seu arquivo com Deno e o reinicia quando você salva.

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

É um servidor Deno simples. Comparado com a plataforma, possui:

  • Sem cabeçalhos de plataforma. x-aura-role e x-aura-user-id estão ausentes: envie-os você mesmo com curl -H para testar ramificações de autorização.
  • Sem segredos. Passe-os em seu shell: STRIPE_SECRET_KEY=sk_test_… aura functions serve checkout.
  • Sem limites. Memória, tempo limite, tamanho do corpo e limites de taxa não são aplicados.
  • Solicitações simples. Você chama a função diretamente, então path e method são aqueles do seu curl, não as opções invoke do SDK.

O SDK não pode direcionar este servidor porque invoke chama a rota da plataforma. Teste o caminho do SDK em um projeto real, conforme abaixo.

#
Integração

2. Teste de verdade

Crie um projeto para desenvolvimento (veja sua primeira função), implante a função lá e teste por meio do SDK. Isso abrange os cabeçalhos de identidade, limites e classes de erro da plataforma.

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)
  })
})

Dicas:

  • Use um projeto dedicado, nunca produção, e mantenha suas chaves em segredo de CI.
  • O limite da taxa de invocação é de 15 chamadas e 1 por segundo por IP. Espace seus testes ou execute-os em série.
#
IC

3. Implantar a partir de CI

A CLI aura é instalada a partir do npm no macOS Apple Silicon e da fonte em outro lugar, portanto, um trabalho de CI do Linux é mais simples com a API HTTP. A implantação é um POST por função, autenticado com uma chave service_role. Este loop exato foi executado em um projeto real e a função respondeu posteriormente.

.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

Fatos que tornam isso seguro para execução em cada push:

  • O POST substitui o código de uma função existente e mantém seus segredos, pois o corpo não possui env_vars.
  • Uma função é de arquivo único: as importações relativas não são enviadas. Agrupe primeiro se você usar módulos locais.
  • Não há histórico de versão no servidor. Seu histórico do Git é a reversão: para voltar, reverta o commit e deixe o CI implantar novamente.

Em seguida, execute os testes de integração no projeto que você acabou de implantar, em um trabalho seguinte.

#
Ambientes

4. Desenvolvimento, preparação e produção

Um projeto é um ambiente. Crie um projeto por ambiente, cada um com sua própria URL e chaves, e deixe o CI escolher o destino:

Meio AmbienteProjetoImplantado quando
Desenvolvimentoum por desenvolvedor ou compartilhadosob demanda, de uma filial
Encenaçãomy-app-stagingcada push para main
Produçãomy-appuma tag de lançamento, após a aprovação nos testes de preparação

Armazene AURA_PROJECT_URL e AURA_SERVICE_ROLE_KEY por ambiente GitHub e defina os segredos de cada função separadamente em cada projeto. Nada é compartilhado entre projetos.

Última atualização · 12 de out. de 2026