شعار أوراباسي
aurabaseمستندات
مستندات›Edge Functions›Test and deploy from CI

الاختبار والنشر من CI

حلقة عملية من التحرير الأول إلى النشر التلقائي، مع ذكر حدود المحاكاة المحلية مقدمًا.

8 د قراءة·المستوى وسيطة·تمت المراجعة في 12‏/10‏/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 مكالمة ثم مكالمة واحدة في الثانية لكل IP. باعد بين اختباراتك، أو قم بتشغيلها بشكل تسلسلي.
#
سي آي

3. النشر من CI

يتم تثبيت aura CLI من npm على نظام التشغيل macOS Apple Silicon ومن المصدر في مكان آخر، لذا تكون مهمة Linux CI أكثر بساطة مع 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، وقم بتعيين أسرار كل وظيفة على حدة في كل مشروع. لا شيء مشترك بين المشاريع.