အခန်း ၁၇ :: Deployment

ကျွန်တော်တို့ အလုပ်စလုပ်ချိန်မှာ git ဟာ လူသုံးမများသေးပါဘူး။ Github မှာ 2008 မှာ စပေါ်လာပြီး 2010 မှာ လူသုံးများလာပါတယ်။ Github လူသုံးများလာတာနဲ့ အမျှ Git အကြောင်းလူတွေ သိလာကြပါတယ်။ Git နဲ့ Github ဟာ မတူပါဘူး။ Git ကို Linus Torvalds က 2005 မှာ စတင်ဖန်တီးခဲ့ပါတယ်။ အဲဒီ မတိုင်ခင်မှာ CVS ကို အသုံးပြုပါတယ်။​ CVS ကို production deployment အတွက် အသုံးမပြုပဲ code backup , version backup တွေ အတွက် အသုံးပြုကြတာများတယ်။

Git Repo

Deployment လုပ်သည့် အခါမှာ manual file တွေ ရွေ့တာကနေ Git ကို ပြောင်းလဲလာတယ်။ နောက်ပိုင်း CI/CD တွေ အသုံးပြုလာကြပါတယ်။ အခုခေတ်မှာတော့ company တိုင်း နီးပါက CI/CD ကို အသုံးပြုနေပါပြီ။ မျက်စိထဲ မြင်အောင်ပြောရရင် production branch ကို push လုပ်လိုက်တာနဲ့ တစ်ခါတည်း production ပေါ် ရောက်သွားတာမျိုးပေါ့။ CI/CD အတွက် platform ပေါ်မူတည်ပြီး script တွေ ကွာပါတယ်။ တချို့ Company တွေကတော့ Jenkins ကို self host အနေနဲ့ အသုံးပြုကြပါတယ်။ ကျွန်တော်ကတော့ Gitlab ကို အသုံးပြုပါတယ်။

ပထမဆုံး ​gitlab.com မှာ account ရှိထားဖို့ လိုပြီး project အတွက် git repo တစ်ခု ရှိထားဖို့ လိုပါတယ်။

Code တွေကို အရင် push တင်ထားလိုက်ပါ။

ကျွန်တော်တို့ သွားမည့် အဆင့်က အောက်ပါ အတိုင်းဖြစ်ပါတယ်။

အရင်ဆုံး Code တွေကို Gitlab ကို push လုပ်မယ်။ Gitlab က နေ auto deploy လုပ်ပြီး production server ပေါ်တင်ပါမယ်။

Setup Key

အရင်ဆုံး Production server ကို SSH နဲ့ ဝင်ခွင့်ရအောင် Key အသစ် ဖန်တီးပါမယ်။ Terminal မှာ

ssh-keygen

နဲ့ key အသစ်ဖန်တီးလိုက်ပါ။ Password ကို empty ထားပါ။

cat storekey.pub

ပြီးရင် public key ကို copy ကူးလိုက်ပါ။

အခု public key ကို server ရဲ့ ~/.ssh/authorized_keys ထဲမှာ ထည့်ထားပါ။

ဒါဆိုရင်

ssh [username]@[yourip] -i [your private key]

ဥပမာ

ssh root@123.123.123 -i storekey

ဒါဆိုရင် တစ်ခါတည်း server ထဲ ဝင်လို့ရသွားပါမယ်။ Key က အရေးကြီးပါတယ်။

အကောင်းဆုံးကတော့ Linux Admin က deployment အတွက် သီးသန့် user နဲ့ deployment အတွက် permission ပေးထားတာ ပိုကောင်းပါတယ်။

Private key ကို ဖွင့်ပြီး copy ကူးယူပါ။

cat [your private key]

Gitlab Repo ရဲ့ Setting > CI/CD > Variable မှာ private key ကို variable အနေဖြင့် ထည့်ပါမည်။

ပေထားသည့် variable name SSH_Production ကို နောက်ပိုင်း .gitlab-ci.yml မှာ ပြန် အသုံးပြုပါမယ်။

Readonly Account

Gitlab ရဲ့ Repo အောက်မှာ Setting > Repository > Deploy tokens မှာ read_repository တစ်ခုပဲ​ on ပြီးတော့ token generate လုပ်ပါမယ်။

Create လုပ်ပြီးသွားရင် username နဲ့ token ထွက်လာပါမယ်။​ note မှာ ဖြစ်ဖြစ် အဆင်ပြေသည့် နေရာမှာ သေချာ မှတ်ထားဖို့ လိုပါတယ်။ password က recover ပြန်မရနိုင်ပါဘူး။

အခု production server မှာ git အတွက် ရရှိလာသည့် token နဲ့ တည်ဆောက်လို့ရပါပြီ။

