ফ্লাটারে গিটহাব একশনস এর ব্যবহার — এপিকে বিল্ডকে অটোমেট করা

ভূমিকা

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

(এই আর্টিকেলের মূল ফোকাস গিটহাব একশনস এর ব্যবহার। কাজেই ফ্লাটার ও গিটের প্রাথমিক ধারণা থাকা কাম্য)

হাতে ময়লা লাগাই

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

এবার প্রজেক্টের জন্য গিটহাবে একটি রিপোজিটরি তৈরী করতে হবে, এরপর তারসাথে আমাদের প্রজেক্ট কানেক্ট করতে হবে যাতে আমরা আমাদের কোড পুশ করতে পারি।

কনফিগারেশন ফাইল তৈরী

ব্যস! ফ্লাটারে আমাদের কাজ শেষ। সত্যিই!

এখন আমরা মাথা ঘামাবো কনফিগারেশন ফাইল নিয়ে, যেটা অনুযায়ী আমাদের রিপোজিটরিতে পুশ(বা পুল রিকোয়েস্ট) করলে অটোমেটেড কিছু কাজ করবে।

এইধরণের কনফিগারেশন গুলো লেখা হয় yml বা yaml ফরম্যাটের ফাইলে। এই ফরম্যাটের সাথে টুকটাক পরিচয় থাকলে খুবই ভালো, না থাকলেই সমস্যা নেই, কারণ এখানে কোনো রকেট সায়েন্সের ফর্মুলা লেখা থাকবে না। এছাড়া প্রয়োজনীয় লাইনের ব্যাখ্যা তো থাকবেই।

তো শুরুতে আমাদের প্রজেক্টের একেবারে রুট ফোল্ডারে, মানে যেখানে lib/ বা অন্য ফোল্ডারগুলো রয়েছে সেখানে .github/ নামে একটা ফোল্ডার তৈরি করি, এর ভেতরে workflows/ নামে আরেকটি ফোল্ডার তৈরি করি। এখানেই আমাদের কনফিগারেশন ফাইলগুলো থাকবে। তো workflows এর ভেতরে আমরা একটা yaml ফাইল তৈরি করি, এর নাম যেকোনো কিছু হতে পারে। আমি build_automation.yaml নামে ফাইল তৈরি করলাম।

এরপর ফাইলটিতে নিচের লাইনগুলো লিখে ফেলি। তবে সতর্ক থাকতে হবে যেন ইনডেনটেশন,মানে প্রতি লাইনের শুরুর স্পেস সংখ্যার মধ্যে নিরবিচ্ছিন্নতা থাকে। yaml ফাইলে এই ইনডেনটেশন রক্ষা করতেই হবে(পাইথন এর মতো)

#1 name
name: Build APK
#2 condition
on:
push:
#3 target branch
branches:
- feature/build_automation

#4 jobs
jobs:
build:
#5
name: Build APK
#6
runs-on: ubuntu-latest

#7 necessary steps to complete the job
steps:
#8
- name: Checkout repository
uses: actions/checkout@v2
#9
- name: Set up Flutter
uses: subosito/flutter-action@v1
#10
- name: Install dependencies
run: flutter pub get
#11
- name: Build APK
run: |
flutter build apk --release
#12
- name: Upload APK artifact
uses: actions/upload-artifact@v2
with:
name: release-apk
path: build/app/outputs/flutter-apk/app-release.apk

ধীরে! এবার আমরা লাইনগুলোর অর্থ বুঝবো। যদিও name মাধ্যমে আমরা মোটামুটি বুঝে গেছি কোন লাইন কী করছে।

  • (1)আমাদের বিল্ডের একটা নাম দিলাম
  • (2)এখানে কন্ডিশন দিচ্ছি যে কখন এই অটোমেটেড প্রসেস শুরু হবে। যেমন এখানে আমরা বলছি, প্রতি কোড পুশে এই অটোমেশনটি একবার করে চলবে। কোন ব্রাঞ্চে পুশ করলে হবে, সেটাও বলে দিচ্ছি(3)। এখানে আমি feature/build_automation ব্রাঞ্চ দিয়েছি। মানে এই ব্রাঞ্চে প্রতি পুশেই একবার করে জবটি রান হবে
  • আমরা অটোমেটিকভাবে কী কী কাজ করতে চাই তার প্রতিটিই একেকটি job(4)। আমাদের ক্ষেত্রে জব একটি, তা হলো শুধু apk বিল্ড করে আপলোড করা। আমরা জবের একটি নামও দিচ্ছি(5), এবং কোন এনভায়রনমেন্টে রান হবে তাও বলে দিচ্ছি(6)। এখানে আমরা উবুন্টু ব্যবহার করছি।মানে গিটহাব একটা উবুন্টু ডেভেলপমেন্ট এনভায়রনমেন্টে বাকি স্টেপ গুলো রান করবে।

