ক্রমাগত সংহতকরণের সাথে একটি বর্ধমান, বিবিধ কোডবেস বজায় রাখা


10

অবিচ্ছিন্ন ইন্টিগ্রেশন সেটআপের দর্শন এবং ডিজাইনের জন্য আমার কিছুটা প্রয়োজন of

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

আমাকে এক মুহুর্তের জন্য হাস্যরস করুন এবং আমাকে উত্তরাধিকার সূত্রে আমি কী বলেছি তা ব্যাখ্যা করতে দিন। আমার সংস্থার কোডবেস প্রায় 150 টি ইউনিক সি ++ উইন্ডোজ অ্যাপ্লিকেশন, যার প্রত্যেকটিরই এক বা একাধিক ডজন অভ্যন্তরীণ লাইব্রেরির উপর নির্ভরশীলতা রয়েছে (এবং তৃতীয় পক্ষের লাইব্রেরিতেও অনেকগুলি)। এর মধ্যে কয়েকটি লাইব্রেরি পরস্পর নির্ভরশীল এবং নির্ভরযোগ্য অ্যাপ্লিকেশনগুলি রয়েছে (যদিও তাদের একে অপরের সাথে কোনও সম্পর্ক নেই) সেই লাইব্রেরির একই বিল্ড দিয়ে তৈরি করতে হবে। এর মধ্যে অর্ধেক অ্যাপ্লিকেশন এবং গ্রন্থাগারগুলিকে "উত্তরাধিকার" এবং অপ্রাপ্তযোগ্য হিসাবে বিবেচনা করা হয়, এবং অবশ্যই আইবিএম সংকলক (যার জন্য আমি অনন্য সাবক্লাস লিখেছি Compile) এর কয়েকটি স্বতন্ত্র কনফিগারেশন দিয়ে নির্মিত হতে হবে , এবং অন্যান্য অর্ধেক ভিজ্যুয়াল স্টুডিওতে নির্মিত হয়েছে builtShellCommandগুলি, যেমন ভিএসএসের কোনও সমর্থন নেই)।

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

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

তবে এই পদ্ধতির চারটি দুর্বলতা রয়েছে। একটি হ'ল আমাদের উত্স গাছের নির্ভরতাগুলির জটিল ওয়েব। কনফিগারেশন মেনটেনেস সহজ করার জন্য, সমস্ত বিল্ডার একটি বড় অভিধান থেকে উত্পন্ন হয়। নির্ভরতাগুলি পুনরুদ্ধার করা হয় এবং একটি ভয়াবহ শক্তিশালী ফ্যাশনে নির্মিত হয় (যথা, আমার বিল্ড-টার্গেট ডিকশনারিতে কিছু জিনিসকে সরিয়ে রেখে)। দ্বিতীয়টি হ'ল প্রতিটি বিল্ডের 15 থেকে 21 টির মধ্যে বিল্ড স্টেপ রয়েছে, যা ব্রাউজ করা এবং ওয়েব ইন্টারফেসে দেখা শক্ত, এবং যেহেতু প্রায় 150 টি কলাম রয়েছে, লোড হতে চিরকাল লাগে (30 সেকেন্ড থেকে একাধিক মিনিট পর্যন্ত ভাবেন)। তৃতীয়ত, আমাদের আর নির্মাণের লক্ষ্যমাত্রার অটোডিস্কোভারি নেই (যদিও, আমার এক সহকর্মী এই সম্পর্কে যতটা আমাকে বর্ষণ করেছেন, আমি এটি দেখতে পাচ্ছি না যে এটি আমাদের প্রথম স্থানে কী পেয়েছিল)। অবশেষে,

