paint-brush
আপনার CI/CD ধাপে সাধারণ ডাটাবেস মাইগ্রেশন স্ক্রিপ্টদ্বারা@mindsky
7,079 পড়া
7,079 পড়া

আপনার CI/CD ধাপে সাধারণ ডাটাবেস মাইগ্রেশন স্ক্রিপ্ট

দ্বারা Aleksandr Tyryshkin6m2023/10/16
Read on Terminal Reader

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

আমি DevOps লেখার প্রতিযোগিতায় জমা দেওয়া বেশ কয়েকটিতে অনেক অসামান্য, উচ্চ-স্তরের কাজ দেখেছি। যাইহোক, প্রতিদিন কাজ করার সময় সাধারণ স্ট্যান্ডবাই (দেব, স্টেজ, প্রোড ইত্যাদি) ডেটাবেসকে কীভাবে আপ টু ডেট রাখা যায় তা খুব কম লোকই বিবেচনা করে। এই নিবন্ধটি নবজাতক বিকাশকারীদের উদ্দেশ্যে করা হয়েছে। আমি CI/CD প্রক্রিয়ায় একটি ডাটাবেস মাইগ্রেশন সিস্টেম প্রবর্তনের জন্য একটি সহজ কৌশল প্রদর্শন করার জন্য একটি উদাহরণ হিসাবে স্প্রিং ব্যবহার করেছি।
featured image - আপনার CI/CD ধাপে সাধারণ ডাটাবেস মাইগ্রেশন স্ক্রিপ্ট
Aleksandr Tyryshkin HackerNoon profile picture
0-item
1-item

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

এই স্থাপনার জন্য আমাদের Liquibase এবং GitLab CI/CD টুলের প্রয়োজন হবে। একটি ডাটাবেস আপ এবং চলমান যে মুহূর্তের জন্য অনুমান. আমি PostgreSQL ব্যবহার করব।

গিটল্যাব সিআই/সিডি

আপনার যদি ইতিমধ্যেই গিটল্যাব স্থাপন করা থাকে, আপনি এই পদক্ষেপটি সম্পূর্ণভাবে এড়িয়ে যেতে পারেন।


গিটল্যাব স্থাপন করতে, আমরা ডকার পদ্ধতি ব্যবহার করব। এটা মনে রাখা গুরুত্বপূর্ণ যে আমাদের $GITLAB_HOME ভেরিয়েবল তৈরি করতে হবে।


 sudo docker run --detach \ --hostname gitlab.devopscontest.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ee:16.4.1-ee.0


পরবর্তী ধাপ হল রানার ইনস্টল এবং কনফিগার করা।


আপনার যদি ইতিমধ্যে একটি দীর্ঘ-চলমান প্রকল্প থাকে এবং সবকিছু দীর্ঘ সময়ের জন্য সেট আপ করা হয়ে থাকে তবে আপনি একটি নতুন রানার তৈরি করা এড়িয়ে যেতে পারেন।


গিটল্যাব সিআই


আমি একটি উদাহরণ হিসাবে সংস্করণ 16.4.1 ব্যবহার করে একটি রানার তৈরি দেখাব। 17.0 এর পরে যেকোন কিছু RUNNER_AUTHENTICATION_TOKEN ব্যবহার করে রেজিস্ট্রেশনে যায়, কিন্তু পদ্ধতিটি বর্তমানের কাছাকাছি।


GitLab 17.0 এর আগে ফ্লো


GitLab 17.0 এর পরে প্রবাহ


প্রথমত, আপনাকে রানার উত্সটি ইনস্টল করতে হবে। আপনার মোতায়েন করা গিটল্যাবে ব্যাশের মাধ্যমে এটি ইনস্টল করার জন্য, এই উদাহরণটি সাহায্য করে কিভাবে আপনি অ্যাপল সিলিকন-ভিত্তিক সিস্টেমের জন্য রানার ইনস্টল করতে পারেন (অন্যান্য ওএস আপনি এখানে খুঁজে পেতে পারেন):


 # Download the binary for your system sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 # Give it permission to execute sudo chmod +x /usr/local/bin/gitlab-runner # Create a GitLab Runner user sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash # Install and run as a service sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner sudo gitlab-runner start


