paint-brush
MySQL এর সাথে গিট হুক ব্যবহার করাদ্বারা@yuridanilov
4,711 পড়া
4,711 পড়া

MySQL এর সাথে গিট হুক ব্যবহার করা

দ্বারা Yuri Danilov7m2023/09/30
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

পরীক্ষা ডিবি তৈরি করুন গিট হুক পোস্ট রিসিভ তৈরি করুন পুশ এ এসকিউএল স্ক্রিপ্ট চালান

People Mentioned

Mention Thumbnail
featured image - MySQL এর সাথে গিট হুক ব্যবহার করা
Yuri Danilov HackerNoon profile picture
0-item
1-item

সংস্করণ নিয়ন্ত্রণ ব্যবস্থা, এবং বিশেষ করে 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: - এটি সার্ভারে কার্যকর করা পোস্ট-রিসিভ স্ক্রিপ্টের আউটপুট।

মৌলিক পরিবর্তনের কথা বললে, ফাইল যোগ করা, পরিবর্তন করা এবং মুছে ফেলা যায়। ডাটাবেসে এই পরিবর্তনগুলি কীভাবে প্রয়োগ করবেন তার জন্য আপনি বিভিন্ন পন্থা নিতে পারেন:


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


অনুমান করুন আপনি দ্বিতীয় বিকল্পটি বেছে নিয়েছেন, তাই আপনাকে যে ফাইলগুলি যোগ করা হয়েছে বা পরিবর্তন করা হয়েছে তা কার্যকর করতে হবে। পরামিতি যোগ করে আমরা এখানে বর্ণিত ফাইলগুলিকে ফিল্টার করতে পারি --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 


MySQL এর জন্য ক্রেডিট তৈরি করা


“.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 পাইপলাইনগুলি বাস্তবায়নের ক্ষমতা।

এটি আপনার জন্য উপযোগী হতে পারে কিনা তা মূল্যায়ন করতে, আপনি নিজেকে জিজ্ঞাসা করে শুরু করতে পারেন: আপনি কত ঘন ঘন প্রডাকশনে সরাসরি কোড লেখেন?