এখন, নতুন বিকাশে চলে আসছি, আমরা জি ++ এবং সাবভারশন ব্যবহার করতে শুরু করছি (পুরানো সংগ্রহশালাটি পোর্টিং নয়, মনে রাখবেন - কেবলমাত্র নতুন স্টাফের জন্য)। এছাড়াও, আমরা আরো ইউনিট পরীক্ষা করার শুরু করেছে ( "আরো" ভুল ছবি দিতে পারে ... এটা আরো মত কোন ), এবং ইন্টিগ্রেশন (পাইথন ব্যবহার করে) পরীক্ষার। কীভাবে এগুলিকে আমার বিদ্যমান কনফিগারেশনে ফিট করতে হয় তা নির্ধারণ করতে আমার বেশ কষ্ট হচ্ছে।

সুতরাং, আমি এখানে দার্শনিকভাবে কোথায় ভুল হয়ে গেছি? আমি কীভাবে সর্বোত্তমভাবে এগিয়ে যেতে পারি (বিল্ডবোট সহ - এটি ধাঁধার একমাত্র টুকরো যাতে আমার কাজ করার লাইসেন্স আছে) যাতে আমার কনফিগারেশনটি আসলে রক্ষণাবেক্ষণযোগ্য হয়? আমি কীভাবে আমার ডিজাইনের কিছু দুর্বলতা সমাধান করব? বড়, (সম্ভবত অতিরিক্ত) জটিল কোডবাসের জন্য সিআই কৌশলগুলির ক্ষেত্রে আসলে কী কাজ করে?

সম্পাদনা করুন:

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


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

আপনার স্থানীয় মেশিনে তৈরি করতে সক্ষম না হওয়া আপনার সিআই সার্ভার মিশনটিকে আপনার ব্যবসায়ের জন্য সমালোচনা করে তোলে । আপনি এটি পুনর্বিবেচনা করতে চাইতে পারেন।
থরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


3

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

আমি সমস্যাটি 2 ভাগে বিভক্ত করব: বিল্ডিং এবং সিআই।

ভবন

"বিল্ডিং" এর অর্থ হ'ল সোর্স কোডটি চূড়ান্ত নিদর্শনগুলিতে পরিবর্তিত করার প্রক্রিয়া। আমাদের সংস্থাটি প্রধানত বিকাশে জাভা ব্যবহার করে এবং আমরা যে বিল্ড সরঞ্জামটি ব্যবহার করি তা হ'ল মাভেন। আপনার প্রকল্পের প্রকৃতির কারণে আপনি সম্ভবত এটি ব্যবহার করতে অক্ষম হবেন তবে মাভেনের কয়েকটি মূল্যবান ধারণা লক্ষ্য করার মতো রয়েছে:

1) মাভেন বিশ্বে প্রতিটি শিল্পকর্ম (একটি lib, আসল প্রোগ্রাম ইত্যাদি) পরিষ্কারভাবে বিচ্ছিন্ন এবং decoupled করা প্রয়োজন। আর্টিক্যাক্টের মধ্যে নির্ভরতা পরিষ্কার হওয়া উচিত। আমার জোর দেওয়া উচিত, অগোছালো নির্ভরতা, বিশেষত আপনার বিল্ড আর্টিক্টসের মধ্যে বিজ্ঞপ্তি নির্ভরতা বিল্ড প্রক্রিয়াটিকে গোলযোগে পরিণত করতে চলেছে।

উদাহরণস্বরূপ, আমি এর আগে কিছু জাভা প্রকল্প দেখেছি, যদিও পুরো বিল্ড প্রক্রিয়াটির পরে বেশ কয়েকটি জার নির্মিত হয় (আপনি এটি জাভাতে lib / dll হিসাবে বিবেচনা করতে পারেন) তবে তারা বাস্তবে আন্তঃনির্ভর। যেমন, এজার বিজারে জিনিসগুলি ব্যবহার করছে এবং এর বিপরীতে। এ জাতীয় 'মডুলারাইজেশন' সম্পূর্ণ অর্থহীন। এ.জার এবং বিজার সর্বদা একসাথে মোতায়েন এবং ব্যবহার করা প্রয়োজন। বোঝা যাচ্ছে, পরে যদি আপনি এগুলিকে বিভিন্ন প্রকল্পে আলাদা করতে চান (উদাহরণস্বরূপ অন্যান্য প্রকল্পের পুনরায় ব্যবহারের জন্য), আপনি এটি করতে সক্ষম হবেন না, কোজ আপনি নির্ধারণ করতে পারবেন না কোন প্রকল্পটি, এ বা বি প্রথমে তৈরি করতে হবে।

