DevOpps

22Feb

Continuous Integration of Golang with Gitlab Pipeline | পর্ব ১

কিছুদিন আগে আমাদের নতুন একটা  প্রোজেক্টের জন্য মাইক্রোসার্ভিস আর্কিটেকচার অনুসরণ করে অ্যাপ্লিকেশান বানানো শুরু করি যেখানে Docker আর DevOps একটা বড় অংশ পালন করে, জেহুতু আমরা ল্যাঙ্গুয়েজ হিসাবে Golang ব্যবহার করছিলাম ও পুরো  অ্যাপলিকেশন অনেকগুলো ছোট ছোট অংশে ভাগ করা হয়েছিল । যত সার্ভিস বাড়ছিল ততই পুরো আপ্লিকেশন সামলানো ঝামেলার হয়ে পরছিল তাই পুরো জিনিসটাকে একটা CI Circle মানে Continuous Integration Circle এ নিয়ে আসার বেবস্থা করা হয়। প্রত্যেকটা সার্ভিসের Static Binary  Docker দিয়ে Deploy করা হচ্ছিল। সুতরাং প্রত্যেকটা সার্ভিস আমাদেরকে Dockerize করা লাগবে এবং সেই Docker Container কোন জায়গায় রাখতে হবে । তাই অনেক সিধান্তর পরে আমরা ঠিক করি আমাদের Repository , Gitlab এ নিয়ে আশা হোক যাতে আমরা Gitlab এর Container Registry ব্যবহার করতে পারি ।

আমাদের এই পর্বে  লক্ষ হবে ,  Golang এর কোড Gitlab Push করা মাত্রই Gitlab আমদের Golang এর কোডকে নিয়ে একটা Static Binary তে Compile করবে আর সেখানেই ওই Binary কে নিয়ে আর একটা Micro Docker Container বানাবে এবং Gitlab এর Private Docker Registry তে Push করবে ।   

আগেই বলে নেওয়া উচিত যে এর জন্যও আমাদের একটা VPS লাগতে পারে অথবা আপনার নিজের  ল্যাপটপেও Gitlab Runner চালানো যাবে তবে কিছু সিবাবদ্ধতা আছে, তবে এসব কাজের জন্য একটা নতুন VPS হলে ভাল হয়, Minimum 1 Core 1 GB Ram. অতিরিক্ত একটা VPS কেন লাগবে সেটা একটু পরেই আলোচনা করব ।

Gitlab Pipeline নিয়ে কিছু কথা

