আপনি VPN দিয়ে Jenkins খুলতে পারেন এবং তবুও দেখতে পারেন GitHub ব্যর্থ ওয়েবহুক রিপোর্ট করছে, কারণ এগুলো দুই ভিন্ন মালিকের দুই ভিন্ন সংযোগ। ব্রাউজার সেই টানেল দিয়ে যায় যা আপনার ল্যাপটপ সমঝোতা করেছে; GitHub-এর ডেলিভারি সেবা পাবলিক ইন্টারনেট থেকে শুরু হয় এবং প্রাইভেট নেটওয়ার্কে তার কোনো পথ নেই। রিপোজিটরিতে প্রবেশ এটি বদলায় না, যদিও Jenkins নিজেই একই রিপোজিটরি থেকে অনায়াসে নিতে পারে। একটি ইনগ্রেস, রিলে বা পোলিং বেছে নিন, তারপর ঘটনাটি সত্যিই যে পথে যায় তা পরীক্ষা করুন।

ব্রাউজার সেশন কেবল এক দিক প্রমাণ করে

VPN সংযোগ একটি প্রশ্নের উত্তর দেয়: এই ল্যাপটপটি কি ভেতরের হোস্টে পৌঁছাতে পারে। ওয়েবহুক ডেলিভারি অন্য প্রশ্ন করে: একটি বাহ্যিক সেবা কি সেই হোস্টে সংযোগ খুলতে পারে। Jenkins রিপোজিটরি থেকে নেওয়া বহির্গামী ট্রাফিক এবং অন্তর্গামী নাগাল সম্পর্কে কিছুই বলে না। আপনার চিত্রে দুই দিক আলাদা লাইনে রাখুন, কোন পক্ষ কোনটি শুরু করে তাও অন্তর্ভুক্ত করুন।

কিছু বদলানোর আগে ডেলিভারি রেকর্ড পড়ুন। সময় শেষ হওয়া, সংযোগ রিসেট এবং কোনো কাজের সাথে না মেলা গৃহীত অনুরোধ—এই তিনটির তিনটি ভিন্ন মালিক: নেটওয়ার্ক, প্রক্সি ও ট্রিগার কনফিগারেশন।

বিকল্প A: সংকীর্ণ এন্ডপয়েন্ট খুলুন

সংস্থা ইতিমধ্যে অনুমোদিত ইনগ্রেস প্রকাশ করলে, ড্যাশবোর্ডের বদলে ওয়েবহুকের পথ খুলুন। সাধারণত এর অর্থ হলো একটি রিভার্স প্রক্সি নিয়ম যা হুক URL-এ POST গ্রহণ করে এবং সেগুলো Jenkins-এ পাঠায়, আর প্রশাসনিক ইন্টারফেস বাইরে থেকে অগম্য থাকে।

curl -sS -o /dev/null -w "%{http_code}\n" -X POST https://jenkins.example.com/github-webhook/

সেই পরীক্ষা VPN অ্যাক্সেস ছাড়া কোনো নেটওয়ার্ক থেকে চালান, কারণ টানেলের ভেতর থেকে সাফল্য কিছুই প্রমাণ করে না। এন্ডপয়েন্টের উচিত শেয়ার করা গোপন তথ্য ছাড়া অনুরোধ প্রত্যাখ্যান করা, যা GitHub সিগনেচার হেডার হিসেবে পাঠায়, এবং কেবল সেই একমাত্র পথ ও পদ্ধতি গ্রহণ করা যা আপনি প্রকাশ করেছেন। প্রকাশ্য Jenkins কনসোল ওয়েবহুকের সমাধান নয়; এটি পরবর্তী স্ক্যানারের অপেক্ষায় থাকা একটি ঘটনা। নিয়মটি যথেষ্ট সংকীর্ণ করুন যাতে বাকি অ্যাপ্লিকেশন তার আগের অ্যাক্সেস নিয়ন্ত্রণ রাখে।

বিকল্প B: রিলে দিয়ে দিক উল্টান

যেখানে অন্তর্গামী উন্মোচন অনুমোদিত হবে না, সেখানে নেটওয়ার্কের ভেতরের একটি ছোট ক্লায়েন্ট রিলের দিকে বহির্গামী সংযোগ ধরে রাখতে পারে এবং পাঠানো ঘটনা গ্রহণ করতে পারে। তখন রিলে ডেলিভারি পথের অংশ হয়ে যায়, তাই এর প্রাপ্যতা ও প্রমাণীকরণ বিল্ড কাজের মতোই গুরুত্বপূর্ণ।