হ্যাঁ, এটি আপনার সফ্টওয়্যারটির নকশায় আবশ্যক, তবে আমি সর্বদা বিশ্বাস করি যে কোনও জটিল বিল্ডিংয়ের সরঞ্জামগুলি / মডেল কোনও অগোছালো প্রকল্পে কাজ করার জন্য সময় দেওয়ার পরিবর্তে আমি ডিজাইনটি পুনরায় সাজানোর জন্য সময়টি ব্যয় করার জন্য ব্যয় করব a সাধারণ বিল্ডিং মডেল।

2) নির্ভরতা ঘোষণামূলক হতে হবে। আমি আগে দেখেছি অনেকগুলি বিল্ড প্রক্রিয়া রয়েছে, যার মধ্যে তারা প্রকল্পে স্থানীয়ভাবে এটির প্রয়োজন সমস্ত লিবস অন্তর্ভুক্ত করে। এটি বিল্ডিং প্রক্রিয়াটিকে অত্যন্ত সমস্যায় ফেলবে যদি কিছু লিব আসলে আপনার অন্য নির্মাণের নিদর্শনগুলি তৈরি করে।

3) নির্ভরতা পাওয়ার জন্য শৈল্পিকাগুলির জন্য "সেন্ট্রালাইজড" স্টোরেজ, বা শৈলীগুলি একবার সংকলিত হয়ে গেলে তা স্থাপন করতে। এটি পুরো অফিসের জন্য "কেন্দ্রীভূত" হওয়ার দরকার নেই (এটি থাকলে দুর্দান্ত হবে), কেবল একটি স্থানীয় ডিরেক্টরি ইতিমধ্যে ভাল হয়ে যাবে।

2 এবং 3 এর আরও বিশদ বিবরণ মাত্র একটি উদাহরণ দেওয়ার জন্য, আমি এমন একটি প্রকল্প জুড়ে এসেছি যার মধ্যে 3 টি স্বতন্ত্র প্রকল্প জড়িত। প্রতিটি প্রকল্প উত্স ভিত্তিতে নির্মিত, এবং উত্স ডিরেক্টরিতে lib / ডিরেক্টরি অধীন libs হয়। প্রকল্প এ বিভিন্ন লিব তৈরি করবে, যা ঘুরে ঘুরে প্রকল্প বি এবং সি ব্যবহার করে There বেশ কয়েকটি ত্রুটি রয়েছে: বিল্ড প্রক্রিয়াটি জটিল এবং স্বয়ংক্রিয়ভাবে শক্ত; উত্স নিয়ন্ত্রণটি বিভিন্ন প্রকল্পে অপ্রয়োজনীয় সদৃশ জারগুলি পুনঃব্যবহৃত হয়ে ফেটে যাচ্ছে

মাভেনের বিশ্বে এটি যা করা হয় তা হ'ল, প্রকল্প বি এবং সিতে প্রকৃতপক্ষে প্রকল্পের উত্সে এজার (এবং অন্যান্য তৃতীয় পক্ষের মত অন্যান্য নির্ভরতা) নেই। এটা ঘোষণামূলক। উদাহরণস্বরূপ, প্রকল্প বি এর বিল্ড কনফিগারেশনে, এটি কেবল ঘোষণা করে যে এটির প্রয়োজন: এলিব ভি 1.0, xyz.lib v2.1 ইত্যাদি, এবং বিল্ড স্ক্রিপ্টটি / এ / ১.০ / এ থেকে লিবটি সন্ধান করবে। জার এবং /xyz/2.1/xyz.lib