cd /var/www/mysample
git init

Git init ပြီးသွားရင် အခု Repo URL ကို setup လုပ်ပါမယ်။ Repo URL ကို Gitlab ကနေ https ကို အသုံးပြုဖို့ လိုပါတယ်။

git remote add origin https://[username]:[token]@[url]

[username] ကတော့ generate လုပ်ထားသည့် username ပါ။

[token] ကတော့ generate လုပ်ထာသည့် အချိန်က ရလာသည့် token ပါ။

[url] ကတော့ gitlab.com/xxxx/xxx ပါ။​ gitlab.com က copy ကူးလာသည့် url ပါ။

git pull origin master

ဆိုပြီး pull ဆွဲရင် password မလိုတော့ပဲ pull ဆွဲလို့ရနေပါပြီ။ ပုံမှန်အားဖြင့် read only ပဲ ထားပါတယ်။ server ပေါ်မှာ changes လုပ်ပြီး local မှာ changes မလုပ်ခဲ့ရင် မေ့သွားခဲ့ရင် နောက်တစ်ခါ deployment လုပ်သည့် အချိန်မှာ အကုန်ပျက်ကုန်ပါတယ်။

.gitlab-ci.yml

Project ရဲ့ အောက်မှာပဲ .gitlab-ci.yml ဆောက်ပါ။

.gitlab-ci.yml ထဲမှာ အောက်ပါ အတိုင်းထည့်လိုက်ပါ။​

image: ubuntu:latest

deploy:
  stage: deploy
  only:
    - master
  before_script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_Production")
    - mkdir -p ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

  script:
    - ssh root@[your_server_IP] "cd '[your_path]'; git pull origin master;composer install;"

[your_server_IP] က သင့်ရဲ့ server IP ပါ။

[your_path] ကတော့ သင့်ရဲ့ server ပေါ်မှာ ရှိသည့် file path ပါ။ ဥပမာ /var/www/sample/

.gitlab-ci.yml ကို update လုပ်ပြီးသွားရင် git master branch ကို commit လုပ်ပြီး ပြန် push လိုက်ပါ။

CI/CD > Pipeline မှာ run နေတာကို တွေ့ရမှာပါ။

running ကို နှိပ်လိုက်ရင် သက်ဆိုင်ရာ job ကို ရောက်သွားပြီး processing လုပ်နေတာတွေကို တွေ့ရမှာပါ။

ပြဿနာမရှိဘူး ဆိုရင် Job Success နဲ့ ပြီးသွားတာကို တွေ့နိုင်ပါတယ်။

.gitlab-ci.yml ထဲမှာ ဘာတွေ ရေးထားလဲ လေ့လာကြည့်ရအောင်။ Gitlab က CI က တကယ်တန်းတော့ docker image ပေါ်မှာ run တာပါပဲ။

image: ubuntu:latest ဆိုတာကတော့ Ubuntu နောက်ဆုံး version image ကို ယူပါမယ်။

only:
    - master

master branch ကို push လုပ်မှ script က စ အလုပ်လုပ်မယ် လို့ ကြေငြာထားတာပါ။

only:
  - tags

အကယ်၍ အပေါ်က အတိုင်း ပြောင်းရေးထားမယ် ဆိုရင်တော့ push လုပ်သည့် အထဲမှာ tags ပါလာမှသာ အလုပ်လုပ်မယ် လို့ ဆိုလိုတာပါ။

before_script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_Production")
    - mkdir -p ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

script မ run ခင်မှာ SSH key ကို docker image ထဲမှာ ထည့်ထားလိုက်တာပါ။ အပေါ်မှာ ကြေငြာထားခဲ့သည့် SSH_Production ကို သုံးထားတာ ကိုတွေ့နိုင်ပါတယ်။

script:
    - ssh root@[your_server_IP] "cd '[your_path]'; git pull origin master;composer install;"

Server ကို SSH နဲ့ ဝင်ပြီး git pull ဆွဲလိုက်တာပါ။

အကယ်၍ unit testing တွေပါ ထည့်ချင်ရင် အောက်ပါ အတိုင်း ပြင်နိုင်ပါတယ်။

stages:
  - build
  - test
  - deploy

job1:
  stage: build
  script:
    - echo "This job compiles code."

job2:
  stage: test
  script:
    - echo "This job tests the compiled code. It runs when the build stage completes."

job3:
  script:
    - echo "This job also runs in the test stage".

job4:
  stage: deploy
  script:
    - echo "This job deploys the code. It runs when the test stage completes."

Gitlab CI/CD က အရမ်းကို အသုံးဝင်ပါတယ်။ Multiple server တွေ micro services deployment တွေ docker deployment တွေ အတွက် အသုံးဝင်လှပါတယ်။