স্ট্রীমলাইন বিল্ডবট রেসিপি: কনফিগারেশন কোডের কাছাকাছি রাখা
সোর্স কোডের পাশাপাশি বিল্ডবট বিল্ড রেসিপি পরিচালনা করা একটি চড়াই যুদ্ধের মতো অনুভব করতে পারে যখন সবকিছু একটি কেন্দ্রীভূত, বিশৃঙ্খল অবস্থানে সংরক্ষণ করা হয়। 🛠️ বিকাশকারীরা প্রায়শই বিস্তৃত কনফিগারেশনের মাধ্যমে নেভিগেট করতে সময় নষ্ট করে, বিশেষ করে যখন প্রকল্পের আকার বড় হয়।
একটি প্রজেক্ট রিপোজিটরি খোলার কল্পনা করুন এবং সাথে সাথে সোর্স কোড এবং এর নিজ নিজ বিল্ড রেসিপি উভয়ই সুন্দরভাবে একসাথে অবস্থিত। এটি শুধুমাত্র রক্ষণাবেক্ষণকে সহজ করে না কিন্তু নিশ্চিত করে যে রেসিপিগুলি তাদের সমর্থন করা কোডের সাথে বিকশিত হয়। সংযোগ বিচ্ছিন্ন ডিরেক্টরি বা পুরানো বিল্ডগুলির মাধ্যমে আর শিকার করা হবে না!
বিকাশকারী হিসাবে আমার প্রথম দিনগুলিতে, আমি এমন একটি দলে কাজ করেছি যেখানে সমস্ত বিল্ড স্ক্রিপ্ট একটি বিশাল ফোল্ডারে থাকত। প্রকল্পের সংখ্যা বৃদ্ধির সাথে সাথে ফোল্ডারটি পরিচালনা করা একটি দুঃস্বপ্ন হয়ে উঠেছে। প্রজেক্ট শাখার কাছাকাছি বিল্ড রেসিপিগুলি সরানো একটি গেম-চেঞ্জার হয়ে উঠেছে—এটি আমাদের কর্মপ্রবাহে স্বচ্ছতা, সংগঠন এবং গতি এনেছে। 🚀
আপনি যদি বিল্ডবটে নতুন হয়ে থাকেন, চিন্তা করবেন না—আপনার সোর্স কোডের পাশাপাশি বিল্ড রেসিপি অন্তর্ভুক্ত করা একেবারেই সম্ভব। এই গাইডে, আমি আপনাকে শুরু করতে সাহায্য করার জন্য স্পষ্ট উদাহরণ এবং ব্যবহারিক টিপস সহ আপনি কীভাবে এটি অর্জন করতে পারেন তা অন্বেষণ করব।
আদেশ | ব্যবহারের উদাহরণ |
---|---|
os.path.exists() | এই কমান্ডটি একটি নির্দিষ্ট ফাইল বা ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করে। বিল্ড প্রক্রিয়া শুরু করার আগে বিল্ড স্ক্রিপ্ট বা ডিরেক্টরির উপস্থিতি যাচাই করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ। |
steps.ShellCommand() | Buildbot এ শেল কমান্ড কার্যকর করতে ব্যবহৃত হয়। বিল্ড প্রক্রিয়া পাইপলাইনের মধ্যে সরাসরি বিল্ড স্ক্রিপ্ট চালানোর জন্য এটি বিশেষভাবে গুরুত্বপূর্ণ। |
util.BuilderConfig() | এই কমান্ডটি Buildbot-এ একজন নির্মাতাকে সংজ্ঞায়িত করতে ব্যবহৃত হয়। এটি একটি প্রকল্পের সাথে যুক্ত পদক্ষেপ, কর্মীদের নাম এবং বিল্ড কনফিগার করে। |
subprocess.run() | এই পাইথন কমান্ড একটি বহিরাগত স্ক্রিপ্ট বা প্রক্রিয়া চালায়, এর আউটপুট ক্যাপচার করে। এটি বিল্ড স্ক্রিপ্ট এক্সিকিউশন যাচাই এবং পরীক্ষা করার জন্য সহায়ক। |
mkdir -p | একটি Bash কমান্ড যা পুনরাবৃত্তভাবে ডিরেক্টরি তৈরি করে। `-p` বিকল্পটি নিশ্চিত করে যে ডিরেক্টরিটি আগে থেকেই বিদ্যমান থাকলে কোনো ত্রুটি ঘটবে না। |
capture_output=True | একটি কমান্ডের আউটপুট ক্যাপচার করতে `subprocess.run()` এর সাথে ব্যবহার করা হয়। এটি ডিবাগিং বা স্ক্রিপ্ট এক্সিকিউশন বৈধ করার জন্য বিশেষভাবে কার্যকর। |
raise FileNotFoundError() | একটি পাইথন ব্যতিক্রম উত্থাপিত হয় যখন একটি প্রয়োজনীয় ফাইল, যেমন বিল্ড স্ক্রিপ্ট অনুপস্থিত থাকে। এটি প্রক্রিয়ার প্রথম দিকে মৃত্যুদন্ডের ত্রুটিগুলি প্রতিরোধ করতে সহায়তা করে। |
unittest.TestCase | পাইথনে একটি ইউনিট পরীক্ষার ক্লাস সংজ্ঞায়িত করে। এটি স্বয়ংক্রিয় পরীক্ষার মাধ্যমে বিল্ড স্ক্রিপ্টগুলির কার্যকারিতা যাচাই করার জন্য দরকারী। |
gcc | C/C++ প্রোগ্রামের জন্য একটি কম্পাইলার কমান্ড। এটি সোর্স কোডকে এক্সিকিউটেবল বাইনারিতে কম্পাইল করে, অনেক বিল্ড প্রসেসের মূল ধাপ তৈরি করে। |
echo | এই Bash কমান্ড কনসোলে বার্তা আউটপুট করে। এটি নির্মাণের সময় অগ্রগতি আপডেট বা হাইলাইট ত্রুটিগুলি প্রদান করতে স্ক্রিপ্টগুলিতে ব্যবহৃত হয়। |
মডুলার স্ক্রিপ্টের সাথে বিল্ডবট ইন্টিগ্রেশন সরলীকরণ করা
উপরে উপস্থাপিত স্ক্রিপ্টগুলি প্রজেক্ট সোর্স কোডের পাশাপাশি বিল্ডবট বিল্ড রেসিপি কীভাবে অন্তর্ভুক্ত করতে হয় তা প্রদর্শন করে, কর্মপ্রবাহকে আরও সংগঠিত এবং দক্ষ করে তোলে। প্রথম স্ক্রিপ্টটি পাইথনের একটি ফাংশনকে সংজ্ঞায়িত করে যা `steps.ShellCommand()` মডিউল ব্যবহার করে বিল্ডবট কনফিগারেশনে একটি বিল্ড রেসিপি সংহত করে। এই কমান্ডটি বিল্ডবটকে প্রকল্পের ডিরেক্টরির মধ্যে অবস্থিত শেল স্ক্রিপ্টগুলি চালানোর অনুমতি দেয়। উদাহরণস্বরূপ, একটি কেন্দ্রীভূত ফোল্ডারে ছড়িয়ে ছিটিয়ে থাকা রেসিপিগুলি পরিচালনা করার পরিবর্তে, বিল্ড স্ক্রিপ্টটি এখন সরাসরি একটি "বিল্ড" ফোল্ডারের অধীনে প্রকল্প কাঠামোতে বাস করে। এই পদ্ধতিটি নিশ্চিত করে যে বিল্ড রেসিপিটি সোর্স কোডের পাশাপাশি বিবর্তিত হয়েছে, অসঙ্গতিগুলি কমিয়েছে। 🛠️
Bash স্ক্রিপ্টে, `mkdir -p` ব্যবহার নিশ্চিত করে যে কোনো সংকলন হওয়ার আগে একটি আউটপুট ডিরেক্টরি বিদ্যমান রয়েছে। উদাহরণ স্বরূপ, 'build_output' ডিরেক্টরিটি তৈরি করা হয়েছে কম্পাইল করা ফাইলগুলিকে কোনো ত্রুটি সৃষ্টি না করে সংরক্ষণ করার জন্য, এমনকি যদি এটি ইতিমধ্যেই বিদ্যমান থাকে। এরপরে, সোর্স ডিরেক্টরিতে সি কোড কম্পাইল করতে এবং এক্সিকিউটেবল তৈরি করতে `gcc` ব্যবহার করা হয়। এটি একটি বাস্তব-বিশ্বের দৃশ্য দেখায় যেখানে বিল্ড রেসিপিটি সহজবোধ্য, এবং কমান্ডগুলি প্রকল্প সংকলনের জন্য নির্দিষ্ট। ব্যাশ স্ক্রিপ্টটি স্পষ্ট অগ্রগতি বার্তা প্রদানের জন্য `ইকো` কমান্ডগুলিকেও ব্যবহার করে, নিশ্চিত করে যে বিকাশকারীরা রিয়েল টাইমে বিল্ড প্রক্রিয়া বুঝতে পারে।
পাইথন ইউনিট টেস্ট স্ক্রিপ্ট নিশ্চিত করে যে বিল্ড রেসিপিটি শুধুমাত্র একত্রিত নয় বরং বিভিন্ন পরিবেশে সঠিকভাবে কাজ করে। `subprocess.run()` ব্যবহার করে, টেস্ট স্ক্রিপ্ট একটি সাবপ্রসেস হিসাবে বিল্ড রেসিপিটি কার্যকর করে, বৈধতার জন্য এর আউটপুট ক্যাপচার করে। বিল্ড স্ক্রিপ্ট ব্যর্থ হলে, ইউনিট পরীক্ষা ত্রুটিটি ধরে এবং অবিলম্বে পতাকাঙ্কিত করে। অতিরিক্তভাবে, `os.path.exists()` ফাংশন ক্রিটিক্যাল ফাইলের জন্য পরীক্ষা করে, যেমন বিল্ড স্ক্রিপ্ট এবং ফলস্বরূপ এক্সিকিউটেবল। এই ধরনের বৈধতা নিশ্চিত করে যে বিকাশকারীরা বিল্ড প্রক্রিয়া শুরু হওয়ার আগে অনুপস্থিত উপাদানগুলির বিষয়ে সতর্ক করা হয়, সময় এবং হতাশা সাশ্রয় করে।
একাধিক প্রকল্প পরিচালনাকারী বিকাশকারীদের জন্য, এই স্ক্রিপ্টগুলি একটি গেম-চেঞ্জার। উদাহরণস্বরূপ, যদি আপনার টিম একটি প্রকল্পের তিনটি শাখায় কাজ করে, প্রতিটি শাখার এখন নিজস্ব বিল্ড রেসিপি তার নিজ নিজ উৎস কোডের পাশাপাশি অবস্থিত থাকতে পারে। এটি একটি কেন্দ্রীভূত কনফিগারেশনের বিভ্রান্তি দূর করে, কারণ প্রতিটি দলের সদস্য তাদের শাখায় স্বাধীনভাবে কাজ করতে পারে। এই পদ্ধতি অনুসরণ করে, আপনি আপনার বিল্ডবট সেটআপের মধ্যে স্বচ্ছতা, পরিমাপযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করেন। মডুলার স্ক্রিপ্ট এবং স্বয়ংক্রিয় পরীক্ষার জায়গায়, ডেভেলপাররা ভাঙা বিল্ডগুলি ঠিক করার পরিবর্তে কোড লেখার উপর বেশি মনোযোগ দিতে পারে। 🚀
ভালো প্রতিষ্ঠানের জন্য প্রোজেক্ট সোর্স কোডের মধ্যে বিল্ড রেসিপি একত্রিত করা
বিল্ডবট কনফিগারেশন স্ক্রিপ্ট সহ পাইথন-ভিত্তিক ব্যাকএন্ড পদ্ধতি
# Import required modules
import os
from buildbot.plugins import steps, util
# Function to define build recipe
def build_recipe(project_name):
source_dir = f"./{project_name}/source"
build_script = f"./{project_name}/build/compile.sh"
if not os.path.exists(build_script):
raise FileNotFoundError("Build script not found!")
# Return a Buildbot ShellCommand step
return steps.ShellCommand(
name=f"Build {project_name}",
command=[build_script],
workdir=source_dir,
)
# Example of integrating the recipe into a Buildbot configuration
c['builders'] = [
util.BuilderConfig(
name="example_project",
workernames=["worker1"],
factory=util.BuildFactory(
steps=[
build_recipe("example_project")
]
)
)
]
উন্নত ফ্রন্টেন্ড এবং ব্যাকএন্ড ওয়ার্কফ্লোগুলির জন্য বিকেন্দ্রীকরণ বিল্ড স্ক্রিপ্ট
একটি বিল্ড অটোমেশন প্রক্রিয়ার জন্য ব্যাশ স্ক্রিপ্টিং
#!/bin/bash
# Build recipe script located alongside source code
PROJECT_DIR="$(dirname "$0")"
SOURCE_DIR="$PROJECT_DIR/source"
OUTPUT_DIR="$PROJECT_DIR/build_output"
# Ensure output directory exists
mkdir -p "$OUTPUT_DIR"
echo "Starting build process for $(basename "$PROJECT_DIR")..."
# Example build commands
gcc "$SOURCE_DIR/main.c" -o "$OUTPUT_DIR/project_executable"
if [ $? -eq 0 ]; then
echo "Build successful! Executable located in $OUTPUT_DIR"
else
echo "Build failed. Check for errors!"
exit 1
fi
পরিবেশ জুড়ে বিল্ড রেসিপি ইন্টিগ্রেশন পরীক্ষা করা
বিল্ডবট বিল্ড স্ক্রিপ্ট বৈধতার জন্য পাইথন-ভিত্তিক ইউনিট পরীক্ষা
import unittest
import subprocess
import os
class TestBuildRecipe(unittest.TestCase):
def setUp(self):
self.build_script = "./example_project/build/compile.sh"
self.output_dir = "./example_project/build_output"
def test_build_script_exists(self):
self.assertTrue(os.path.exists(self.build_script), "Build script is missing!")
def test_build_execution(self):
result = subprocess.run([self.build_script], capture_output=True, text=True)
self.assertEqual(result.returncode, 0, "Build script failed!")
self.assertTrue(os.path.exists(f"{self.output_dir}/project_executable"), "Output executable missing!")
if __name__ == "__main__":
unittest.main()
বিকেন্দ্রীভূত রেসিপিগুলির সাথে বিল্ডবট নমনীয়তা বৃদ্ধি করা
সোর্স কোডের পাশাপাশি বিল্ডবট বিল্ড রেসিপি অন্তর্ভুক্ত করার একটি প্রধান সুবিধা হল উন্নয়ন কর্মপ্রবাহে বর্ধিত নমনীয়তা। প্রথাগতভাবে, কেন্দ্রীভূত বিল্ড কনফিগারেশনের জন্য যখনই একটি প্রকল্প বিকশিত হয় বা একটি নতুন শাখার উদ্ভব হয় তখনই ব্যাপক পরিবর্তনের প্রয়োজন হয়। প্রজেক্টে সরাসরি বিল্ড রেসিপি এম্বেড করে, প্রতিটি শাখা বা মডিউল তার নিজস্ব নির্দিষ্ট রেসিপি বজায় রাখতে পারে। এটি বিকাশকারীদেরকে আরও গতিশীল এবং অভিযোজনযোগ্য পরিবেশ তৈরি করে অন্যান্য প্রকল্প বা শাখাকে প্রভাবিত না করে বিল্ড পদক্ষেপগুলি কাস্টমাইজ করতে দেয়।
আরেকটি মূল দিক হল সংস্করণ নিয়ন্ত্রণ একীকরণ। যখন বিল্ড রেসিপিগুলি সোর্স কোডের পাশাপাশি লাইভ থাকে, তখন সেগুলি স্বয়ংক্রিয়ভাবে গিট-এর মতো সংস্করণ নিয়ন্ত্রণ ব্যবস্থা দ্বারা ট্র্যাক করা হয়। এটি নিশ্চিত করে যে বিল্ড কনফিগারেশন-এর যেকোনো আপডেট কোডবেসের পরিবর্তনের সাথে সিঙ্ক্রোনাইজ করা হয়েছে। উদাহরণস্বরূপ, যদি একজন বিকাশকারী একটি প্রকল্পে একটি নতুন লাইব্রেরি যোগ করে, তারা অবিলম্বে প্রয়োজনীয় সংকলন ফ্ল্যাগগুলি অন্তর্ভুক্ত করতে বিল্ড স্ক্রিপ্ট আপডেট করতে পারে। এই টাইট ইন্টিগ্রেশন অমিল কনফিগারেশনের কারণে সৃষ্ট ত্রুটিগুলি হ্রাস করে এবং কিছু ভুল হলে রোলব্যাকগুলিকে সহজ করে তোলে। ⚙️
অবশেষে, প্রকল্প-নির্দিষ্ট রেসিপি থাকা মাল্টি-ডেভেলপার দলগুলির মধ্যে সহযোগিতাকে সহজ করে। উদাহরণস্বরূপ, একটি জটিল শাখায় কাজ করা একজন বিকাশকারী সেই শাখার প্রয়োজনীয়তা অনুসারে একটি বিল্ড স্ক্রিপ্ট তৈরি করতে পারেন। যখন অন্য দলের সদস্য শাখাটি চেক আউট করেন, তখন তাদের বিল্ড রেসিপিতে অবিলম্বে অ্যাক্সেস থাকে, কীভাবে প্রকল্পটি তৈরি করা যায় সে সম্পর্কে বিভ্রান্তি এড়িয়ে যায়। সময়ের সাথে সাথে, এই পদ্ধতিটি ধারাবাহিকতা বৃদ্ধি করে, কেন্দ্রীভূত ডকুমেন্টেশনের উপর নির্ভরশীলতা হ্রাস করে এবং নতুন অবদানকারীদের জন্য অনবোর্ডিং প্রক্রিয়াকে সুগম করে। 🚀
- সোর্স কোডের পাশাপাশি রেসিপি তৈরি করা উচিত কেন?
- সোর্স কোডের পাশাপাশি বিল্ড রেসিপিগুলি সনাক্ত করা সংস্করণ নিয়ন্ত্রণের সাথে সিঙ্ক্রোনাইজেশন নিশ্চিত করে, বিভ্রান্তি হ্রাস করে এবং কেন্দ্রীভূত কনফিগারেশন পরিবর্তন না করে শাখা-নির্দিষ্ট বিল্ডগুলির জন্য অনুমতি দেয়।
- আমি কিভাবে একটি প্রকল্পের মধ্যে একটি বিল্ডবট রেসিপি অন্তর্ভুক্ত করব?
- আপনি আপনার বিল্ড স্ক্রিপ্টগুলিকে একটি ফোল্ডারে সংরক্ষণ করতে পারেন বা , তারপর বিল্ডবট ব্যবহার করে তাদের উল্লেখ করুন বিল্ড পাইপলাইনের অংশ হিসাবে তাদের চালানো।
- এই পদ্ধতি কি Git এর মত সংস্করণ নিয়ন্ত্রণ সিস্টেমের সাথে কাজ করে?
- হ্যাঁ, যখন রেসিপিগুলি কোডের পাশাপাশি এম্বেড করা হয়, সংস্করণ নিয়ন্ত্রণ সরঞ্জামগুলি পছন্দ করে স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি ট্র্যাক করুন। স্ক্রিপ্ট তৈরি করার জন্য যেকোনো আপডেট প্রকল্পের ইতিহাসের সাথে সিঙ্কে থাকে।
- বিল্ডবটের সাথে একীভূত করার আগে আমি কীভাবে আমার বিল্ড স্ক্রিপ্টগুলি পরীক্ষা করতে পারি?
- আপনি যেমন স্বতন্ত্র সরঞ্জাম ব্যবহার করতে পারেন ম্যানুয়াল টেস্টিং বা পাইথনের জন্য বিল্ডবটের সাথে সংহত করার আগে স্থানীয়ভাবে স্ক্রিপ্ট এক্সিকিউশন বৈধ করার পদ্ধতি।
- আমি কি বিভিন্ন শাখার জন্য প্রকল্প-নির্দিষ্ট বিল্ড রেসিপি ব্যবহার করতে পারি?
- একেবারেই! আপনি প্রতিটি শাখার জন্য পৃথক রেসিপি তৈরি করতে পারেন, এটি নিশ্চিত করে যে প্রকল্পের প্রতিটি সংস্করণের জন্য অনন্য প্রয়োজনীয়তাগুলি বিরোধ ছাড়াই সঠিকভাবে পরিচালিত হয়।
- নির্বাহের সময় বিল্ড স্ক্রিপ্ট ব্যর্থ হলে কী হবে?
- বিল্ডবট ব্যর্থ পদক্ষেপগুলির জন্য লগ এবং ত্রুটির আউটপুট সরবরাহ করে। আপনি যেমন কমান্ড অন্তর্ভুক্ত করতে পারেন বা প্রক্রিয়া বন্ধ করতে এবং অবিলম্বে সমস্যাগুলি হাইলাইট করতে।
- আমি কিভাবে প্রকল্প ডিরেক্টরিতে স্ক্রিপ্ট তৈরি করতে পারি?
- এর মতো ডেডিকেটেড ফোল্ডার তৈরি করা একটি ভালো অভ্যাস বা বিল্ড রেসিপি সংরক্ষণ করতে. এটি আপনার প্রকল্পকে সংগঠিত রাখে এবং বজায় রাখা সহজ।
- বিকেন্দ্রীভূত রেসিপি কি বড় প্রকল্পের জন্য মাপযোগ্য?
- হ্যাঁ, বিকেন্দ্রীভূত রেসিপিগুলি বড় প্রকল্পগুলির জন্য বিশেষভাবে কার্যকর। দলগুলি অন্যান্য শাখায় হস্তক্ষেপ না করে বা কনফিগারেশন তৈরি না করে তাদের মডিউলগুলিতে স্বাধীনভাবে কাজ করতে পারে।
- আমি কিভাবে বিল্ড স্ক্রিপ্টের জন্য পরীক্ষা স্বয়ংক্রিয় করব?
- আপনি ব্যবহার করে ইউনিট পরীক্ষা লিখতে পারেন পাইথন বা স্ক্রিপ্টগুলিতে যা সফল সংকলন এবং আউটপুট ফাইলগুলিকে যাচাই করে, সবকিছু আশানুরূপ কাজ করে তা নিশ্চিত করে।
- রেসিপি পরিচালনার জন্য বিল্ডবটের পাশাপাশি কোন সরঞ্জামগুলি সবচেয়ে ভাল কাজ করে?
- টুলের মত সংস্করণ নিয়ন্ত্রণ এবং স্ক্রিপ্টিং ভাষার জন্য বা দক্ষতার সাথে বিল্ড রেসিপিগুলি পরিচালনা, যাচাইকরণ এবং কার্যকর করতে বিল্ডবটের সাথে নির্বিঘ্নে কাজ করুন।
বিকেন্দ্রীভূত রেসিপিগুলির সাথে স্ট্রীমলাইনিং তৈরি করে
সোর্স কোডের পাশাপাশি বিল্ডবট রেসিপিগুলিকে একীভূত করা প্রকল্পের সংগঠন এবং সহযোগিতার উন্নতি করে৷ প্রতিটি শাখা তার অনন্য বিল্ড স্ক্রিপ্ট বজায় রাখতে পারে, কেন্দ্রীয় কনফিগারেশনের উপর বিভ্রান্তি এবং নির্ভরতা হ্রাস করে। বিকাশকারীরা অন্যদের ব্যাহত না করে ওয়ার্কফ্লো কাস্টমাইজ করতে পারে।
এই পদ্ধতিটি সংস্করণ নিয়ন্ত্রণের সাথে নিরবচ্ছিন্ন একীকরণ নিশ্চিত করে, কারণ বিল্ড রেসিপিগুলি প্রকল্পের জীবনচক্রের সাথে বিকশিত হয়। বিল্ডবট-এর মতো অটোমেশন টুলের সাথে মডুলার বিল্ড স্ক্রিপ্টগুলিকে একত্রিত করার মাধ্যমে, দলগুলি ক্লিনার, মাপযোগ্য এবং আরও দক্ষ বিল্ডগুলি অর্জন করে - শেষ পর্যন্ত উত্পাদনশীলতা বৃদ্ধি করে৷ 🛠️
- অফিসিয়াল বিল্ডবট ডকুমেন্টেশন: বিল্ডবট বিল্ড কনফিগার এবং পরিচালনার উপর ব্যাপক গাইড। বিল্ডবট অফিসিয়াল সাইট
- গিটহাব বিল্ডবট রিপোজিটরি: বিল্ডবট কনফিগারেশনের জন্য উদাহরণ এবং ওপেন সোর্স অবদান। বিল্ডবট গিটহাব রিপোজিটরি
- পাইথন সাবপ্রসেস মডিউল ডকুমেন্টেশন: কমান্ড চালানোর জন্য সাবপ্রসেস ব্যবহার করার বিস্তারিত রেফারেন্স। পাইথন সাবপ্রসেস
- GNU মেক এবং GCC ডকুমেন্টেশন: বিভিন্ন পরিবেশে সোর্স কোড কম্পাইল এবং বিল্ড করার জন্য টুল। GNU তৈরি করুন | জিসিসি কম্পাইলার