অ-মাভেন বিশ্বের জন্য, এই আর্টিফ্যাক্ট দিরকে সম্মত ডিরেক্টরি কাঠামোর সাথে এক বা দুটি ডিরেক্টরি হওয়া দরকার। আপনি সমস্ত তৃতীয় পক্ষের libs একটি শেয়ারের স্থানে রাখতে পারেন এবং বিকাশকারীদের তাদের স্থানীয় মেশিনে সিঙ্ক বা অনুলিপি করতে পারেন। আমার সি ++ প্রকল্পগুলিতে আমি বহু বছর আগে করেছি, আমি যা করছি তা হল। Tif আর্টিক্যাক্ট_ডির} / lib_name / ver- এ লিব এবং শিরোনাম সেট করা এবং আর্টিফ্যাক্ট_আইডকে পরিবেশ পরিবর্তনশীল হিসাবে ঘোষণা করা।

যখন প্রকল্প এ নির্মিত হয়, তখন এর ফলশ্রুতি_দির এর ফলাফলের একটি অনুলিপি থাকবে, যাতে আমরা যখন প্রকল্প বি তৈরি করব, খ ম্যানুয়াল অনুলিপি ছাড়াই স্বয়ংক্রিয়ভাবে A এর ফলাফল পেতে পারে।

4) অ পরিবর্তনীয় মুক্তি। আপনি একবার A.lib 1.0 প্রকাশ করেন, এটি হ'ল, আপনি 1 মাসের পরে A.lib 1.0 এর সামগ্রী পরিবর্তনের আশা করবেন না তবে কিছু বিগ ফিক্স রয়েছে। সেক্ষেত্রে এটি A.lib 1.1 হওয়া উচিত। পরিবর্তিত কোড বেসের শৈল্পিকাগুলি একটি বিশেষ "সংস্করণ" বিবেচনা করা উচিত, যার জন্য মাভেনে আমরা এটিকে স্ন্যাপশট বলি।

অ-পরিবর্তনীয় মুক্তি আরও একটি নৈতিক সমস্যা। তবে এটি কী সমাধান করেছে তা স্পষ্ট: যখন আপনার কাছে অনেকগুলি প্রকল্প রয়েছে, একই লিব ব্যবহার করে আপনি জানেন যে আপনি যে লাইবটি ব্যবহার করছেন তার কোন সংস্করণ রয়েছে এবং আপনি নিশ্চিত হবেন যে, বিভিন্ন প্রকল্পে ব্যবহৃত lib এর একই সংস্করণটি আসলেই একই । আমি মনে করি আমাদের মধ্যে অনেকেই এই সমস্যার মধ্য দিয়ে গেছেন: প্রকল্প এক্স এবং ওয়াই উভয়ই লিব এ ব্যবহার করছেন তবে বিল্ডের ফলাফলটি ভিন্ন? (এবং দেখা যাচ্ছে যে এক্স এবং ওয়াই দ্বারা ব্যবহার করা লিব এ আসলে লিবের সামগ্রী বা ফাইলের আকারে খননের পরে পৃথক)।


এগুলি নিশ্চিত করে যে আপনার প্রকল্পগুলি যেমন ম্যানুয়াল ট্রিকস ছাড়াই স্বাধীনভাবে গড়ে তুলতে পারে, প্রজেক্ট তৈরি করতে প্রথমে, এ বি কে প্রকল্প বিতে অনুলিপি করুন এবং তারপরে প্রকল্প বি তৈরি করুন ...

