আমি এখন একটি মাঝারি আকারের প্রকল্প পেয়েছি যা ক্লায়েন্ট ডেমোসের জন্য "opালু ক্যাফিন চালিত প্রোটোটাইপস" পর্বের শেষের দিকে এবং "ভবিষ্যতের বিষয়ে চিন্তাভাবনা" পর্যায়ে রূপান্তরিত হয়েছে। প্রকল্পটিতে সফ্টওয়্যার এবং ফার্মওয়্যারযুক্ত লিনাক্স-ভিত্তিক ডিভাইস এবং একটি কেন্দ্রীয় প্রশাসনিক ওয়েব সার্ভার রয়েছে। 10 টি প্রোটোটাইপ বর্তমানে বিদ্যমান, উত্পাদন কম 1000 এর ক্রম অনুযায়ী প্রত্যাশিত।
অটো-আপডেটের শিল্পে ভালভাবে দক্ষ না হওয়া এবং সময়মতো সংক্ষিপ্ত হওয়ার কারণে আমি খুব দ্রুত আমার নিজের সফ্টওয়্যার মোতায়েন / অটো-আপডেট কৌশল ঘুরিয়ে দিয়েছিলাম এবং সত্যি বলতে গেলে এটি সফল হয়। এটি বর্তমানে নিম্নলিখিতটি নিয়ে গঠিত:
- একটি প্রোডাকশন রিলিজ শাখা সহ একটি হোস্টেড গিট রেপো (গিটল্যাব) নোট করুন ওয়েব সার্ভার উত্সটিও একই রেপোতে রয়েছে, পাশাপাশি আরও কয়েকটি জিনিস রয়েছে)।
- ওয়েব ইন্টারফেসে একটি "ডিপ্লয় আপডেট" বোতাম যা:
- স্থানীয় রিপো অঞ্চলে উত্পাদন রিলিজ শাখা থেকে সর্বশেষতম সংস্করণ টানতে এবং এটি একটি অস্থায়ী প্যাকেজ প্রস্তুতি মঞ্চে অনুলিপি করে।
- সম্পর্কিত না হওয়া উত্স ফাইলগুলি (যেমন সার্ভার উত্স, ফার্মওয়্যার উত্স, ইত্যাদি) এবং .git ফাইলগুলি সরাতে মঞ্চে একটি স্যানিটাইজেশন স্ক্রিপ্ট (রেপোতে সঞ্চিত) চালায়।
- আপডেট প্যাকেজের কোনও ফাইলটিতে বর্তমান গিট হ্যাশ লিখেছেন (উদ্দেশ্য নীচে পরিষ্কার হবে)।
- যদি সবকিছু ঠিকঠাক হয় তবে এটি জিপ্স করে এবং একই নামের কোনও ফাইলের সাথে পূর্ববর্তী জিজিপড প্যাকেজটি ওভাররাইট করে পরিবেশন করতে প্রস্তুত করে, তারপরে মঞ্চ অঞ্চলটি মুছে ফেলবে।
- নোট করুন যে সার্ভারে এখনকার ডিভাইস সফ্টওয়্যারটির দুটি অনুলিপি রয়েছে, যা প্রত্যাশিত সিঙ্কে প্রত্যাশিত: সর্বশেষ উত্পাদনের শাখায় একটি সম্পূর্ণ লোকাল গিট রেপো এবং এখন একটি উপ-গজ জিপড প্যাকেজ যা এটি প্রতিনিধিত্ব করে বলে মনে করা হচ্ছে একই সংস্করণ।
- ডিভাইসে থাকা সফ্টওয়্যারটি নামের একটি ডিরেক্টরিতে স্ব-অন্তর্ভুক্ত
/opt/example/current
, যা সফ্টওয়্যারটির বর্তমান সংস্করণটির একটি সিমিলিংক। - ডিভাইসে একটি স্বয়ংক্রিয় আপডেট ফাংশন যা বুটে:
- কোনও
do_not_update
ফাইলের উপস্থিতি যাচাই করে এবং এটি উপস্থিত থাকলে আর কোনও পদক্ষেপ নেয় না (ডেভ ডিভাইসের জন্য, নীচে দেখুন)। - উপরে উল্লিখিত পাঠ্য ফাইল থেকে বর্তমান কমিট হ্যাশ পড়ুন s
- কোয়েরি প্যারামিটার হিসাবে সেই হ্যাশ দিয়ে সার্ভারে একটি HTTP অনুরোধ করে। সার্ভারটি হয় 304 (হ্যাশ বর্তমান সংস্করণ) দিয়ে প্রতিক্রিয়া জানাবে বা জিজেপড আপডেট প্যাকেজটি পরিবেশন করবে।
- আপডেট প্যাকেজটি ইনস্টল করে, যদি একটি প্রাপ্ত হয় তবে এর
/opt/example
মাধ্যমে:- নামযুক্ত একটি ফোল্ডার আপডেট হওয়া সফ্টওয়্যার সম্পর্কিত তথ্য বের করা
stage
। - আপডেট প্যাকেজ থেকে কোনও পোস্ট-ইন্সটলেশন স্ক্রিপ্ট চালানো যা কিছু আপডেট করে যেমন আপডেটের জন্য প্রয়োজনীয় স্থানীয় পরিবর্তন করা ইত্যাদি does
- এতে বর্তমান সফ্টওয়্যার রুট ফোল্ডারটি অনুলিপি করা হচ্ছে
previous
(বিদ্যমান থাকলেprevious
প্রথমে মুছে ফেলা হয়)। - এতে
stage
ফোল্ডারটি অনুলিপি করা হচ্ছেlatest
(বিদ্যমান থাকলে মুছে ফেলাlatest
হয়)) current
সিলেমিংকে নির্দেশ করে নিশ্চিত করাlatest
।- ডিভাইসটি পুনরায় বুট করা হচ্ছে (ফার্মওয়্যার আপডেটগুলি, উপস্থিত থাকলে পুনরায় বুটে প্রয়োগ করা হয়)।
- নামযুক্ত একটি ফোল্ডার আপডেট হওয়া সফ্টওয়্যার সম্পর্কিত তথ্য বের করা
- কোনও
নতুন নির্মিত ডিভাইসগুলিতে প্রাথমিক স্থাপনার বিষয়টিও রয়েছে। ডিভাইসগুলি বর্তমানে এসডি কার্ড ভিত্তিক (এখানে সমস্যাগুলির বাইরে নিজস্ব সমস্যার একটি সেট রয়েছে) তাই এই প্রক্রিয়াটি নিয়ে গঠিত:
- একটি এসডি চিত্র উপস্থিত রয়েছে যাতে এটিতে সফ্টওয়্যারটির কিছু পূর্ববর্তী সংস্করণ রয়েছে।
- এই চিত্র থেকে একটি এসডি কার্ড তৈরি করা হয়েছে।
- প্রথম বুটে, প্রথম প্রথমবারের বিভিন্ন ডিভাইস-নির্দিষ্ট (ক্রমিক সংখ্যা ভিত্তিক) আরম্ভ হয় এবং তারপরে অটো-আপডেটার গ্রাফিক্স এবং যথারীতি সফ্টওয়্যারটির সর্বশেষতম উত্পাদন সংস্করণ ইনস্টল করে।
অতিরিক্তভাবে, বিকাশকারী ডিভাইসগুলির জন্য আমার সমর্থন দরকার। বিকাশের ডিভাইসগুলির জন্য:
- ডিভাইসে একটি সম্পূর্ণ স্থানীয় গিট রেপো রক্ষণাবেক্ষণ করা হয়।
current
সিমবলিক লিঙ্ক উন্নয়ন ডিরেক্টরির স্থানটিকে চিহ্নিত করে।- একটি স্থানীয়
do_not_update
ফাইল উপস্থিত রয়েছে যা অটো-আপডেটারকে একটি প্রোডাকশন আপডেটের সাহায্যে ডেভলপমেন্ট কোডটি ফুটিয়ে তুলতে বাধা দেয়।
এখন, মোতায়েন প্রক্রিয়াটি তাত্ত্বিকভাবে এই উদ্দেশ্যে করা হয়েছিল:
- কোড একবার স্থাপনার জন্য প্রস্তুত হয়ে গেলে এটিকে রিলিজ শাখায় চাপ দিন।
- সার্ভারের "আপডেট প্রয়োগ করুন" বোতাম টিপুন।
- আপডেটটি এখন লাইভ এবং ডিভাইসগুলি পরের বার চেক করলে স্বয়ংক্রিয়ভাবে আপডেট হবে।
তবে বাস্তবে এক টন সমস্যা রয়েছে:
- ওয়েব সার্ভার কোডটি ডিভাইস কোডের মতোই রেপোতে রয়েছে এবং সার্ভারের একটি স্থানীয় গিট রেপো রয়েছে যা আমি কার্যকর করি। সর্বশেষতম ওয়েব সার্ভার কোড সর্বশেষতম ডিভাইস কোডের মতো একই শাখায় নেই। ডিরেক্টরি কাঠামো সমস্যাযুক্ত। যখন "ডিপ্লয়ে আপডেট" বোতামটি প্রযোজনা শাখা থেকে সর্বশেষ সংস্করণটি টানবে, তখন এটি সার্ভার কোডের একটি উপ-ডিরেক্টরিতে টেনে আনবে। এর অর্থ হ'ল আমি যখন কোনও স্ক্র্যাচ থেকে কোনও সার্ভারে স্থাপন করি, তখন ডিভাইস উত্পাদন শাখাটিকে এটির মধ্যে দিয়ে আমাকে এই সাব-ডাইরেক্টরিটিকে ম্যানুয়ালি "বীজ" করতে হবে, কারণ সম্ভবত আমার পক্ষ থেকে গিট ব্যবহারকারী ত্রুটি থেকে, যদি আমি স্থাপনার চেষ্টা না করি প্যারেন্ট ডিরেক্টরিগুলির ওয়েব সার্ভার শাখা থেকে ডিভাইস কোডটি টানুন । আমি মনে করি এটি স্টেজেজ এরিয়া সার্ভারের স্থানীয় গিট রেপোর একটি উপ-ডিরেক্টরি হিসাবে না করে এটি সমাধানযোগ্য।
- ওয়েব সার্ভার বর্তমানে অবিচ্ছিন্নভাবে ডিভাইস সফটওয়্যারের গিট হ্যাশ বজায় রাখে না। সার্ভার শুরুর সময়, এটি
git rev-parse HEAD
বর্তমান হ্যাশটি পুনরুদ্ধার করতে এর স্থানীয় ডিভাইস সফ্টওয়্যার রেপোতে একটি করে । এই কারণে আমি আমার মাথাটি গুটিয়ে রাখতে পারি না এমন কারণেই আমি এখানে বর্ণনা করব না এমন একটি যুক্তিযুক্ত ত্রুটি সৃষ্টি করছে, এটি যথেষ্ট বলে যথেষ্ট হয়েছে যে কখনও কখনও সার্ভারটি পুনরায় চালু করে জিনিসগুলি স্ক্রু আপ করে দেওয়া হয়, বিশেষত যদি সার্ভারটি একেবারেই নতুন এবং কোনও উত্পাদন না হয় শাখা রেপো এখনও টানা হয়েছে। অনুরোধ করা হলে আমি আনন্দের সাথে সেই যুক্তিটির উত্সটি ভাগ করে নিই, তবে এই পোস্টটি দীর্ঘ হচ্ছে। - যদি স্যানিটাইজেশন স্ক্রিপ্ট (সার্ভার সাইড) কোনও কারণে ব্যর্থ হয়, তবে সার্ভারটি একটি আপ টু ডেট রেপো রেখে গেছে তবে একটি সিঙ্ক / অদৃশ্য আপডেট প্যাকেজ রয়েছে, সুতরাং
git rev-parse HEAD
এমন একটি হ্যাশ ফিরে আসবে যা আসলে কী ঘটছে তার সাথে মেলে না that ডিভাইসগুলিতে পরিবেশন করা হয়েছে এবং এখানে সমস্যাগুলি অবশ্যই সার্ভার কমান্ড লাইনে ম্যানুয়ালি সংশোধন করতে হবে। অর্থাৎ সার্ভারটি জানে না আপডেট প্যাকেজটি সঠিক নয়, এটি কেবল সর্বদা খাঁটি বিশ্বাসের উপর নির্ভর করে। এটি পূর্ববর্তী পয়েন্টগুলির সাথে মিলিতভাবে সার্ভারকে অনুশীলনে অত্যন্ত ভঙ্গুর করে তোলে। - সবচেয়ে বড় সমস্যা হ'ল : ডিভাইসে বর্তমানে কোনও পৃথক আপডেটেটর ডেমন চলছে না। ওয়াইফাই ইন্টারনেট অ্যাক্সেস আসার জন্য অপেক্ষা করতে থাকা জটিলতা এবং শেষ মুহুর্তের কিছু হ্যাকারিগুলির কারণে এটি নিজেই মূল ডিভাইস নিয়ন্ত্রণ সফ্টওয়্যার যা ডিভাইসটি পরীক্ষা করে আপডেট করে। এর অর্থ হ'ল যদি কোনওভাবে খারাপভাবে পরীক্ষিত সংস্করণ এটিকে উত্পাদন করে তোলে এবং নিয়ন্ত্রণ সফ্টওয়্যারটি শুরু করতে না পারে তবে উপস্থিত সমস্ত ডিভাইসই মূলত ব্রিকযুক্ত, কারণ এটি আর আপডেট হতে পারে না। এটি উত্পাদন একটি নিখুঁত দুঃস্বপ্ন হবে। কোনও একক ডিভাইসের জন্য একই চুক্তি যদি এটি দুর্ভাগ্যজনক সময়ে শক্তি হারিয়ে ফেলে।
- অন্যান্য বড় সমস্যা হ'ল : ইনক্রিমেন্টাল আপডেটের জন্য কোনও সমর্থন নেই। যদি কোনও ডিভাইস বলে, কিছুক্ষণের জন্য চালু না করা হয়, তার পরের বার এটি আপডেট হয়ে গেলে এটি প্রকাশের সংস্করণগুলির একগুচ্ছ এড়িয়ে যায়, এটি সরাসরি সংস্করণ-এড়িয়ে যাওয়া আপডেট করতে সক্ষম হতে হবে। এর পরিণতি আপডেট করা হয়েছে স্থাপনাকে হ'ল এটি নিশ্চিত করার একটি দুঃস্বপ্ন যা কোনও প্রদত্ত আপডেট কোনও অতীত সংস্করণের উপরে প্রয়োগ করা যেতে পারে। তদতিরিক্ত, যেহেতু গিট হ্যাশগুলি সংস্করণ সংখ্যাগুলির পরিবর্তে সংস্করণগুলি সনাক্ত করতে ব্যবহৃত হয়, বর্ধিত আপডেটগুলি সহজতর করার জন্য সংস্করণগুলির অভিধানের তুলনামূলক তুলনা বর্তমানে সম্ভব নয়।
- একটি নতুন প্রয়োজনীয়তা যা আমি বর্তমানে সমর্থন করি না তা হ'ল প্রতি ডিভাইস কনফিগারেশন বিকল্প (কী / মান জোড়া) বিদ্যমান থাকবে যা প্রশাসনিক সার্ভারের পাশে কনফিগার করা উচিত। সফটওয়্যার আপডেট হিসাবে একই HTTP অনুরোধে ডিভাইসে এই প্রতি-ডিভাইস বিকল্পগুলি কোনওভাবেই সরবরাহ করা আমার কোনও আপত্তি হবে না (সম্ভবত আমি এটি HTTP শিরোনাম / কুকিগুলিতে আবদ্ধ করতে পারি) যদিও আমি এই বিষয়ে খুব বেশি উদ্বিগ্ন নই, আমি যেমন পারি সর্বদা এটির জন্য পৃথক এইচটিটিপি অনুরোধ করুন।
- হার্ডওয়্যারটির দুটি (এবং ভবিষ্যতে আরও বেশি) সংস্করণ বিদ্যমান রয়েছে বলে কিছুটা জটিলতা রয়েছে। হার্ডওয়্যার বর্তমান সংস্করণটি আসলে তার প্রাথমিক এসডি চিত্রে পরিবেশের পরিবর্তনশীল হিসাবে সংরক্ষণ করা হয় (তারা স্ব-সনাক্ত করতে পারে না) এবং সমস্ত সফ্টওয়্যার ডিভাইসগুলির সমস্ত সংস্করণের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য ডিজাইন করা হয়েছে। ফার্মওয়্যার আপডেটগুলি এই এনভায়রনমেন্ট ভেরিয়েবলের ভিত্তিতে বেছে নেওয়া হয় এবং আপডেট প্যাকেজে হার্ডওয়্যারের সমস্ত সংস্করণের জন্য ফার্মওয়্যার থাকে। আমি এটির সাথে বেঁচে থাকতে পারি যদিও এটি কিছুটা জটিল।
- ডিভাইসে ম্যানুয়ালি আপডেট আপলোড করার কোনও উপায় নেই (দীর্ঘ কাহিনী সংক্ষেপে এই ডিভাইসগুলির মধ্যে দুটি ওয়াইফাই অ্যাডাপ্টার রয়েছে, একটি ইন্টারনেটে সংযোগ স্থাপন করতে, এবং একটি এপি মোডে যা ব্যবহারকারী ডিভাইসটি কনফিগার করতে ব্যবহার করে; ভবিষ্যতে আমি ডিভাইসের স্থানীয় ওয়েব ইন্টারফেসে একটি "আপডেট সফ্টওয়্যার" ফাংশন যুক্ত করতে চাইছি)। এটি কোনও বিশাল চুক্তি নয় তবে আপডেট ইনস্টলেশন পদ্ধতিতে এর কিছুটা প্রভাব রয়েছে।
- একগুচ্ছ অন্যান্য হতাশা এবং সাধারণ অসতর্কতা।
সুতরাং ... যে দীর্ঘ ছিল। তবে আমার প্রশ্নটি এখানে ফোটে:
আমি কীভাবে এটি সঠিকভাবে এবং নিরাপদে করব? আমার বিদ্যমান প্রক্রিয়াটিতে আমি কি সামঞ্জস্য করতে পারি? আমি কি নিজের ক্রেপী আপডেট সিস্টেমটি রোল করতে না পারি তার জন্য কি এমন কোনও সময়-পরীক্ষিত কৌশল / বিদ্যমান সিস্টেমটি উত্সাহ অর্জন করতে পারে ? বা যদি আমার নিজের নিজস্ব রোল করতে হয়, তবে কোন স্থাপনা / আপডেট প্রক্রিয়াটি নিরাপদ ও সফল হওয়ার জন্য কোন জিনিসগুলি সত্য হতে হবে? আমি মিশ্রণে বিকাশ ডিভাইসগুলি অন্তর্ভুক্ত করতে সক্ষম হতে হবে।
আমি আশা করি প্রশ্নটি পরিষ্কার হয়ে গেছে। আমি বুঝতে পারি যে এটি কিছুটা অস্পষ্ট, তবে আমি 100% নিশ্চিত যে এটি একটি সমস্যা যা আগে মোকাবেলা করা হয়েছে এবং সফলতার সাথে সমাধান করা হয়েছে, আমি বর্তমানে জানি না যে বর্তমানে গৃহীত কৌশলগুলি কী।