Gitlab কিছু দিন আগে পরীক্ষামূলক ভাবে Gitlab এর Pipeline and Registry Feature চালু করে অর্থাৎ Gitlab এখন আমাদের কোডকে শুধু সংরক্ষণই না Build করে দেখতে পারবে কোন ভুল আছে কি না (TDD! এবং আমরা আমাদের প্রত্যেকটা Private Repo এর জন্য একটা Private Docker Registry পাই যেটা Github , Docker Hub , Bitbucket বিনামূল্যে দেয় না , যদিও তাঁদের সেবা পরীক্ষামূলক তাও এটা আমাদের চাহিদা অনুযায়ী অনেক।

Gitlab Pipeline Environment চলে Docker দিয়ে । Docker কি এবং কেন আমাদের ব্যবহার করা উচিত এটা অমি আমার পুরনো আর্টিকেলে তুলে ধরার চেষ্টা করেছি।

Gitlab Pipeline এর Build চলে কিছু Shared Runner দিয়ে অর্থাৎ Gitlab নিজেরাই তাঁদের নিজেস কিছু সার্ভার দিয়ে আপনার কোড Build অথবা Test করার সুযোগ দেয়। তবে আমাদের উপরের লক্ষ টা একটু জটিল আর বর্তমানে Gitlab এর এই Shared Runner অতটা Configure করা যায় না । আরও যদি কাজটা নির্ভর করে Docker in Docker এর উপরে তাহলে নিজের একটা Server লাগবেই কারণ Gitlab Docker in Docker চালানোর জন্য যে Socket Sharing এর দরকার পরে সেটা Gitlab এর Shared Runner করা আপাতত সম্ভব না ।

জেহুতু Shared Runner আমাদের সমস্যার সমাধান করতে পারবে না তাই একটা আলাদা VPS এ আমরা আমাদের নিজেস Runner বসাব , যেটার মাদ্ধমে আমরা আমাদের সব মাইক্রোসার্ভিস Build করতে পারব ।

Stick with It

প্রথমে Gitlab Pipeline চালু করার জন্য Repo তে গিয়ে CI/CD সেকশন থেকে Pipeline চালু করে নেব আগে ।

Start Gitlab CI Pipeline

এরপর Settings > CI/CD > Runner Settings এ গেলে নিচের ছবির মত একটা জিনিস দেখতে পারব । এখানে নির্দেশনা দেওয়া আছে যে নিজের জন্যও Runner বসাতে কি করা লাগবে । এখান থেকে আমাদের শুধু একটা জিনিস লাগবে যেটা হল Registration Token যেটা আমরা নিজের VPS Runner সেটআপ করার সময় ব্যবহার করব ।

Gitlab without Runner

এখন আমাদের নিজের VPS এ ঢুকে Gilab Runner  ইন্সটল করে নেই। এটা একটা CMD Tool এর পরে এই Custom Runner কে আমাদের Gitlab Repo তে নিয়ে আসতে নিচের Conf Snippet টি Copy , Paste করব Terminal Shell এ । অবশ্যই CI_RUNNER_TOKEN এই জায়গায় আপনাদের নিজেস Register Token টকেন দিতে হবে 

Adding Custom Gitlab CI Runner

 

এটা হয়ে গেলে আমরা আমাদের Gitlab এর Runner Settings সেকশন এ Runners activated for this project গিয়ে নিচের ছবির মত একটা ছবি দেখতে পারব ।

Gitlab CI with Active Custom Runner.

এরপরে আমরা আমাদের প্রোজেক্ট এর জন্য একটা .gitlab-ci.yml ফাইল লিখব। যার মদ্ধে লিখা থাকবে Runner এর জন্য কাজটা কি হবে,

লাইন ১ঃ পুরো কাজটা করতে আমদের যা কিছু লাগবে তার জন্যও আমাদের একটা Docker Container বানানো আছে যার নাম restra/golang-docker-gitlabci এই Container এর মদ্ধে Golnag আর Docker ইন্সটল করা আছে । Golang দিয়ে আমরা আমাদের প্রোজেক্টের সোর্স কোড কম্পাইল করে Static Binary তে, আর Docker দিয়ে সেই Static Binary Dockerize করব যাতে আমরা সেটা যেকোনো মেশিনে চালাতে পারি ।

লাইন ৩২১ঃ Gitlab CI Configuration ফাইল এগুলো সম্বন্ধে Gitlab এর ওয়েবসাইট এ ভাল তথ্য পাওয়া যাবে ।

লাইন ২২ঃ glide আমাদের প্রোজেক্ট ওয়ে Dependency Manager যেটা কিনা আমাদের resta/golang-docker-gitlabci তে ইন্সটল করা আছে তাই এই কমান্ড আমরা ব্যাবহার করতে পারব। glide up আমাদের জন্য সব Dependency ইন্সটল করে নিবে যেটা কম্পিল করার সময় দরকার পরবে।

লাইন ২৩ঃ সবথেকে গুরুত্বপূর্ণ অংশ GO_ENABLED=0 GOOS=linux go build -ldflags “-s” -a -installsuffix cgo . দিয়ে আমরা আমাদের Golang প্রোজেক্টের Static Binary বানাব। 

লাইন ২৪২৮ঃ এই সব গুলো লাইন Docker কমান্ড , মূলত এই জন্যেই আমাদের Build Environment ( restra/golang-docker-gitlabci ) Docker ইন্সটল করে নিয়ে হয়েছে । এখন হয়ত কিছুটা বুঝা যাচ্ছে যে Docker in Docker কেন । লাইন ২৪ এ আমরা একটা Env variable ব্যাবহার করেছি যেটা $ACCESS_TOKEN এর মাদ্ধমে আমরা Gitlab থেকে Runner Variable পাঠাচ্ছি । 

Setting ENV Variable for Gitlab CI Runner

এখানে সাধারণ যার Repository তার Access Token লাগবে, এটা নিজের Settings > Access Token এখান থেকে গিয়ে নিয়ে নেওয়া যাবে ।

এখন যদি আমরা কোন Push করি Repo তে তাহলে CI/CD Pipeline এ আমরা দেখবও আমাদের Build শুরু হয়েছে ।

 

CI Job Started

 

 

 

Build এ ক্লিক করলে আমরা Build Log দেখতে পারব। এখানে লক্ষ করলে দেখা যাবে এটা প্রথমে আমাদের Docker Image ( restra/golang-docker-gitlabci ) ডাউনলোড করে তার পরে .gitlab-ci.yml এর দুইটা stage এ লিখা কমান্ড গুলো চালাবে আমাদের Docker Image এর মদ্ধে। সব কিছু ঠিক থাকলে আমরা নিচের ছবির মত একটা Log দেখতে পারব , যদি সেটা শেষ হয় Job succeeded দিয়ে তাহলে সব কিছু ঠিক আছে।

যদি আমরা Registry তে যাই তাহলে দেখতে পারব দুইটা Docker Container এখানে জমা হয়েছে । একটা ব্রাঞ্ছ এর নামে আর একটা latest যেমনটা .gitlab-ci.yml এ লিখা হয়েছিল।

 

Success

 

এই ৪.৭৮ মেগাবাইটের Docker Container , এটাই আমাদের একটা মাইক্রো সার্ভিস।  তবে সব কিছু এখানেই শেষ না, এর পরে হয়ত মাইক্রো সার্ভিস কিভাবে তদারকি করতে হয় এবং এর জন্য আমরা কি টুল ব্যাবহার করলে যাতে আমাদের মাইক্রো সার্ভিস প্রডাকশনে ব্যাবহারের উপযোগী হয় সেগুলো বিষয় নিয়ে আলোচনা করব ।

Links :

Gitlab Repo : https://gitlab.com/sh0umik/golang-gitlab-ci/

3Jul

ওয়েব ডেভেলপমেন্ট ও ডকার (Docker) | পিএইচপি | ওরাকল | পর্ব ২.১

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

ইউনিভার্সিটিতে আমাদের ৩য় বর্ষে ২য় সেমিস্টারে Oracle ডাটাবেস এর PL/SQL দিয়ে একটা প্রোজেক্ট করতে বলা হয়েছিল । অনেকেই অনেক ল্যাঙ্গুয়েজ পছন্দ করে , তবে বেশিভাগই PHP , JAVA , .NET etc.. এর দিকে যায় প্রোজেক্ট করার সুবিধার জন্য ।  এখানে অমি PHP & Oracle PL/SQL নিয়ে আলোচনা করব ।

শুরুতেই একটা বিষয় বলে ফেলি সেটা হল ডকারফাইল (Dockerfile) । ডকারফাইল নিয়ে বিস্তারিত আমরা পরের পর্বে দেখব , এখন শুধু মাথায় এটা রাখলেই চলবে যে ডকারফাইল হল অনেকটা Script এর মত । মানে এখানে যা কিছু লিখা থাকবে ডকার ইঞ্জিন তাই করবে । এটাকে ডকার ইঞ্জিনের ইন্সট্রাকশন বলতে পারেন । নিচে একটা  ডকারফাইল (Dockerfile) দেওয়া আছে যেখানে ধাপে ধাপে বলা আছে যে  PL/SQL দিয়ে PHP ডেভেলপমেন্ট করতে হলে আপনাকে কি কি করতে হতে পারে ।

যেহেতু অমি আরও Laravel 5 Framework ব্যবহার করেছিলাম তাই আমাকে কিছু অতিরিক্ত PHP Extension ও ইন্সটল করতে হয়েছিল ।

পুরো প্রোজেক্ট টা  Github এ দেওয়া আছে  ডাউনলোড করে  নিলে ভাল হয়  ।  ডাউনলোড করার পরে দেখবেন ফোল্ডারে Dockerfile  নামে  একটা ফাইল আছে  । এটা খুলুন ,  নীচের Script গুলো দেখতে পারবেন

পুরো জিনিসটা একটু একটু করে বুঝানোর চেষ্টা করি ,  প্রথমে,

লাইন ১ঃ   FROM php:7-apache এখানে বলা হয়েছে আমরা php এর 7 Apache ভার্সনের একটা Image দিয়ে পুরো জিনিসটা বানানো হবে । আর একটু বিস্তারিত বললে বলা যায় যে  আমরা php 7 & apache ইন্সটল করা আছে এরকম একটা ছোট্ট Image/Container ব্যবহার করব পুরো Environment টা বানানোর জন্য । অর্থাৎ ধরে নেই আমাদের PHP ইন্সটল করাই আছে ।

লাইন ৭ঃ  libaio-dev, libmcrypt-dev, git কিছু প্রয়োজনীয় Library ইন্সটল করা হচ্ছে লারাভেলের জন্য ।

লাইন ১২- ১৬ঃ  PHP Extension – pdo , mysqli , mbstring , mcrypt  ইন্সটল করা হচ্ছে যেগুলো আমাদের PHP প্রোজেক্ট ডেভেলপমেন্ট করার সময় ডাটাবেসের সাথে কানেক্ট করার সময় লাগবে ।

লাইন ২২ ও ২৫ঃ  লারাভেলের জন্য PHP Dependency Management Tool Composer ও Apache mod_rewrite Extension চালু করা হচ্ছে ।

লাইন ৩০ – ৩৬ঃ  ADD oracle/instantclient-basic-linux.x64-12.1.0.2.0.zip /tmp/ আমরা বলে দিচ্ছি যে আমাদের ডাউনলোড করা
Oracle এর instantclient SDK যেন /temp এ কপি করে তারপরে /use/local এ আনজিপ করা হয় ।

লাইন ৩৮-৩৯ঃ PHP Extension Manager PECL ইন্সটল করা হল ।  কারণ PHP তে Oracle PL/SQL কোড কম্পাইল করার জন্য oci8 lib সাপোর্ট লাগে ।

লাইন ৪১-৪৪ঃ কিছু Symlink তৈরি করা হল কারণ লাইব্রেরি ইন্সটল করার সময় এসব Symlink থাকতে হবে নয়ত oci8 lib কম্পাইল হবে না । শেষের লাইন এ oci8 lib ইন্সটল করা হল ।

উপরের লাইন গুলিতে অমি জিনিসগুলো একটু সোজা করে বোঝানোর চেষ্টা করলাম , আপনারা একটু পড়ে দেখলেই বুঝতে পারবেন । যারা Linux / Unix ব্যবহার করেন তাঁদের কাছে লাইন গুলো অপরিচিত নয় । তাঁদের বুঝতে অসুবিধা হবে না আশা করি । মুল কথা হল আপনি যেই মেশিনেই Oracle PL/SQL with PHP ডেভেলপমেন্ট করেন না কেন আপনাকে এসব সেটআপ করতে হবে বিশেষ করে Linux/Unix দের

এরপরে Docker cli দিয়ে docker build . অথবা docker build -f Dockerfile কমান্ড  লিখলেই সব ইন্টারনেট থেকে ডকার নামিয়ে কনফিগার করে একটা Image/Container বানাবে ।

 

এই সব কিছু ম্যানুয়ালি করতে গিয়ে দেখবেন অনেক যায়গায় মিলছে না , বিশেষ করে যারা নতুন করে করছেন বা আগে কখনও করেন নি , হয়ত SDK ভার্সন মিলছে না , PHP বলছে এই Extension আমরা নতুন 7 ভার্সনে সাপোর্ট করি না , এরপরে Mysqli, PDO বলছে যে ঠিকমত oci8 কম্পাইল হয়নি আবার করতে হবে ইত্যাদি ইত্যাদি ।

compile error !!

যদিও সব কিছু ঠিক থাক মত হয়ে গেল তারপরে পিসি কোন কারণে ক্রাশ করল , নয়ত বন্ধুদের মধ্যে কেউ বলল যে এবার আমার পিসিতেও করে দে !! অথবা আপনার বস বলল এই VPS এ পুরো Environment টা সেটআপ কর । তখন কি আবার থেকে করবেন ? উত্তরটা আপনি নিজেই ভাল করে জানেন ।

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

এখন কাজ শেষ হয়নি , আমরা শুধুমাত্র পিএইচপি ডেভেলপমেন্ট এনভাইরনমেন্ট সেটআপ করলাম এখন ডাটাবেসের সাথে সংযোগ বাকি !! । এটাও আমরা ডকারের মাধ্যমে করব , এখন আমরা আর Oracle এর ওয়েবসাইট থেকে 3 GB এর ফাইল ডাউনলোড করব না । আমরা ডকারহাবে খুঁজব যে Oracle Database এর কোন Container পাওয়া যায় কি না ।

sath89/oracle-xe-11g একজন একটা এর ডকার Container বানিয়েছেন , ওটা এখন আমরা ব্যাবহার করব পুরো প্রোজেক্ট টা সেটআপ করানোর জন্য । এখন এই Container টা আমরা নামিয়ে নিব ও চালু করব । এর জন্যে লিখব docker run –name oracle-db sath89/oracle-xe-11g এখন কিছুক্ষণ আগে বানানো php-oracle-container টি এর সাথে লিঙ্ক করব । কাজ কিছুটা বেড়ে গেল মনে হচ্ছে !

এবার অনেকগুলো কাজ একসাথে করতে হচ্ছে , অনেক কমান্ড , সব মনে রাখা কষ্টকর আর যারা কমান্ড লিখতে অভ্যস্থ না তাদের জন্য একটু কঠিন ।  সুতরাং সব গুলো কাজকে একসাথে করার জন্য ডকারের আর একটা টুলস আছে যার নাম Docker Compose  । এটা সাধারনত ডকারের অনেকগুলো কাজ একসাথে করে । নিচে এই প্রোজেক্টটের একটা docker-compose.yml ফাইল দেওয়া হল । এখানে সব গুলো কাজের একসাথে ইন্সট্রাকশন দেওয়া আছে , যেমন

লাইন ১ – ১১ঃ  আমরা Docker Build করার সময় যেসব স্টেপ / আর্গুমেন্ট কমান্ড হিসাবে লিখতে হয়েছিল , সেসব আর্গুমেন্ট এখানে একটা YML ফাইল সিনট্যাক্স হিসাবে লিখতে হয়েছে , প্রথমে নাম তারপর ডকার ফাইলটা কোথায় , কোন পোর্টে সার্ভিসটি রান হবে , কোন ফাইলগুলো Host to Guest এ মাউন্ট হবে , আর শেষে এর সাথে আর অন্য কোন ডকার লিঙ্ক হবে ।

লাইন ১৩ – ২০ঃ Oracle Database  এর জন্য কনফিগারেশন  , কোন Docker Image ব্যবহার করব , নামে কি হবে , পোর্ট কত আর সব শেষে কোথায় ডাটা গুলো থাকবে ।

সব শেষে শুধুমাত্র একটা কমান্ড( docker-compose build && docker-compose up ) লিখলেই সব কাজ একসাথে হবে ।

অর্থাৎ যারা নতুন করে প্রোজেক্ট সেটআপ করতে চাবে তাঁদেরকে শুধু Docker & Docker Compose ইন্সটল করতে হবে ।

© Copyright 2017 shoumik.me, All Rights Reserved