CI রানারের VPN: টানেল কি বিল্ডের চেয়ে বেশি টিকে থাকে?
শেয়ার করা 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' সমস্যার মতো দেখায়, যে কাজটি ঘটিয়েছে তা শেষ হওয়ার ঘণ্টাখানেক পরে।
কাজের আউটপুটে প্রোফাইলের নাম ও ক্রেডেনশিয়ালের পথ লিখে রাখুন। কোনো শনাক্তকারী ছাড়া খালি ডিসকানেক্ট কমান্ড পরে অডিট করা কঠিন। লগের লাইনটিই পরেও তদন্ত চাইলে ব্লকটি চলেছিল বলে প্রমাণ দেয়।
কাজটিকে এমন হোস্ট দিন যা আর কেউ ব্যবহার করে না
নিষ্পত্তিযোগ্য অবকাঠামো উত্তরাধিকারের সমস্যাটি পরিচালনা নয়, সরিয়ে দেয়। প্রতিটি কাজের জন্য নতুন এজেন্ট কোনো রুট, প্রোফাইল বা অন্য কারও ক্রেডেনশিয়াল ছাড়া শুরু করে, আর তার ধ্বংস কাজটি যা রেখেছে তা পরিষ্কার করে। এতে প্রতি বিল্ডে বেশি খরচ হয়, আর এটিই এমন সীমার সৎ মূল্য যা পরিষ্কারের কোডের উপর নির্ভর করে না। প্রোডাকশন নেটওয়ার্কে হাত দেওয়া কাজের জন্য, ঘটনা গুনলে সাধারণত এটিই সস্তা বিকল্প।
যেখানে শেয়ার করা রানার থাকতেই হবে, সেখানে ব্যর্থতা ও বাতিল পরীক্ষা করুন সফল কপির মতোই যত্নে। পরীক্ষাটি দেখানো উচিত পরের কাজ কী দেখত যদি এই কাজটি মাঝপথে বাতিল হতো। কাজ শেষ তখনই, যখন তার অ্যাক্সেস ও অস্থায়ী অবস্থা শেষ হয়—কপি কমান্ড শূন্য ফেরালে নয়।