সংস্করণ নিয়ন্ত্রণ ব্যবস্থা, এবং বিশেষ করে Git হল কোড পরিবর্তনগুলি ট্র্যাক করার জন্য, আপনার দলের সাথে সহযোগিতা করার জন্য এবং আপনার কোডবেসের স্থিতিশীলতা নিশ্চিত করার জন্য প্রয়োজনীয় সরঞ্জাম। যদিও গিট প্রাথমিকভাবে সোর্স কোডের জন্য ডিজাইন করা হয়েছে, আপনি এটিকে সংস্করণ নিয়ন্ত্রণ এবং স্কিমা পরিবর্তন পরিচালনার জন্য MySQL ডাটাবেসের সংমিশ্রণে ব্যবহার করতে পারেন।
এই নিবন্ধে, আমরা গাইড ফরম্যাটে নির্দিষ্ট উদাহরণ সহ গিট হুক ব্যবহার করে সংস্করণ নিয়ন্ত্রণের জন্য মাইএসকিউএল-এর সাথে গিটকে কীভাবে সংহত করতে পারি তা অন্বেষণ করব। তালিকায় দেওয়া সমস্ত স্ক্রিপ্ট সম্পূর্ণরূপে কার্যকরী এবং সম্পূর্ণ। আপনি আপনার পরীক্ষার পরিবেশে তাদের ক্রমানুসারে পুনরুত্পাদন করতে পারেন।
প্রথমত, আসুন একটি পরীক্ষা ডাটাবেস এবং ব্যবহারকারী তৈরি করি:
create database testdb_remote; create user 'user_remote'@'localhost' identified WITH mysql_native_password by 'remote123'; grant all on testdb_remote.* to 'user_remote'@'localhost';
পরবর্তী, আমরা একটি দূরবর্তী সংগ্রহস্থল তৈরি করব। এটি যেকোনো দূরবর্তী সার্ভারে একটি সংগ্রহস্থল হতে পারে, তবে সরলতার জন্য, আমরা এটি স্থানীয়ভাবে তৈরি করব। কমান্ড কার্যকর করার সুবিধার জন্য, আমি গিট ব্যাশ ব্যবহার করি। আমার স্থানীয় মেশিনে ইতিমধ্যে একটি গিট ফোল্ডার রয়েছে, তাই আমি এটি ব্যবহার করি:
cd /c/git mkdir testdb.remote cd testdb.remote git init --bare
এবং দূরবর্তী একটি ক্লোন হিসাবে একটি স্থানীয় সংগ্রহস্থল তৈরি করুন:
cd /c/git git clone /c/git/testdb.remote testdb.local cd testdb.local git ls-files
সংগ্রহস্থলে কোন ফাইল নেই; চলুন একটি তৈরি করি এবং রিমোট রেপোতে আমাদের পরিবর্তনগুলি ঠেলে দেওয়া যাক:
echo "Test DB repo" > readme.md git status git add . git commit -m "1st commit" git push
চলুন দূরবর্তী সংগ্রহস্থলের বিষয়বস্তু পরীক্ষা করা যাক:
cd /c/git/testdb.remote git ls-tree --full-tree -r HEAD
রিমোট রিপোজিটরিতে একটি হুক ফোল্ডার রয়েছে, যেখানে উদাহরণ সহ বেশ কয়েকটি ফাইল রয়েছে:
ls -1 /c/git/testdb.remote/hooks
হুক হল স্ক্রিপ্ট যা নির্দিষ্ট ঘটনা ঘটলে কার্যকর করা হয়। গিটের ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড হুক রয়েছে। ক্লায়েন্ট-সাইড হুকগুলি কমিট করা এবং মার্জ করার মতো ক্রিয়াকলাপ দ্বারা ট্রিগার হয়। সার্ভার-সাইড হুকগুলি নেটওয়ার্ক ক্রিয়াকলাপে চালিত হয় যেমন পুশড কমিট গ্রহণ করা। হুকগুলি এখানে বিস্তারিতভাবে বর্ণনা করা হয়েছে। যুক্তি বাস্তবায়নের জন্য বিভিন্ন বিকল্প আছে; আমি পোস্ট-রিসিভ সার্ভার-সাইড হুক ব্যবহার করার একটি উদাহরণ দেব।
হুক ফোল্ডারে, আমাদের "পোস্ট-রিসিভ" নামে একটি ফাইল তৈরি করতে হবে, এটি একটি নিয়মিত ব্যাশ স্ক্রিপ্ট:
#!/bin/sh while read oval nval ref do echo List of files changed in the commit: git diff --name-only $oval $nval done
উপরের স্ক্রিপ্টটি সার্ভারে কার্যকর করা হবে যখনই একটি পুশ সফলভাবে সম্পন্ন হবে এবং পরিবর্তিত ফাইলগুলির একটি তালিকা আউটপুট করবে। আসুন readme.md এ একটি লাইন যোগ করে এবং রিমোট রিপোজিটরিতে পরিবর্তনগুলি পুশ করে এটি কীভাবে কাজ করে তা পরীক্ষা করে দেখি:
cd /c/git/testdb.local echo "New line" >> readme.md git add . git commit -m "Line added" git push
আপনি দেখতে পাচ্ছেন যে গিট পুশ কমান্ড চালানোর সময়, আউটপুটে এখন remote:
- এটি সার্ভারে কার্যকর করা পোস্ট-রিসিভ স্ক্রিপ্টের আউটপুট।
মৌলিক পরিবর্তনের কথা বললে, ফাইল যোগ করা, পরিবর্তন করা এবং মুছে ফেলা যায়। ডাটাবেসে এই পরিবর্তনগুলি কীভাবে প্রয়োগ করবেন তার জন্য আপনি বিভিন্ন পন্থা নিতে পারেন:
অনুমান করুন আপনি দ্বিতীয় বিকল্পটি বেছে নিয়েছেন, তাই আপনাকে যে ফাইলগুলি যোগ করা হয়েছে বা পরিবর্তন করা হয়েছে তা কার্যকর করতে হবে। পরামিতি যোগ করে আমরা এখানে বর্ণিত ফাইলগুলিকে ফিল্টার করতে পারি --diff-filter=AM
:
#!/bin/sh while read oval nval ref do echo List of files added or changed in the commit: git diff --name-only --diff-filter=AM $oval $nval done
কয়েকটি ফাইল যোগ করুন, এবং পুনরায় readme.md পরিবর্তন করুন:
echo "SELECT 1;" > test1.sql echo "SELECT 2;" > test2.sql echo "SELECT 3;" > test3.sql echo "New line 2" >> readme.md git add . git commit -m "New files" git push
হুক স্ক্রিপ্টের আউটপুটে 4টি ফাইল রয়েছে:
আমরা test1.sql এবং readme.md ফাইলগুলি সম্পাদনা করি, test2.sql মুছে ফেলি এবং অন্য একটি ফাইল যোগ করি:
echo "SELECT 11;" > test1.sql echo "New line 2" >> readme.md rm test2.sql echo "SELECT 4;" > test4.sql git add . git commit -m "Modify, remove and add" git push
শুধুমাত্র সংশোধিত এবং যোগ করা ফাইলগুলি প্রদর্শিত হয়:
আমাদের লক্ষ্য হল প্রতিটি সফল পুশের পরে এসকিউএল স্ক্রিপ্টগুলি চালানো, তাই আমাদের শুধুমাত্র এই ধরনের ফাইলগুলিকে ফিল্টার করতে হবে; আমাদের ক্ষেত্রে, আমরা প্রয়োজনীয়তা সেট করব যে তাদের সকলের অবশ্যই ".sql" এক্সটেনশন থাকতে হবে। ফিল্টার করতে, git diff
কমান্ডে প্যারামিটার -- "*.sql"
যোগ করুন:
#!/bin/sh while read oval nval ref do echo List of files added or changed in the commit: git diff --name-only --diff-filter=AM $oval $nval -- "*.sql" done
স্ক্রিপ্টগুলি চালানোর জন্য, আমাদের অবশ্যই ডাটাবেসের সাথে সংযোগ করতে সক্ষম হতে হবে। এর জন্য, আমরা শংসাপত্র তৈরি করব এবং সংযোগ পরীক্ষা করব:
mysql_config_editor set --login-path=testdb_remote --host=localhost --port=3306 --user=user_remote --password mysql --login-path=testdb_remote --database=testdb_remote
“.sql” ফাইলগুলির মাধ্যমে পুনরাবৃত্তি করতে আমাদের স্ক্রিপ্ট পরিবর্তন করুন, প্রতিটি ফাইল চালান এবং ফলাফল পরীক্ষা করুন। প্রয়োজনীয় ক্রমে ফাইলগুলি চালানোর জন্য আমাদের তালিকা আউটপুট বাছাই করতে হবে। git show কমান্ডের সাহায্যে, আমরা SQL স্ক্রিপ্টের বিষয়বস্তু প্রদর্শন করি এবং MySQL দ্বারা কার্যকর করার জন্য পাইপের মাধ্যমে পাস করি।
পরিবর্তনশীল "$?" এসকিউএল স্ক্রিপ্ট সফলভাবে সম্পাদিত হলে 0 এবং একটি ত্রুটি থাকলে অন্য মান থাকবে:
#!/bin/sh while read oval nval ref do echo List of files added or changed in the commit: for file in $(git diff --name-only --diff-filter=AM $oval $nval -- "*.sql" | sort); do git show master:${file} | mysql --login-path=testdb_remote --database=testdb_remote echo "FILE: ${file} - result $?" done done
আরও একটি পরীক্ষা করুন - পূর্বে তৈরি করা সমস্ত ".sql" ফাইল মুছুন এবং এর জন্য স্ক্রিপ্ট তৈরি করুন:
ফাইলগুলির কাঙ্খিত এক্সিকিউশন অর্ডার নিশ্চিত করতে আমাদের প্রতিটি ফাইলের নামের সাথে একটি উপসর্গ (1_, 2_, ইত্যাদি) যুক্ত করতে হবে:
rm *.sql echo "DB Initialization" >> readme.md echo " DROP TABLE IF EXISTS customers; CREATE TABLE customers ( id int UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, PRIMARY KEY (id) ); " > 1_customers.sql echo " INSERT INTO customers (id, name) VALUES (1, 'John Doe'), (2, 'Jane Smith') AS new ON DUPLICATE KEY UPDATE customers.name = new.name; " > 2_customers_init.sql echo " DROP PROCEDURE IF EXISTS get_customer; DELIMITER $$ CREATE PROCEDURE get_customer(IN customer_id int UNSIGNED) BEGIN SELECT c.id, c.name FROM customers c WHERE c.id = customer_id; END $$ " > 3_get_customer.sql echo "SELECT FROM customers;" > 4_error_select.sql ls -1
সুতরাং আমাদের কাছে চারটি ".sql" ফাইল রয়েছে যা কার্যকর করতে হবে:
আমরা সংগ্রহস্থলে পরিবর্তন করি:
এবং আমরা দেখতে পাই যে যখন git push
করা হয়, ফাইলগুলি ক্রমানুসারে কার্যকর করা হয় এবং প্রতিটি ফাইলের এক্সিকিউশন ফলাফল (MySQL কমান্ড এক্সিট কোড) প্রদর্শিত হয়। "4_error_select.sql" ফাইলটিতে একটি সিনট্যাক্স ত্রুটি রয়েছে, তাই এটির সম্পাদনের ফলাফল হল 1।
এবং অবশেষে, আসুন আমরা ডাটাবেসে কি আছে তা পরীক্ষা করি:
mysql --login-path=testdb_remote --database=testdb_remote show tables; call get_customer(1); call get_customer(2);
আপনি দেখতে পাচ্ছেন, টেবিল এবং পদ্ধতিটি দূরবর্তী ডাটাবেসে তৈরি করা হয়েছিল। পদ্ধতিটি সফলভাবে সঞ্চালিত হয় এবং ডেটা ফেরত দেয়।
হুক স্ক্রিপ্ট আউটপুটের পঠনযোগ্যতা উন্নত করতে, আপনি MySQL CLI আউটপুট দমন করতে পারেন বা এটি একটি লগ ফাইলে পুনঃনির্দেশ করতে পারেন। এছাড়াও আপনি MySQL কমান্ড এক্সিকিউশনের ফলাফল বিশ্লেষণ করতে পারেন এবং হুক স্ক্রিপ্টে আরও যুক্তি যোগ করতে পারেন।
উদাহরণস্বরূপ, আপনি একটি পরীক্ষার ডাটাবেসে SQL স্ক্রিপ্টগুলি চালাতে পারেন এবং তারপরে এটিতে কিছু পরীক্ষা চালাতে পারেন (যেমন আমি এখানে বর্ণনা করেছি)। পরীক্ষা ডাটাবেসে পরীক্ষা সফলভাবে সম্পন্ন হলে, উৎপাদন ডাটাবেসে SQL স্ক্রিপ্ট চালান এবং সম্ভবত এটিতে কিছু পরীক্ষাও চালান।
প্রতিটি ধাপের ফলাফল বিশ্লেষণ করে, আপনি যেকোনো কনফিগারেশনের পাইপলাইন তৈরি করতে পারেন।
অবশ্যই, প্রতিটি পদ্ধতির বেশ কয়েকটি সুবিধা এবং সীমাবদ্ধতা রয়েছে। দ্বিতীয় পদ্ধতির সাথে, স্ক্রিপ্টগুলি যে ক্রমানুসারে কার্যকর করা হয় তা নিশ্চিত করা প্রয়োজন কারণ আমরা উদাহরণ স্বরূপ, এটি তৈরি না হওয়া পর্যন্ত একটি টেবিলে ডেটা সন্নিবেশ করতে পারি না। এটি নিশ্চিত করাও প্রয়োজন যে আপনি স্ক্রিপ্টগুলি পুনরায় কার্যকর করতে পারেন, অর্থাৎ, যখন তৈরি করা বস্তুটি ইতিমধ্যেই ডাটাবেসে থাকে, বা ডেটাবেসে ইতিমধ্যেই যোগ করার জন্য ডেটা রয়েছে তখন সঠিকভাবে পরিস্থিতি পরিচালনা করতে পারেন৷
একটি সংস্করণ সিস্টেম ব্যবহার করার সময়, বিকাশ প্রক্রিয়াটি একটু বেশি জটিল হয়ে ওঠে কারণ এটি একটি পূর্বনির্ধারিত বিন্যাসের স্ক্রিপ্টগুলিতে অতিরিক্ত পরিবর্তনগুলিকে আনুষ্ঠানিক করার প্রয়োজন। যাইহোক, আপনি একটি ইনস্টলেশন ফাইল ব্যবহার করে কিছু নমনীয়তা অর্জন করতে পারেন।
বর্ণিত কৌশলটির প্রধান সুবিধা হ'ল ডাটাবেসে সংস্করণের বাস্তবায়ন খুব কম প্রচেষ্টার সাথে, সেইসাথে CI/CD পাইপলাইনগুলি বাস্তবায়নের ক্ষমতা।
এটি আপনার জন্য উপযোগী হতে পারে কিনা তা মূল্যায়ন করতে, আপনি নিজেকে জিজ্ঞাসা করে শুরু করতে পারেন: আপনি কত ঘন ঘন প্রডাকশনে সরাসরি কোড লেখেন?