文档›Edge Functions›Test and deploy from CI 从 CI 进行测试和部署
从第一次编辑到自动部署的可行循环,并预先说明了本地模拟的限制。
8分钟 读取·级别 中间·修改于 2026年10月12日
该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。
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 路径,如下所示。
创建一个用于开发的项目(请参阅 您的第一个函数),在那里部署该函数,并通过 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 次。间隔测试,或连续运行它们。
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 再次部署。
然后在以下作业中针对您刚刚部署的项目运行集成测试。
一个项目就是一种环境。每个环境创建一个项目,每个项目都有自己的 URL 和密钥,然后让 CI 选择目标:
| 环境 | 项目 | 部署时间 |
|---|
| 发展 | 每个开发者一个或共享一个 | 根据需要,从分支机构 |
| 分期 | my-app-staging | 每次按下 main |
| 生产 | my-app | 暂存测试通过后的发布标签 |
每个 GitHub 环境存储 AURA_PROJECT_URL 和 AURA_SERVICE_ROLE_KEY,并在每个项目中单独设置每个函数的机密。项目之间不共享任何内容。