VPN لمشغّلات CI: هل يعيش النفق أطول من البناء؟
يحتفظ مشغّل CI المشترك بالمسارات والعمليات بين المهام. خطّط لحالات VPN قبل العمل وأثناءه وبعده، ونظّف فقط الاتصال الذي تملكه المهمة.
تتصل مهمة نشر، وتنسخ مخرجاتها، وتُبلِغ بالنجاح. قد يكون النفق الذي فتحته ما زال قائمًا عند بدء المهمة التالية، والمسار الذي غيّرته يخص المضيف بأكمله. نتيجة البناء تصف الأمر، لا الحالة التي تركها خلفها. تعامل مع VPN كمورد له عمر، لا كسطر واحد في بداية المرحلة.
ما الذي يعمل أيضًا على هذا المضيف
يمكن لعقدة Jenkins أن تشغّل عدة منفّذات في وقت واحد، وأي مهمة تغيّر مسارات المضيف أو إعدادات محلّل الأسماء أو اتصالًا على مستوى النظام فإنها تغيّرها للجميع. رؤية مهمة أخرى لذلك تعتمد على سياسة المسار والتصفية، لا على قاعدة عامة بشأن VPN. الوصول إلى المستودع والوصول إلى المخرجات وقناة التحكم متطلبات منفصلة ما زال المشغّل يحتاجها. أضِفها إلى قائمة وجهات النشر قبل اختيار نفق كامل.
إذا كانت قناة التحكم ستعبر النفق، فيجب أن يصرّح التصميم بذلك عن قصد. اكتشاف ذلك أثناء التراجع ليس خطة. اكتب القائمتين: ما يجب أن تصل إليه المهمة بشكل خاص، وما يجب أن يصل إليه المشغّل بغض النظر عن ذلك.
هل تحتاج هذه المهمة وصولًا خاصًا أصلًا؟
اسأل قبل إضافة النفق إن كانت مرحلة البناء تحتاجه. يمكن لوكيل نشر خاص أن يجلب مخرجًا معتمدًا وينفّذ النشر، وهذا يبقي مرحلة البناء العامة خارج الشبكة الخاصة. هذا الفصل عادةً أرخص من تعليم كل خطوة بناء أن تمر عبر نفق.
اختر الحدود من سير العمل لا من العادة. إذا كان الجواب لا، فباقي هذه الصفحة غير ضروري، وهذا أفضل نتيجة متاحة.
الحالة التي ترثها المهمة التالية
صِف ما يجب أن يكون صحيحًا قبل المهمة، وأثناء حيازتها للوصول الخاص، وبعد انتهائها، بما في ذلك الإلغاء. الحالة النهائية هي الأكثر تركًا ضمنيًا، وهي التي ترثها المهمة التالية. اكتبها بجوار خط الأنابيب بدلًا من تركها في ذاكرة أحدهم.
| Moment | What proves it | What leaks if it is skipped |
|---|---|---|
| Job start: pre-flight route check | The route table shows no tunnel from an earlier job, and the profile list is empty | A stale route sends deployment traffic into a dead tunnel |
| Job end: disconnect and shred | The profile is down and the temporary key file is gone | The next job inherits an open tunnel and a usable credential |
| Cancelled job: reboot or disposal | The host is replaced or rebooted before the next job starts | A killed process leaves the tunnel up with no owner |
وكيل مخصص أو قابل للتخلص منه يجعل تلك الحدود أسهل في الإنفاذ. الحاوية أو مساحة الأسماء تساعد فقط إذا كان ترتيب شبكتها وصلاحياتها يعزل التغيير فعليًا.
أوقف الاتصال، لا البرنامج
استخدم مسار الإنهاء في خط الأنابيب لإغلاق الاتصال الذي بدأته هذه المهمة وإزالة بيانات الاعتماد المؤقتة. لا تُطابِق العمليات باسم البرنامج على مضيف تستخدمه مهام أخرى؛ أوقف الاتصال المحدد بدلًا من ذلك. الأمران أدناه هما كل التنظيف، وكلاهما لا يعتمد على العثور على عملية.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
الإنهاء ليس عزلاً: المشغّل الذي يموت يحتفظ بالنفق الذي فتحه، والعملية التي تُوقَف بالقوة تتخطى الكتلة بالكامل. لهذا لا يمكن لأمر التنظيف وحده أن يكون التصميم كله. وإليك كيف يفشل عمليًا: تُلغى مهمة نشر عند خطوة النسخ، فلا تعمل كتلة الإنهاء أبدًا، وتبدأ المهمة التالية على المضيف نفسه بنفق حي ومسار يشير إلى شبكة لا يمكنها الوصول إليها. يبدو العطل كأنه مشكلة 'DNS' في البناء التالي، بعد ساعات من انتهاء المهمة التي سبّبته.
سجّل اسم الملف الشخصي ومسار بيانات الاعتماد في مخرجات المهمة. أمر فصل مجرّد بلا أي معرّف يصعب تدقيقه لاحقًا. سطر السجل هو أيضًا ما يثبت أن الكتلة عملت عندما يسأل تحقيق لاحق.
أعطِ المهمة مضيفًا لا يستخدمه أحد غيرها
البنية التحتية القابلة للتخلص منها تزيل مشكلة الوراثة بدلًا من إدارتها. يبدأ وكيل جديد لكل مهمة بلا مسار ولا ملف شخصي ولا بيانات اعتماد من أي شخص آخر، وتدميره ينظّف كل ما تركته المهمة. هذا يكلّف أكثر لكل بناء، وهو الثمن الصادق لحدود لا تعتمد على كود التنظيف. للمهام التي تمس شبكات الإنتاج، عادةً يكون الخيار الأرخص بمجرد حساب الحوادث.
حيث يجب أن يبقى المشغّل المشترك، اختبر الفشل والإلغاء بعناية النسخ الناجح نفسها. يجب أن يُظهر الاختبار ما ستراه المهمة التالية لو أُلغيت هذه في منتصف الطريق. المهمة تنتهي عندما ينتهي وصولها وحالتها المؤقتة، لا عندما يعيد أمر النسخ صفرًا.