এরপরে বিভিন্ন স্টেপ বা ধাপ দেয়া আছে(8–12)। name এ এই ধাপের কী কাজ করছে তা বলে দিচ্ছি। uses মানে আগে থেকে তৈরি করা ওয়ার্কফ্লো ব্যবহার করছি আমাদের কাজ উদ্ধার করার জন্য। যেমন একবারে যদি বলে যাই, 8 এ আমরা চেক আউট করছি, 9 এ তেএকটা ফ্লাটারের ওয়ার্কফ্লো ব্যবহার করে ফ্লাটার সেটাপ করলাম, 10 এ প্রয়োজনীয় প্যাকেজ ডাউনলোড করে নিলাম, 11 তে আমরা কমান্ড দিয়ে apk তৈরি করছি। মানে এনভায়রনমেন্ট তৈরির পরে লোকালি যা যা করতাম, সেইগুলোই করছি।

এপিকে তৈরির ধাপ শেষ। এবার তা আপলোডের পালা। 12 তে আমরা এপিকে আপলোড করছি।

এবার কমিট করে বলে দেয়া নির্ধারিত ব্রাঞ্চে(যেমন এখানে feature/build_automation) পুশ করলাম।

এবার যদি আমাদের গিটহাব রিপোজিটরিতে যাই, আর তার Actions প্যানেলে ক্লিক করি, তাহলে নিচের মতো দেখতে পাবো।

আমাদের ওয়ার্কফ্লো বা জব রান করা শুরু করে দিয়েছে। আমরা যদি সেটিতে ক্লিক করি তাহলে নিচের মতো বিস্তারিত দেখতে পারবো।

এখানে দেখতে পাচ্ছি আমাদের বলে দেয়া স্টেপগুলো, আর সাথে গিটহাব কিছু বাড়তি স্টেপ রান করছে। এগুলোর প্রতিটায় ক্লিক করলে আমরা বিস্তারিত লগও দেখতে পারবো।

সব কয়টা স্টেপ ঠিকঠাক মতো শেষ হয়ে গেলে আবারও উপরে Actions ক্লিক করি,এরপর আমাদের জবে আবার ক্লিক করলে নিচের মতো দেখতে পাবো

জবটি সফলভাবে রান হয়েছে আর নিচে Artifacts এ আমরা দেখতে পাচ্ছি release-apk জেনারেট হয়েছে। এতে ক্লিক করলে একটা জিপ ফাইল ডাউনলোড হবে। সেটাকে আনজিপ করলেই আমরা এপিকে ফাইলটি পেয়ে যাবো।

আমাদের উদ্দ্যেশ্য পূরণ হয়ে গেছে। এখন থেকে কোড চেঞ্জ করে প্রতি পুশ এর পর এভাবে অটোমেটিকভাবে আমাদের এপিকে জেনারেট হয়ে যাবে।

কাস্টম এপ নেম

যদিও আমাদের আর্টিকেল এখানেই শেষ করা যায়, তবে চাইলে আমরা আরেকটু ফাইন-টিউনিং করতেই পারি। যেমন, যে এপিকেটি তৈরি হচ্ছে তার নাম কিন্তু সবসময় app-release.apk হবে। কিন্তু আমরা চাইতেই পারি যে তা অন্য কোনো নামে তৈরি হবে। এরজন্য আমাদের জবে আরেকটি নতুন স্টেপ দিতে হবে যেখানে আমরা বিল্ড হওয়া এপিকে-টির নাম চেঞ্জ করবো

name: Build APK

on:
push:
branches:
- feature/build_automation

jobs:
build:
name: Build APK
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Set up Flutter
uses: subosito/flutter-action@v1

- name: Install dependencies
run: flutter pub get

- name: Build APK
run: |
flutter build apk --release

