النشر إلى Vercel من الـ CI حين لا يكون صاحب الـ commit عضوًا في الفريق
انقل مستودعًا إلى منظمة على GitHub، وسيبدأ Vercel بحجب عمليات النشر بهدوء: الـ commit «تعذّر مطابقته بعضو في الفريق». إليك كيف أنشر بدلًا من ذلك من GitHub Actions عبر واجهة Vercel السطرية — تبقى commit‑اتي محسوبة في رسم مساهماتي على GitHub، ولا يزال اللوح يُظهر من دفع، ولا أشتري مقعدًا لكل مساهم.
نقلت landee إلى منظمة على GitHub كي تُحسب commit‑اتي في رسم مساهماتي. ومع أول دفعة تالية، توقّف الإنتاج عن النشر.
لم يقل لوح Vercel سوى هذا — مع كل دفعة. لقد تحوّل تكامل Git الأصلي بهدوء إلى بوّابة:
Deployment Blocked
The deployment was blocked because the commit could not be
matched to a team member.لماذا يحجب Vercel النشر
تكامل Git الأصلي في Vercel هو نشر عبر webhook: يرسل GitHub حدث دفعٍ، فيقرأ Vercel صاحب الـ commit، ويتحقّق مما إذا كان عضوًا في فريق Vercel، ويحجب النشر إن لم يكن. إنها ضابط أمان — تمنع أي مساهم عابر، أو طلب دمج من fork، من النشر تلقائيًا إلى الإنتاج.
هذا معقول — إلى أن يكون من يكتب الشيفرة ليس صاحب مقعد مدفوع. حسابي على GitHub هو صاحب الـ commit‑ات، لكنه ليس عضوًا في فريق Vercel. لذا فكل نشرة يراها التكامل من «غير عضو»، وكل نشرة تُحجب.
انشر بالواجهة السطرية، لا بتكامل Git
الواجهة السطرية هي المخرج. يستوثق vercel deploy عبر توكن، لا عبر صاحب الـ commit — ولا يشغّل فحص العضوية إطلاقًا. إذًا افصل تكامل Git الأصلي وانشر من GitHub Actions بدلًا منه: دفعة → يعمل سير العمل → vercel deploy بتوكن → يبني Vercel ويطلق.
name: Deploy Production (Vercel CLI)
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
steps:
- uses: actions/checkout@v7
- run: npm install -g vercel@latest
- run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}
- run: vercel deploy --prod --token=${{ secrets.VERCEL_TOKEN }}أمران يجعلان هذا مسار النشر الوحيد، كي لا يتسابق الـ CLI والـ webhook: يعطّل vercel.json النشر التلقائي الأصلي، وتضغط أنت Disconnect على مستودع Git في لوح Vercel.
{
"git": { "deploymentEnabled": false },
"installCommand": "pnpm install --frozen-lockfile"
}احفظ رسم مساهماتك على GitHub
كان الغرض كله من النقل إلى المنظمة أن تُحسب الـ commit‑ات في رسمي — لذا يجب أن يبقى الـ commit على GitHub منسوبًا إليّ. وهذا حاصل هنا بالفعل: يعمل نشر الـ CLI على checkout جديد داخل المشغّل (runner)، ولا يُدفع منه شيء إلى GitHub أبدًا.
لذا أعمل commit باسمي، وأدفع، فتمتلئ المربّعات الخضراء. التوكن الذي يخوّل النشر يخص صاحب الحساب لا أنا — وهذا هو جوهر النشر من الـ CI بالضبط.
اجعل اللوح يُظهر من دفع
النشر بالواجهة السطرية وحده يظهر في قائمة Vercel هاشًا عاريًا — بلا رسالة ولا فرع ولا صاحب. للحصول على صفٍّ بأسلوب git حقيقي (رسالة + فرع + صورة)، على Vercel أن يتعرّف على النشرة بوصفها commit في git — وهذا التعرّف نفسه هو ما يعيد تشغيل فحص الصاحب.
الحيلة: داخل المشغّل، أعِد كتابة صاحب HEAD إلى عضو في الفريق، ثم انشر. لا يُدفع الـ amend إلى الخلف أبدًا، فيبقى الـ commit على GitHub لك. يقرأ Vercel صاحب-العضو من .git — فتُعرَف النشرة ولا تُحجب — وتضع من دفع فعلًا في رسالة الـ commit كي يبقى الصف يذكر من أطلقها.
# In the runner only — this amend is NEVER pushed back, so on GitHub the
# commit stays authored by the real pusher (your contribution graph is intact).
MSG="$(git log -1 --pretty=%s)"
git -c user.name="CI Bot" -c user.email="ci@your-org.dev" \
commit --amend --author="CI Bot <ci@your-org.dev>" \
-m "[$GITHUB_ACTOR] $MSG"
# Vercel now reads a team-member author from .git → recognized AND not blocked.
vercel deploy --prod --token="$VERCEL_TOKEN"حساب خدمة واحد يَنشر الجميع عبره
عمّم الأمر: حساب خدمة واحد يملك فريق Vercel ويحمل توكن النشر. الجميع يعمل commit باسمه؛ ويعيد الـ CI كتابة الصاحب إلى حساب الخدمة وينشر بتوكنه. يقرأ صف اللوح [أنت] رسالة commit‑ك، ويحفظ GitHub تأليفك الحقيقي.
هذه هي النسخة المملّة الصادقة لما تسعى إليه فرق كثيرة. تدفع مقابل مقاعد من يحتاجون الوصول إلى اللوح — لا مقعدًا لكل مساهم. توكن CI ينشر شيفرة الجميع هو النموذج الذي يوثّقه Vercel؛ ولا تشتري مقعدًا لأحد لمجرد أن شيفرته تُنشر.
التفاصيل التي تعضّ
بضعة أمور كلّفتني أمسية، كي لا تكلّفك أنت واحدة:
- pnpm على Vercel. قد تثبّت صورة البناء نسخة pnpm قديمة بصرف النظر عن حقل
packageManagerلديك. مرّر--build-env ENABLE_EXPERIMENTAL_COREPACK=1إلىvercel deployليستخدم corepack النسخة التي ثبّتّها فعلًا. - Commit‑ات موثّقة. التوقيع منفصل عن هذا كله — اضبط توقيع الـ commit عبر SSH وسجّل المفتاح على GitHub، فتنال commit‑اتك (الحقيقية) شارة Verified الخضراء. أما الـ amend المؤقّت في المشغّل فلا يحتاج توقيعًا.
- عمليات مقروءة. قسّم خطوة الـ shell الكبيرة الواحدة إلى خطوات مُسمّاة (re-author → deploy → summary) كي تُظهر واجهة Actions المرحلة بنظرة واحدة.
- الاختبارات. يبني النشر على Vercel لكنه لا يشغّل اختباراتك أبدًا — أضف سير عمل CI منفصلًا لذلك، وفعّل Dependabot ما دمت هناك.
النشر بالواجهة السطرية يخوّله توكن، لا من كتب الـ commit. هذا هو مفتاح الحل كله — وهو طريقة موثّقة ومن الدرجة الأولى للإطلاق.
أين يقع الحدّ
لنكن صادقين بشأن الحدّ، فمن السهل أن يُقنع المرء نفسه بتجاوزه. نشر شيفرة المساهمين عبر توكن CI مشروع ومقصود. أما إنشاء حسابات وهمية للتحايل على احتساب المقاعد فليس كذلك — هذا تعدّد حسابات، ويخالف شروط كل منصّة.
| ما تفعله | مشروع | تجاوز للحدّ |
|---|---|---|
| نشر شيفرة المساهمين عبر توكن CI | ✓ موثّق | |
| دفع مقعد واحد لمن يدير اللوح | ✓ | |
| العمل commit باسمك؛ هوية الخدمة في الـ CI فقط | ✓ إحصاء صادق | |
| إنشاء حسابات وهمية/خدمة لتفادي دفع المقاعد | ✗ تعدّد حسابات | |
| مشاركة تسجيل دخول واحد ليدير كثيرون بلا مقاعد | ✗ مشاركة بيانات الدخول |
خلاصات
- يحجب تكامل Git الأصلي في Vercel النشرات التي لا يكون صاحب الـ commit فيها عضوًا في الفريق — بوّابة أمان لا خلل.
vercel deployبتوكن لا يفحص الصاحب أبدًا؛ افصل التكامل الأصلي وانشر من الـ CI.- اعمل commit باسمك ولا تدفع amend المشغّل أبدًا، يبقَ رسم GitHub لديك سليمًا.
- إعادة كتابة صاحب
HEADإلى عضو داخل المشغّل تمنحك صفًّا حقيقيًا في اللوح دون حجب — ضع من دفع فعلًا في الرسالة. - تدفع مقابل مقاعد اللوح، لا لكل مساهم: توكن CI ينشر شيفرة الجميع هو النموذج المقصود.
- إنشاء حسابات وهمية للتحايل على الدفع هو تعدّد حسابات. هناك يقع الحدّ.
لا شيء من هذه القطع غريب — الواجهة السطرية، وتوكن، و git amend لا يغادر المشغّل أبدًا. التحوّل هو إدراكك أن جدار «ليس عضوًا» لا يطلب منك شراء مقعد آخر؛ بل يطلب أن تنشر كما يُفترض بالـ CI أن يفعل. افصل الـ webhook، وسلّم التوكن للمشغّل — ودع من كتب الشيفرة يحتفظ بنسبتها إليه.
لاحظت خطأً؟
معلومة خاطئة، ترجمة ركيكة، أو شيء يبدو غير صحيح في هذه المقالة؟ راسلني — بلغتك أنت.