এটির মতো অনুশীলনের মধ্য দিয়ে যাওয়ার পরে, উদাহরণস্বরূপ, আপনি যখন প্রকল্প এ তৈরি করবেন তখন এটি কেন্দ্রীয়ীকৃত আর্টিক্যাক্ট স্টোরেজ থেকে নির্ভরতা পাওয়ার চেষ্টা করবে। কিছু নির্ভরতা (যা আপনার সংস্থার অন্যান্য প্রকল্প, উদাহরণস্বরূপ প্রকল্প বি) খুঁজে পাওয়া যায় নি, আপনার যা করা দরকার তা হল, বি প্রকল্পের উত্স পান, এটি তৈরি করুন (যা সাফল্যের ভিত্তিতে কেন্দ্রীভূত স্টোরেজটিতে স্থাপন করা হবে), এবং তারপরে আবার প্রকল্প এ তৈরি করুন।


সি আই

একটি সহজ বিল্ড সিস্টেমের সাথে, পরিষ্কার নির্ভরতা সহ, সিআই আরও সহজ হবে। আমি আশা করব যে আপনার সিআই সার্ভারটি নিম্নলিখিত প্রয়োজনীয়তা পূরণ করে:

1) উত্স নিয়ন্ত্রণটি পর্যবেক্ষণ করুন, উত্সে পরিবর্তনগুলি উপস্থিত থাকলে কেবল চেকআউট + বিল্ড করুন

2) প্রকল্পগুলির মধ্যে নির্ভরতা সেটআপ করতে সক্ষম

প্রকল্পগুলির জন্য একটি সুস্পষ্ট নির্ভরতা সহ, আপনার কেবলমাত্র আপনার প্রকৃত প্রকল্পগুলি অনুযায়ী আপনার প্রকল্পগুলির নির্ভরতা অনুসারে সিআই-তে প্রকল্পগুলি সেটআপ করা দরকার। আপনার সিআই সার্ভারটি কোনও প্রকল্প তৈরির আগে নির্ভরশীল প্রকল্পগুলি তৈরি করতে সেট করা উচিত (এবং অবশ্যই, যদি প্রকল্পের উত্সটিতে সত্যিকারের পরিবর্তন ঘটে তবেই বিল্ডিং ঘটে)

যদি সবকিছু ঠিকঠাক হয় তবে আপনার একটি বিশাল, জটিল, তবে এখনও পরিচালনাযোগ্য সিআই হওয়া উচিত (এবং আরও গুরুত্বপূর্ণ, একটি পরিচালনাযোগ্য প্রকল্প কাঠামো)


আমি এই উত্তরটি কোথায় যাচ্ছে তা পছন্দ করি তবে আপনি কি 'বিল্ডিং' বিভাগে আরও বিশদে যেতে পারবেন? এটি হ'ল কিছু উদাহরণ দাও, কিছু ধারণা আরও বিশদভাবে ব্যাখ্যা কর।
নোট

এইচএম ... কোন অংশের মতো? আমি প্রতিটি অংশের আরও বিস্তারিত জানাতে পোস্টটি সম্পাদনা করার চেষ্টা করি। আপনি কোন অংশটি বিস্তারিতভাবে বোধ করা দরকার বলে আপনি যদি আমাকে বলতে পারেন তবে এটি আরও ভাল। যাইহোক, আপনি যদি জাভাও ব্যবহার করে থাকেন তবে maven.apache.org এ একবার দেখুন। মাভেন গ্রহণ করা সহজ জিনিস নাও হতে পারে তবে এটি আপনাকে আপনার জিনিসগুলিকে পরিষ্কার ও সংগঠিত করতে বাধ্য করে।
অ্যাড্রিয়ান শাম

1