# rename the apk artifact
- name: Rename APK artifact
run: |
mv build/app/outputs/flutter-apk/app-release.apk "app.apk"
- name: Upload APK artifact
uses: actions/upload-artifact@v2
with:
name: release-apk
# update the artifact path
path: "app.apk"

এখন কমিট করে আবার পুশ করি। আগের মতো জব কমপ্লিট হবার পরে আমরা এপিকে ডাউনলোড করলে দেখতে পারবো আমাদের দেয়া নামে তৈরি হয়েছে।

কমিট হ্যাশ দিয়ে কাস্টম নেম

বেশ ইন্টারেস্টিং, তাই না? এবার আমরা আরেক ধাপ এগিয়ে যাবো।

অনেক সময় আমরা (অন্তত আমি) এপিকে ফাইলনেমের সাথে কমিট হ্যাশের নাম্বার জুড়ে দেই, যেমন app_a75vs.apk, যাতে ফাইলনেম দেখে সহজে বোঝা যায় কোন কমিটের চেঞ্জ এখানে আছে। তো এই কমিট হ্যাশ পাওয়ার জন্য আমাদের আরেকটি ধাপ যোগ করতে হবে, এরপর আগের ধাপে এই হ্যাশ সহ রিনেম করতে হবে, এবং একদম শেষে আর্টিফ্যাক্টের পাথও একই নামে আপডেট করে দিতে হবে।

name: Build APK

on:
push:
branches:
- feature/build_automation

jobs:
build:
name: Build APK
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Set up Flutter
uses: subosito/flutter-action@v1

- name: Install dependencies
run: flutter pub get
# getting commit hash
- name: Get commit hash
id: commit_hash
run: echo "COMMIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV

- name: Build APK
run: flutter build apk --release

- name: Rename APK artifact
# notice, apk name now consists the commit has
run: |
commit_hash=$COMMIT_HASH
mv build/app/outputs/flutter-apk/app-release.apk "app_${commit_hash}.apk"

- name: Upload APK artifact
uses: actions/upload-artifact@v2
with:
name: release-apk
# artifact path must math the renamed apk
path: "app_${{ env.COMMIT_HASH }}.apk"

এবার যথারীতি আগের মতো কমিট-পুশ আর জব কমপ্লিট হবার পরে আর্টিফ্যাক্ট ডাউনলোড করলে আমরা নিচের মতো দেখতে পারবো।

এছাড়া চাইলে আরো বিভিন্নভাবে আমরা এপের নাম দিতে পারি। যেমন app_commit_hash_current_date.apk ফরম্যাটে নাম দিতে পারি। পাঠক চাইলে একটু নেট ঘাটাঘাটি করে নিজেরা চেষ্টা করে দেখতে পারেন। এটা এক্সারসাইজ হিসেবে থাকলো।

আর্টিকেলে ব্যবহৃত প্রজেক্টের শুরুর কোড পাওয়া যাবে এখানে , এক্সারসাইজের সমাধান সহ ফুল কোড পাওয়া যাবে এখানে

উপসংহার

এই আর্টিকেলে আমরা ম্যানুয়ালভাবে এপিকে তৈরি করাকে অটোমেট করেছি। গিটহাব একশন ব্যবহার করে আমরা এভাবে আরো অনেক কিছুই অটোমেট করতে পারি। যেমন এখানে যদিও আমরা এপিকে জেনারেট করছি, তবে সেটা টেস্টিং এর জন্য শেয়ার করতে গেলে আমাদের ডাউনলোড করে সেন্ড করতে হবে(যদি না আমাদের রিপোতে টেস্টারের একসেস থাকে)। তবে রিপোজটরি সাধারণত কোড রাখার জায়গা। টেস্টার সাধারণত একটা টেস্টিং এনভায়রনমেন্টে ব্যবহার করে থাকে, যেখানে নিয়মিত আপডেটেড ফাইল শেয়ার করা হয়, যেমন Firebase app distribution। এই অটোমেশন এর মাধ্যমে এপিকে তৈরির সাথে সাথে আমরা ডিস্ট্রিবিউট করতে পারি, এমনকি রিলিজও করতে পারি। পরবর্তী কোনো আর্টিকেলে হয়তো আমরা সেগুলাও দেখবো।

আজকে এই পর্যন্তই। ধৈর্য্য নিয়ে পড়ার জন্য ধন্যবাদ।

--

--