光环标志
光环基地文档
文档›Edge Functions›Test and deploy from CI

从 CI 进行测试和部署

从第一次编辑到自动部署的可行循环,并预先说明了本地模拟的限制。

8分钟 读取·级别 中间·修改于 2026年10月12日
该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。
#
本地

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 一起发送以测试授权分支。
  • 没有秘密。 将它们传递到您的 shell 中: STRIPE_SECRET_KEY=sk_test_… aura functions serve checkout。
  • 无限制。 不应用内存、超时、主体大小和速率限制。
  • 普通请求。 您直接调用该函数,因此 path 和 method 是您的 curl选项,而不是 SDK 的 invoke 选项。

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 次调用,然后每个 IP 每秒 1 次。间隔测试,或连续运行它们。
#
CI

3. 从 CI 部署

aura CLI 从 macOS Apple Silicon 上的 npm 以及其他地方的源安装,因此使用 HTTP API 的 Linux CI 作业更加简单。部署是每个函数一个 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暂存测试通过后的发布标签

每个 GitHub 环境存储 AURA_PROJECT_URL 和 AURA_SERVICE_ROLE_KEY,并在每个项目中单独设置每个函数的机密。项目之间不共享任何内容。

最后更新· 2026年10月12日