আমার জন্য একই পরিস্থিতিতে কী কাজ করেছে:

  • বিল্ডের কিছু অংশকে ডেডিকেটেড বিল্ড অ্যাপগুলিতে সরিয়ে দিয়ে অ্যাপ-স্তরের বিমূর্ততা (আমাদের ক্ষেত্রে এগুলি মূল বিল্ড থেকে ডাকা পিএইচপি স্ক্রিপ্টগুলি)। এটি এক বিল্ড স্টেপে বিল্ড স্টেপগুলির কয়েক ডজন লাইনকে হ্রাস করতে পারে।
  • মূল বিল্ড স্ক্রিপ্ট থেকে চালু হওয়া সাব-বিল্ড-স্ক্রিপ্টগুলি তৈরি করে বিল্ড-লেভেল অ্যাবস্ট্রাকশন। এটি বিল্ডবোটের জন্য প্রাসঙ্গিক কিনা তা ধারণা নেই (সেই পণ্যটির সাথে কোনও অভিজ্ঞতা নেই)।

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি বিল্ডটি নিজেকে একটি সফ্টওয়্যার ডেভলপমেন্ট প্রকল্প হিসাবে বিবেচনা করবেন। এর অর্থ হল যে আপনি বিল্ড কোডবেসটি সংশোধন করতে হবে এবং এর জন্য কিছু স্বয়ংক্রিয় পরীক্ষা লিখতে হবে (উদাহরণস্বরূপ একটি পরিচিত সংশোধন নম্বর তৈরি করুন এবং এটি সঠিক ফলাফল দেয় কিনা তা পরীক্ষা করে দেখুন)।


0

আমি জেনকিন্সকে সিআই সার্ভার হিসাবে বিবেচনা করব, আপনি এখানে বৈশিষ্ট্যগুলি দেখতে পারেন:

https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins

কেন? এটি ইনস্টল করা সহজ, এর দুর্দান্ত ইন্টারফেস রয়েছে, এটি কনফিগার করা এবং প্রসারিত করা সহজ এবং প্রায় প্রতিটি কিছুর জন্য প্রচুর প্রস্তুত প্লাগইন রয়েছে:

https://wiki.jenkins-ci.org/display/JENKINS/Plugins

একবার চেষ্টা করে দেখো :)


2
আমি বুঝতে পারি যে আপনি আমার প্রশ্নের শিরোনামটি পড়েছেন, তবে শরীরটি পড়েন নি ... আমি কোনও পণ্যের পরামর্শ খুঁজছি না। আমি একটি পণ্য বেছে নিয়েছি । আমি কীভাবে একটি জটিল সিআই সেটআপ व्यवस्थित করব তা সন্ধান করছি।
নাট

নেট, আমি আপনার সমস্ত পোস্ট পড়েছি এবং আমার মনে হয় আপনি ভুল পণ্যটি বেছে নিয়েছেন, এজন্য আমি জেনকিন্সকে পরামর্শ দিয়েছিলাম। আমি একাধিক মেশিনে ক্লাস্টারিং সহ সি ++ পণ্য (এমনকি একাধিক ভাষায় লিখিত পরীক্ষা) পরীক্ষার জন্য জেনকিন্সকে কাজে ব্যবহার করি এবং এটি খুব ভাল চলছে well এটি পরিচালনা এবং কনফিগার করা খুব সহজ। সত্যিই, এটি চেষ্টা করুন :)
প্যাট্রিজিও রুলো


0

আমরা এখন ব্যবহার ThoughtWorks যেতে পূর্বে যে, আমরা ব্যবহার করছেন সেটি CruiseControl.Net । আমাদের দুটি দল একে অপরের থেকে অর্ধেক বিশ্ব দূরে রয়েছে এবং এটি আমাদের মধ্যে একটি বড় টাইম জোনের পার্থক্য বিবেচনা করে কার্যকর হয়েছে।

আমরা একাধিক প্রকল্প পরিচালনা করছি এবং বেশিরভাগ কার্যক্রমে বিশ্বের উভয় পক্ষের দু'জন বিকাশকারীদের মধ্যে ওভারল্যাপ জড়িত থাকে, তাই আমাদের মনে রাখতে হবে যে সমস্ত ফাইল অন্য কারও তৈরির ভঙ্গ হবে না।

এছাড়াও পরিচালনা করা সহজ এবং এগ্রিল প্রসেস ডাইহার্ড হওয়ার সাথে সহজ, এটি ইনস্টল করার পরে এটি আমাদের কম মাথা ব্যাথা করেছে। পরীক্ষার সাথেও গো সংহত করা হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.