문서›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를 사용하여 직접 보내세요.
- 비밀이 없습니다. 셸에
STRIPE_SECRET_KEY=sk_test_… aura functions serve checkout를 전달합니다.
- 제한이 없습니다. 메모리, 타임아웃, 바디 크기, 속도 제한은 적용되지 않습니다.
- 일반 요청. 함수를 직접 호출하므로
path 및 method는 SDK의 invoke 옵션이 아니라 curl의 함수입니다.
invoke가 플랫폼 경로를 호출하기 때문에 SDK는 이 서버를 대상으로 지정할 수 없습니다. 아래와 같이 실제 프로젝트에 대해 SDK 경로를 테스트합니다.
개발용 프로젝트를 생성하고(첫 번째 함수참조) 거기에 함수를 배포하고 SDK를 통해 테스트합니다. 여기에는 플랫폼의 ID 헤더, 제한 및 오류 클래스가 포함됩니다.
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 작업이 더 간단해집니다. 배포는 service_role 키로 인증된 함수당 하나의 POST입니다. 이 정확한 루프는 실제 프로젝트에 대해 실행되었으며 나중에 함수가 응답했습니다.
.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을 저장하고 각 프로젝트에서 각 함수의 비밀을 별도로 설정합니다. 프로젝트 간에는 아무것도 공유되지 않습니다.