GitHub Actions භාවිතයෙන් CI/CD - පහසුවෙන් ඔබේ App එක Build කර Deploy කරමු! | GitHub Actions CI/CD SC Guide

ආයුබෝවන් කට්ටියට! කොහොමද ඉතින්? අද අපි කතා කරන්න යන්නේ අපේ Software Development වැඩේ ගොඩක්ම ලේසි කරන, ඉක්මන් කරන, ඒ වගේම අපේ ජීවිතේට සහනයක් ගේන පට්ටම ටූල් එකක් ගැන. ඒ තමයි GitHub Actions. අපි බලමු මේකෙන් CI/CD කියන කතන්දරේ කොහොමද කරන්නේ කියලා.
Software Development කරන අපි හැමෝම දන්නවා, අපි කෝඩ් ලියන එක විතරක් නෙවෙයි වැඩේ කියලා. කෝඩ් එක ලියලා, ඒක Build කරලා, ටෙස්ට් කරලා, ඊට පස්සේ ඒක සර්වර් එකකට දාන්න (Deploy කරන්න) තියෙනවා. මේ හැමදේම මැනුවලි කරන්න ගියාම වෙලාව නාස්තියක් වගේම වැරදෙන්න තියෙන ඉඩත් වැඩියි. එතකොට තමයි CI/CD කියන කන්සෙප්ට් එකයි, ඒක කරන්න උදව් වෙන GitHub Actions වගේ Tools එලියට එන්නේ.
හරි, එහෙනම් වැඩේට බහිමුද? බය වෙන්න එපා, මම මේක පුළුවන් තරම් සරලව, ඔයාලට තේරෙන විදිහට කියලා දෙන්නම්.
CI/CD කියන්නේ මොකක්ද?
මුලින්ම අපි බලමු මේ CI/CD කියන්නේ මොනවද කියලා. මේවා නිකන් ලස්සනට පේන අකුරු දෙකක් නෙවෙයි, අපේ Development Process එකට පණ දෙන දේවල්.
- CI - Continuous Integration (නිරන්තර ඒකාබද්ධ කිරීම): හිතන්න, ඔයාලා කණ්ඩායමක් විදිහට කෝඩ් ලියනවා කියලා. හැමෝම තමන්ගේ කොටස ලියලා main codebase එකට merge කරනකොට (Github එකේ නම්
git push
කරනකොට), ඒ merge කරන හැම පාරම කෝඩ් එක Auto Build වෙලා, Tests ටික Run වෙලා, කෝඩ් එකේ අවුලක් තියෙනවද කියලා බලන එක තමයි CI කියන්නේ. මේකෙන් වෙන්නේ පොඩි වැරැද්දක් උනත් ඉක්මනට අහු වෙනවා, ලොකු ප්රශ්න ඇතිවෙන්න කලින් ඒවා හදාගන්න පුදූවන් වෙනවා. හරියට ෆැක්ටරියක ප්රොඩක්ට් එකක් හදනකොට, හැම ස්ටේජ් එකේදීම ඒක හරියට හදනවද කියලා Check කරනවා වගේ වැඩක්. - CD - Continuous Delivery / Deployment (නිරන්තර බෙදා හැරීම / යෙදවීම): CI එකෙන් කෝඩ් එක OK කියලා confirm උනාට පස්සේ, ඒක Production Environment එකට Deploy කරන්න සූදානම් කරන එක තමයි Continuous Delivery. ඒ වගේම, ඒක Production එකටම Deploy කරන එක Continuous Deployment. Delivery එකේදී, Deploy කරනවද නැද්ද කියන එක තීරණය කරන්න පුළුවන්. Deployment එකේදී, හැම වෙලාවෙම කෝඩ් එක OK නම්, ඒක Auto Deploy වෙනවා. මේකෙන් වෙන්නේ Customer ට අලුත් Features ඉක්මනටම ලැබෙනවා. අපි හදන App එකේ අලුත් Version එකක් ආව ගමන් ඒක Publish වෙනවා වගේ වැඩක්.
මේ දෙක එකට තියෙනකොට වෙන්නේ, අපි කෝඩ් ලිව්වා විතරයි, ඉතුරු ටික ඔටෝ වෙනවා. ටෙස්ට් වෙනවා, Build වෙනවා, Deploy වෙනවා. සුපිරි නේද?
GitHub Actions එන්නේ කොහොමද?
CI/CD කරන්න ඕනෑ තරම් Tools තියෙනවා. Jenkins, GitLab CI/CD, CircleCI, Travis CI, වගේ ගොඩක් ඒවා. හැබැයි මේ GitHub Actions කියන්නේ GitHub එකෙන්ම දෙන සේවාවක්. මේකේ ලොකුම වාසිය තමයි අපේ කෝඩ් එක GitHub වල තියෙන නිසා, මේකත් ඒකත් එක්කම එකට වැඩ කරන්න පුළුවන් වීම.
GitHub Actions කියන්නේ අපේ Repository එකේ තියෙන Events (සිදුවීම්) වලට අනුව (උදාහරණයක් විදිහට, කෝඩ් එකක් push කරනකොට, Pull Request එකක් Open කරනකොට, Issue එකක් Close කරනකොට) Automate කරන්න පුළුවන්, custom Workflows හදන්න දෙන පහසුකමක්. මේ Workflows වලට අපිට ඕනෑම වැඩක් කරන්න පුළුවන්. කෝඩ් Build කරන්න, Test කරන්න, Docker Image එකක් හදන්න, Cloud එකට Deploy කරන්න වගේ දේවල්.
GitHub Actions වලින් ලැබෙන වාසි:
- එක තැනකින් වැඩේ කරගන්න පුළුවන්කම: අපේ කෝඩ් එකයි, CI/CD Setup එකයි දෙකම තියෙන්නේ GitHub එකේම නිසා, එහෙට මෙහෙට දුවන්න ඕනේ නෑ.
- Free Usage Limits: සාමාන්යයෙන් Personal Projects වලට සහ Small Teams වලට අවශ්ය තරම් Free Minutes දෙනවා. (Public Repos වලට නම් Unlimited, Private Repos වලට Free Minutes ගානක් දෙනවා).
- Community Actions: GitHub Marketplace එකේ ඕනෑ තරම් Community එකෙන් හදපු Actions තියෙනවා. අපිට අවශ්ය දේට හරියටම ගැලපෙන Action එකක් හොයාගන්න පුළුවන්. උදාහරණයක් විදිහට Node.js Setup කරන්න, AWS Deploy කරන්න වගේ දේවල් වලට කලින්ම හදපු Actions තියෙනවා.
- YAML සරල බව: Workflows ලියන්නේ YAML Format එකෙන්. මේක කියවන්නයි, ලියන්නයි හරිම පහසුයි.
අපිම Workflow එකක් හදමු!
දැන් අපි කතා කරපු දේවල් තේරෙනවා ඇති කියලා හිතනවා. දැන් අපි බලමු මේක ප්රායෝගිකව කොහොමද කරන්නේ කියලා. අපි හිතමු අපිට Node.js Project එකක් තියෙනවා කියලා, ඒක Build කරලා, Test කරන්න Workflow එකක් හදමු.
පියවර 1: Folder එකක් හදමු
ඔයාගේ GitHub Repository එකේ Root එකේ .github/workflows
කියන Folder Structure එක හදන්න. මේක තමයි Workflows තියෙන සම්මත තැන.
your-repo/
├── .github/
│ └── workflows/
│ └── ci.yml # මේක අපි හදන ෆයිල් එක
├── src/
└── package.json
පියවර 2: Workflow ෆයිල් එක හදමු (ci.yml)
ci.yml
කියන ෆයිල් එක ඇතුලට පහත කෝඩ් එක දාන්න. මම මේකේ හැම Line එකක්ම පැහැදිලි කරන්නම්.
name: CI Build and Test Node.js App # Workflow එකට නමක් දෙනවා
on:
push:
branches:
- main # main branch එකට push කරන හැම වෙලාවකම මේ workflow එක run වෙනවා
pull_request:
branches:
- main # main branch එකට pull request එකක් open කරනකොටත් මේක run වෙනවා
jobs:
build-and-test:
runs-on: ubuntu-latest # මේ job එක run කරන්න පාවිච්චි කරන OS එක (Virtual Machine එක).
steps:
- name: Checkout Code # GitHub repository එකේ කෝඩ් එක VM එකට ගන්නවා
uses: actions/checkout@v3 # මේක GitHub එකෙන්ම දෙන Action එකක්
- name: Setup Node.js Environment # Node.js Environment එක හදනවා
uses: actions/setup-node@v3 # මේකත් GitHub එකෙන්ම දෙන Action එකක්
with:
node-version: '16' # අපි පාවිච්චි කරන Node.js version එක
- name: Install Dependencies # Project එකේ Dependencies install කරනවා
run: npm install # NPM (Node Package Manager) එකෙන් install කරනවා
- name: Run Tests # Tests run කරනවා
run: npm test # Project එකේ tests run කරන command එක
- name: Build Project # Project එක build කරනවා (අවශ්ය නම්)
run: npm run build # Project එක build කරන command එක
මේ Workflow එකේ හැම කොටසක්ම පැහැදිලි කිරීම:
name
: මේ Workflow එකට දෙන නම. GitHub UI එකේ මේ නම පෙන්වනවා.on
: මේක තමයි Workflow එක Trigger වෙන සිදුවීම් (Events) define කරන්නේ. මේ උදාහරණයේpush
එකක් (main
branch එකට) සහpull_request
එකක් (main
branch එකට) කියන Events වලට මේක Trigger වෙනවා.jobs
: Workflow එකක් කියන්නේ එකක් හෝ කීපයක් Jobs වලින් හැදිච්ච දෙයක්. මේකේදී අපිbuild-and-test
කියන Job එක හදලා තියෙනවා.runs-on
: මේ Job එක run වෙන්න ඕන Virtual Machine (Runner) එකේ OS එක.ubuntu-latest
,windows-latest
,macos-latest
වගේ options තියෙනවා.steps
: Job එකක් ඇතුලත එකින් එකට run වෙන කාර්යයන් (Tasks) තමයි Steps කියන්නේ.name
: Step එකට දෙන නම.uses
: මේකෙන් කරන්නේ කලින් හදලා තියෙන Action එකක් පාවිච්චි කරන එක. (actions/checkout@v3
කියන්නේ GitHub එකේ Repository එක VM එකට ගන්න Action එක.actions/setup-node@v3
කියන්නේ Node.js Install කරන්න පාවිච්චි කරන Action එක.)with
: Action එකට අවශ්ය වෙන Settings (Arguments) මෙතනින් දෙනවා.run
: මේකෙන් කරන්නේ Command Line එකේ Command එකක් Run කරන එක. (npm install
,npm test
,npm run build
වගේ).
පියවර 3: GitHub එකට Push කරලා බලමු
මේ ci.yml
ෆයිල් එක ඔයාගේ Repository එකට එකතු කරලා GitHub එකට push කරන්න. main
branch එකට push කරාම (හෝ Pull Request එකක් open කරාම) GitHub Actions එකේ "Actions" tab එකට ගිහින් බලන්න. ඔයාගේ Workflow එක Auto Run වෙනවා දකින්න පුළුවන්. ඒක හරියටම ඉවර උනාම, "build and test" කියන Job එක සාර්ථකයි කියලා දකින්න පුළුවන්.
මේක තවදුරටත් CD එකට හරවන්න, ඔයාගේ Build එක සාර්ථක උනාට පස්සේ, Deploy කරන Step එකක් අලුතින් එකතු කරන්න පුළුවන්. උදාහරණයක් විදිහට, AWS S3 bucket එකකට Build කරපු Files ටික Upload කරන්න පුළුවන්, නැත්නම් Heroku වගේ Platform එකකට deploy කරන්න පුළුවන්. ඒකටත් ඒ ඒ Services වලට අදාල Actions තියෙනවා.
ටිකක් ඇඩ්වාන්ස් වෙමු! (Tips and Tricks)
දැන් ඔයාලට CI/CD workflow එකක් කොහොමද හදන්නේ කියලා පොඩි අදහසක් ආවා ඇති. අපි බලමු තව මොනවාද අපිට මේ GitHub Actions වලින් කරන්න පුළුවන් කියලා.
- Secrets භාවිතය: අපි Deploy කරනකොට API Keys, Passwords වගේ sensitive data පාවිච්චි කරන්න වෙනවා. මේවා Workflow ෆයිල් එකේ කෙලින්ම දාන්නේ නැතුව GitHub Repository Secrets විදිහට Save කරලා තියාගන්න පුළුවන්.
${{ secrets.MY_API_KEY }}
වගේ විදිහට Workflow එක ඇතුලට ගන්න පුළුවන්. මේවා Logs වලවත් පෙන්නන්නේ නෑ, ගොඩක් ආරක්ෂාකාරීයි. - Caching Dependencies:
npm install
වගේ Commands Run කරනකොට Dependencies Download කරන්න ටිකක් වෙලා යනවා. මේවා Cache කරලා තිබ්බොත්, ඊලඟ වතාවේ workflow එක run වෙනකොට ඒක ගොඩක් ඉක්මන් වෙනවා. මේකටactions/cache@v3
කියන Action එක පාවිච්චි කරන්න පුළුවන්.
Conditional Steps: සමහර Steps run වෙන්න ඕනේ විශේෂ කොන්දේසි යටතේ විතරයි නම්, if
condition එකක් පාවිච්චි කරන්න පුළුවන්. උදාහරණයක් විදිහට, main
branch එකට push කරොත් විතරක් Deploy කරන්න වගේ.
- name: Deploy to Production
if: github.ref == 'refs/heads/main' # main branch එකට විතරක් deploy කරන්න
run: # Your deployment command here
Matrix Builds: ඔයාගේ Application එක Node.js versions කීපයක හෝ වෙනත් OS කීපයක Test කරන්න ඕන නම්, Matrix Strategy එකක් පාවිච්චි කරන්න පුළුවන්. එක Workflow එකක් Run කරනකොටම එක එක Configurations වලට අදාලව Jobs කීපයක් Parallel run කරන්න පුළුවන්.
jobs:
build-and-test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['14', '16', '18'] # මේ versions තුනටම test වෙනවා
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm test
මේවා තවදුරටත් ඉගෙන ගන්න පුළුවන් advanced concepts. GitHub Actions Documentation එකේ මේ හැමදෙයක්ම හොඳට explain කරලා තියෙනවා.
නිගමනය
ඔන්න ඉතින් අපි කතා කලා CI/CD කියන්නේ මොකක්ද කියලා, ඒ වගේම GitHub Actions පාවිච්චි කරලා කොහොමද ඒක අපේ Projects වලට අරන් එන්නේ කියලා. මේකෙන් ඔයාලගේ Development Process එකේ Manual Labour එක ගොඩක් අඩු වෙනවා වගේම, Quality එක වැඩි වෙනවා. ඉක්මනටම Production එකට Code එක Deploy කරන්න පුළුවන්.
මතක තියාගන්න, Software Development කියන්නේ හැමදාම අලුත් දේවල් ඉගෙන ගන්න තියෙන ක්ෂේත්රයක්. මේ වගේ Automation Tools පාවිච්චි කරන එක අද කාලේ අත්යවශ්ය දෙයක්. මේක හරිම ලේසියි, ටිකක් පුරුදු උනාම වැඩේ ගොඩක්ම ඉක්මන් කරනවා.
ඉතින්, මේ Post එකෙන් ඔයාලට අලුත් දෙයක් ඉගෙන ගන්න ලැබුණා නම්, අනිවාර්යයෙන්ම ඔයාලගේ Project එකකට මේ GitHub Actions Workflow එකක් හදලා බලන්න. මොකද, තියරියට වඩා ප්රැක්ටිකල් විදිහට කරනකොට තමයි මේ දේවල් හරිම විදිහට තේරෙන්නේ.
ප්රශ්න තියෙනවා නම්, මේ Post එකට කමෙන්ට් එකක් දාන්න. මම පුළුවන් විදිහට උදව් කරන්නම්. ඒ වගේම, ඔයාලා මේ වගේ තවත් මොන වගේ මාතෘකා ගැනද දැනගන්න කැමති කියලත් කියන්න. එහෙනම්, තවත් අලුත් Post එකකින් හමුවෙමු! ගිහින් එන්නම්!