ssh -N -R 9000:localhost:8080 relay.example.net

ফায়ারওয়ালের পেছনে ওয়েবহুক নিয়ে Jenkins-এর নির্দেশনা এই রূপ বর্ণনা করে, এবং নিজের ফরওয়ার্ডার লেখার আগে এটি পড়া উচিত। রিলেতে TLS শেষ করুন, ঘটনা কাজে পৌঁছানোর আগে স্বাক্ষর যাচাই করুন, এবং বহির্গামী লিঙ্ক পর্যবেক্ষণ করুন, কারণ পড়ে যাওয়া টানেল ঠিক সেই ঘটনার মতো দেখায় যা কখনো পাঠানো হয়নি। রিলে অনুরোধের মূল অংশ বাইটে বাইটে সংরক্ষণ করে তাও নিশ্চিত করুন, কারণ পথে পার্স ও পুনরায় এনকোড করা JSON-এ স্বাক্ষর যাচাই ব্যর্থ হয়।

বিকল্প C: বরং রিপোজিটরি পোল করুন

পোলিং বিলম্বকে সরলতার বদলে দেয় এবং অন্তর্গামী পথের প্রয়োজনই নেই। Jenkins সময়সূচি অনুযায়ী পোল করতে পারে, বা ছোট কাজ API-কে জিজ্ঞাসা করে অচেনা সংশোধন দেখলে বিল্ড শুরু করতে পারে।

curl -sS -u "$USER:$TOKEN" "https://api.github.com/repos/OWNER/REPO/commits?per_page=1"

প্রতিটি পোল API কল খরচ করে এবং push ও বিল্ডের মধ্যে বিলম্ব যোগ করে, যা ব্যস্ত রিপোজিটরি ও ভাগ করা হার সীমায় দেখা যায়। পোলার যেখানে চলে সেখানে সংরক্ষিত পরিচয়পত্রও লাগে, তাই টোকেনকে কেবল পঠনযোগ্য রিপোজিটরি অ্যাক্সেসে সীমাবদ্ধ করুন এবং অন্য যেকোনো গোপন তথ্যের মতো ঘোরান। ঘটনার পরিমাণ কম হলে বা কোনো ইনগ্রেস কখনো অনুমোদিত না হলে এটি বেছে নিন, এবং কাজের বিবরণে তা লিখুন যাতে পরে কেউ বিল্ড কেন পিছিয়ে আছে ভেবে না বসে।

পৃষ্ঠা লোড নয়, প্রকৃত ডেলিভারি গ্রহণ করুন

আপনি যে বিকল্পই বেছে নিন, গ্রহণযোগ্যতা পরীক্ষা হলো উৎস প্ল্যাটফর্মের পাঠানো ঘটনা, বিশেষাধিকারপ্রাপ্ত ল্যাপটপ থেকে খোলা ব্রাউজার ট্যাব নয়। স্ক্র্যাচ শাখায় খালি commit push করুন এবং ডেলিভারি প্রতিক্রিয়া কোড, রিলে লগ বা পোলিং কাজের আউটপুট এই ক্রমে পড়ুন। এন্ডপয়েন্ট থেকে 200 এসে বিল্ড না হলে ট্রিগার ফিল্টার ভুল; সময় শেষ হলে পথ এখনো বন্ধ। তিনটি নকশার মধ্যে কোনটি ব্যবহৃত হচ্ছে তা লিখে রাখুন, নইলে পরে ডিবাগ করা ব্যক্তি ব্রাউজার পরীক্ষা পুনরাবৃত্তি করবে এবং একই বন্ধ গলিতে পৌঁছাবে।

পেমেন্ট কলব্যাক এবং অন্য বাহ্যিক বিজ্ঞপ্তিতেও একই যুক্তি প্রয়োগ করুন: প্রত্যেক মানুষের কাছে ইতিমধ্যে VPN সেশন থাকলেও প্রত্যেকের প্রাইভেট অ্যাপ্লিকেশনে নিজস্ব পথ দরকার। ডেলিভারি পথ অ্যাপ্লিকেশনের নকশার অংশ, নেটওয়ার্কিংয়ের পাদটীকা নয়।

সম্পর্কিত নিবন্ধ