এখন আমরা New project runner বোতামে ক্লিক করে UI এর মাধ্যমে নিজেই রানার তৈরি করতে পারি।


নতুন রানার তৈরি করুন


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


রানার তৈরি করার পর


Create runner ক্লিক করার পর, আপনার রানারকে রেজিস্টার করাই বাকি আছে।


 # Command to register runner gitlab-runner register --url https://gitlab.devopscontest.com/ --registration-token glrt-bjyfCR5pM5wypQDdfSqU


লিকুইবেস

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


আমি আপনাকে একটি স্প্রিং অ্যাপ্লিকেশনে মাইগ্রেশন করার একটি উপায় দেখাব। এটি প্রয়োজনীয় যাতে আপনি একটি পৃথক পদক্ষেপ হিসাবে সমস্ত পরিবর্তন সেটের সম্পাদন নিয়ন্ত্রণ করতে পারেন।

প্রকল্প

দ্রুত একটি বসন্ত অ্যাপ্লিকেশন বিকাশ করতে, এখানে যান


স্প্রিং ইনিশিয়ালাইজার


চলুন এখন দ্রুত application.yml. সক্রিয় এবং পরিবর্তন-লগ বিকল্পগুলিতে বিশেষ মনোযোগ দেওয়া উচিত। প্রথম বিকল্পটি অ্যাপ্লিকেশন স্তরে লিকুইবেসকে সক্রিয় এবং নিষ্ক্রিয় করে, যখন দ্বিতীয়টি চেঞ্জলগের পথ নির্ধারণ করে।


 server: port: 80 spring: datasource: username: ${DB_USERNAME} password: ${DB_PASSWORD} url: ${DB_HOST} liquibase: enabled: true change-log: classpath:db/changelog/db.changelog-master.xml


ভেরিয়েবল দিয়ে কি করতে হবে?

এগুলিকে গিটল্যাবে রাখা ভাল অভ্যাস, যা dev/prod স্ট্যান্ডগুলির মধ্যে অ্যাপ্লিকেশনটিকে নমনীয়ভাবে কাস্টমাইজ করতে সহায়তা করবে।


গিটল্যাবে ভেরিয়েবল


আমরা আমাদের প্রকল্পে কুবারনেটস ব্যবহার করি, এবং বিভিন্ন স্কিমের জন্য প্রি-কনফিগার করা মান ফাইলগুলি ব্যবহার করে অ্যাপ্লিকেশন তৈরি করার সময় এই প্যারামিটারগুলি অবশ্যই দলগুলি দ্বারা সেট করা উচিত।



 env: - name: SPRING_PROFILES_ACTIVE value: "dev" - name: DB_HOST value: "jdbc:postgresql://127.0.0.1:5436/your_db" - name: DB_USERNAME value: "user" - name: DB_PASSWORD value: "pass"



আসুন কাস্টমাইজেশনে ফিরে যাই। সম্পূর্ণ স্বয়ংসম্পূর্ণ অ্যাপ তৈরি করা যা এখনই স্থাপনার জন্য প্রস্তুত করা হয়, আমার মতে, একটি স্মার্ট অনুশীলন। CI/CD-এ আরও একটি স্বতন্ত্র পর্যায় তৈরি করার জন্য, আসুন একটি মাইগ্রেট ফাইল তৈরি করি। আমরা বিভিন্ন দলের জন্য বিভিন্ন টুল ব্যবহার করতে পারি, এবং আমরা এই ফাইলের সাথে মাইগ্রেশন সিস্টেমে সীমাবদ্ধ নই।


 #!/bin/sh cd /opt/app /opt/app/liquibase \ --changeLogFile=./db/changelog/changelog-master.xml \ --url="$DB_HOST" \ --username="$DB_USERNAME" \ --password="$DB_PASSWORD" \ --logLevel=info \ --headless=true \ update



সমস্ত সম্ভাব্য কমান্ড লিকুইবেস ডকুমেন্টেশনে পাওয়া যাবে। এখন আমাদের শুধুমাত্র update দরকার, যা আমাদের changelog-master.xml ফাইল থেকে বর্তমান সংস্করণে আপডেট করতে দেয়।

পরবর্তী ধাপ হল প্রকল্পের রুটে a.gitlab-ci.yml ফাইল তৈরি করা যাতে CI/CD প্রক্রিয়ার সাথে কীভাবে এগিয়ে যেতে হয় তার নির্দেশাবলী রয়েছে।


প্রথমত, আমি gitlab-ci.yml ফাইলের জন্য অন্তর্নির্মিত লিঙ্কারের দিকে দৃষ্টি আকর্ষণ করতে চাই, যা আপেক্ষিক পাথ ci/lint এ প্রকল্পে পাওয়া যাবে। কনফিগারেশন ফ্লাফ করার আগে, আমি এটি ব্যবহার করার পরামর্শ দিই। এটাও অনুমান করা হয় যে আপনি YAML ফাইলগুলির সাথে কীভাবে কাজ করবেন তা জানেন।

পর্যায় এবং কাজ

 stages: - publish - dev .migrate: stage: publish allow_failure: true script: - ./migrate.sh Migrate: tags: - migration extends: .migrate environment: name: dev

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


ত্রুটি সহ ব্যবস্থা প্রত্যাখ্যান

সেটিংস মার্জ অনুরোধ


স্থাপনা পদ্ধতিতে কিছু ভুল হলে আপনি সংশ্লিষ্ট মার্জ বন্ধ করতে পারেন। বিশেষ করে, এটি সহায়ক যদি পরীক্ষাগুলি একটি স্বাধীন পর্যায় হিসাবে CI/CD-এ একীভূত হয়। যদিও আমাদের উদাহরণে Liquibase-এর পরীক্ষা নেই, উদাহরণস্বরূপ, ভুল ফাইল পাথ প্রবেশ করানো হলে এটি ত্রুটিপূর্ণ হতে পারে।


CI/CD কনফিগার করার পরে চেকবক্সে টিক না থাকলে সমস্ত মার্জকে অনুমতি দেওয়া হবে না।


চূড়ান্ত ছোঁয়া

প্রকল্প


চলুন একটি মাইগ্রেশন ফাইল তৈরি করুন এবং এটি সক্রিয় করুন। এটি করার জন্য আমাদের একটি ইনপুট পয়েন্ট হিসাবে changelog-master.xml ফাইল তৈরি করতে হবে।


আরও নমনীয় ব্যবস্থাপনার জন্য একাধিক changelog.xml থাকা ভাল অভ্যাস। আপনি তাদের থেকে একটি চেঞ্জলগ অনুক্রম তৈরি করতে পারেন। যাইহোক, আমাদের উদাহরণে আমরা একটি সহজ উপায় ব্যবহার করব।


 <?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd"> <include file="db/changelog/changeset-202310151300-create-table.sql"/> </databaseChangeLog>


তারিখ এবং সময় ব্যবহার করে মাইগ্রেশনের নাম দেওয়া একটি ভাল অভ্যাস। যখন একটি বৃহৎ উন্নয়ন দল একই সময়ে কাজ করছে তখন এটি স্থানান্তরের বাছাই ভাঙা এড়াবে।


 --liquibase formatted sql --changeset a.tyryshkin:create-table create table if not exists table ( id bigserial primary key, name varchar(255) ); create sequence if not exists table_id_seq;


আপনি মাইগ্রেশন বর্ণনা করতে বিভিন্ন XML, YAML, বা JSON ফর্ম্যাট ব্যবহার করতে পারেন, কিন্তু SQL আমার স্বাদের জন্য পড়া সবচেয়ে সহজ।


পাইপলাইন


আমরা কার্যকর করার চেষ্টা করি এবং সবকিছু সফল হয়। আমাদের ডাটাবেস চেক করুন এবং ডাটাবেস চেঞ্জলগে এন্ট্রি দেখুন।



ডাটাবেসে সারি


উপসংহার

এই নিবন্ধে, আমরা আলোচনা করেছি কিভাবে গিটল্যাবকে নিজেকে স্থাপন করতে হয়, রানার্স ডাউনলোড এবং কনফিগার করতে হয় এবং সবচেয়ে উল্লেখযোগ্যভাবে, আপনার CI/CD প্রক্রিয়ায় একটি ডাটাবেস মাইগ্রেশন সিস্টেমকে একীভূত করতে হয়। আমি আশা করি এই নির্দেশিকাটি এই নির্দেশিকাটি কার্যকর করতে আপনাকে সহায়তা করবে।